YBTOJ:炮塔攻击(网络流)

题目描述

小明最近在玩一款很好玩的游戏,游戏规则是这样的:

有一个n∗mn*mnm的地图,地图上的每一个位置要么是空地,要么是炮塔,要么是一些敌人,小明需要操纵炮塔攻击敌人。

攻击方法是:对于每个炮塔,游戏系统已经给出它可以瞄准的方向(上、下、左、右其中一个),小明需要选择它的攻击位置,每一个炮塔只能够攻击一个位置,炮塔只能够向着它的瞄准方向上的某个位置发动攻击,当然炮塔也可以不进行攻击。炮塔威力强大,它可以且仅可以消灭目标位置上所有敌人。

出于安全考虑,游戏系统已经保证不存在一个炮塔能够瞄准另外一个炮塔,即对于任意一个炮塔,它所有可能的攻击位置上不存在另外一个炮塔。而且,如果把炮塔的起点和终点称为炮弹的运行轨迹,那么系统不允许两条轨迹相交(包括起点和终点)。

现在,选定目标位置以后,每一个炮塔同时开炮,你要告诉小明,他最多可以干掉多少敌人。

解析

这题的关键还是在建图上
先求出每个炮塔能打到的最大值,加在一起设为tot
然后考虑冲突的情况
由于炮塔互相达不到,因此冲突一定是横向与竖向的冲突
把每个点割成横点和竖点两个点,横点向竖点连一条inf的边
然后对与每个横向炮塔,连一条s到炮塔的inf的边
然后从这个炮塔一直往炮弹方向相邻地连边,边权为 (炮塔达到的最大值) - (边的起点格子的权值)
竖向炮塔同理,连向t点,边的方向全反过来balabala…
这样不合法的情况就会使s与t联通
考虑割掉一条(i,j)(i,j)(i,j)(i,j+1)(i,j+1)(i,j+1)的边,含义就是对应的炮塔改为攻击(i,j)(i,j)(i,j)的敌人,并损失相应的代价
最后的答案就是 tot-最小割

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5050;
const int M=1e9;
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m,s,t;
struct node{int to,nxt;ll cap;
}p[3000500];
int fi[N],cnt;
void addline(int x,int y,ll cap){p[++cnt]=(node){y,fi[x],cap};fi[x]=cnt;p[++cnt]=(node){x,fi[y],0};fi[y]=cnt;
}
int col[N],cur[N];
queue<int>q;
int bfs(){memset(col,0,sizeof(col));col[s]=1;q.push(s);while(!q.empty()){int now=q.front();q.pop();for(int i=cur[now]=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(col[to]||!p[i].cap) continue;col[to]=col[now]+1;q.push(to);}}return col[t];
}
ll dfs(int x,ll lim){if(x==t||!lim) return lim;ll res=0;for(int &i=cur[x];~i;i=p[i].nxt){int to=p[i].to;if(!p[i].cap||col[to]!=col[x]+1) continue;ll add=dfs(to,min(lim,p[i].cap));lim-=add;res+=add;p[i].cap-=add;p[i^1].cap+=add;if(!lim) break;}if(lim) col[x]=-1;return res;
}
ll dinic(){ll res=0;while(bfs()){while(ll tmp=dfs(s,2e15)) res+=tmp;}return res;
}
int vis[N];
void find1(int x){if(vis[x]) return;vis[x]=1;for(int i=fi[x];~i;i=p[i].nxt){if(!p[i].cap) continue;find1(p[i].to);}return;
}
void find2(int x){if(vis[x]) return;vis[x]=2;for(int i=fi[x];~i;i=p[i].nxt){if(!p[i^1].cap) continue;find2(p[i].to);}return;
}
#define id(x,y) ((x-1)*m+y)
int num,x,tot;
int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1};
inline bool exi(int x,int y){return x>=1&&x<=n&&y>=1&&y<=m;
}
int a[55][55],mx[2505];
struct tower{int x,y,op;int mx,xx,yy;
}o[2505];
#define heng(x,y) ((x-1)*m+y)
#define shu(x,y) ((x-1)*m+y+n*m)
int main(){memset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){x=read();if(x>=0) a[i][j]=x;else{x=-x;o[++num]=(tower){i,j,x,0,i,j};}}}//printf("ok");for(int i=1;i<=num;i++){int x=o[i].x,y=o[i].y,op=o[i].op;while(x>=1&&x<=n&&y>=1&&y<=m){x+=dx[op];y+=dy[op];if(a[x][y]>o[i].mx){o[i].mx=a[x][y];o[i].xx=x;o[i].yy=y;}}tot+=o[i].mx;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) addline(heng(i,j),shu(i,j),2e15);}s=2*n*m+1;t=s+1;for(int i=1;i<=num;i++){int x=o[i].x,y=o[i].y,op=o[i].op;int xx=o[i].xx,yy=o[i].yy,mx=o[i].mx;//a[x][y]=2e9;if(op<=2){addline(shu(x,y),t,2e15);while(xx!=x||yy!=y){//	printf("(%d %d)->(%d %d) len=%d\n",xx,yy,xx-dx[op],yy-dy[op],a[xx-dx[op]][yy-dy[op]]);addline(shu(xx,yy),shu(xx-dx[op],yy-dy[op]),mx-a[xx-dx[op]][yy-dy[op]]);xx-=dx[op];yy-=dy[op];}}else{addline(s,heng(x,y),2e15);while(x!=xx||y!=yy){//	printf("(%d %d)->(%d %d) len=%d\n",x,y,x+dx[op],y+dy[op],a[x][y]);addline(heng(x,y),heng(x+dx[op],y+dy[op]),mx-a[x][y]);x+=dx[op];y+=dy[op];}}}printf("%d\n",tot-dinic());return 0;
}
/*
3 2 1 3
1 2 10
2 3 10
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[CQOI]九连环(FFT优化+高精)

文章目录题目题解code题目 九连环是一种源于中国的传统智力游戏。 如图所示&#xff0c;九个的圆环套在一把“剑”上&#xff0c;并且互相牵连。游戏的目标是把九个圆环全部从“剑”上卸下。 圆环的装卸需要遵守两个规则 1&#xff0e;第一个&#xff08;最右边&#xff09;环…

牛客挑战赛53G-同源数组(Easy Version)【NTT】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11193/G 题目大意 给出nnn个长度为mmm的数组&#xff0c;然后你每次可以进行差分&#xff08;不会改变数组长度那种&#xff09;和前缀和。 如果两个数组可以在模998244353998244353998244353意义下操作成同一个数组&…

莫比乌斯反演 做题记录

来自Peterwuyihong 的题单。 前置知识 前置芝士1 数论分块 UVA11526 H(n) P2261 [CQOI2007]余数求和 P2260 [清华集训2012]模积和 其中有一个式子需要注意一下&#xff1a;\[\sum_{i1}^n\sum_{j1}^m\left\lfloor\dfrac{n}{i}\right\rfloor\left\lfloor\dfrac{m}{i}\right\rfloo…

Three Bags CodeForces - 1467C

题意&#xff1a; 三堆石子&#xff0c;你可以取两堆石子各一个石头a,b。然后消掉a&#xff0c;使得bb-a再放入b的那一堆。这样操作直到只剩下一个石子&#xff0c;求该石子价值最大。 题解&#xff1a; 构造题 可以构造出两者情况&#xff1a; 其中两堆都是正的&#xff0…

任正非公开信:投入 20 亿美元全面提升华为软件质量

昨天&#xff0c;华为心声社区发布了来自任正非的公开信《全面提升软件工程能力与实践&#xff0c;打造可信的高质量产品》&#xff0c;信中强调从基础代码做起&#xff0c;全面提升华为软件工程能力和实践&#xff0c;其中提到一些重要举措&#xff0c;包括编码质量、架构设计…

YBTOJ洛谷P2223:软件开发(费用流)

文章目录题目描述解析代码题目描述 某软件公司正在规划一项nnn天的软件开发计划&#xff0c;根据开发计划第iii天需要nin_ini​个软件开发人员&#xff0c;为了提高软件开发人员的效率&#xff0c;公司给软件人员提供了很多的服务&#xff0c;其中一项服务就是要为每个开发人员…

高维前缀和

高维前缀和 主要内容 昨天(\(\texttt{2022.2.28}\))打 ARC 的 D 题时&#xff0c;恍然发现我不会高维前缀和&#xff0c;匆匆来学一下。 比如二维前缀和 \(s_{i,j}\) 表示在一个二维平面上从 \((1,1)\) 到 \((i,j)\) 的所有点的权值之和&#xff0c;我们定义高维前缀和 \(s_{p_…

P3577-[POI2014]TUR-Tourism【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3577 题目大意 给出nnn个点mmm条边的一张图&#xff0c;每个点有费用CiC_iCi​&#xff0c;求选出费用和最小的点使得每个点都至少有一个相邻的点&#xff08;或自己&#xff09;被选择。保证图上不存在超过101010个点的简单…

[指数型生成函数专练]chocolate,红色病毒问题,排列组合,字串数

文章目录T1&#xff1a;chocolate题目题解codeT2&#xff1a;“红色病毒”问题题目题解codeT3&#xff1a;排列组合题目题解codeT4&#xff1a;字串数题解codeT1&#xff1a;chocolate 题目 已帮大家翻译了&#xff0c;不要去UVA或者luogu上面交&#xff0c;卡精度&#xff0…

微服务之:从零搭建ocelot网关和consul集群

介绍微服务中有关键的几项技术&#xff0c;其中网关和服务服务发现&#xff0c;服务注册相辅相成。首先解释几个本次教程中需要的术语网关 Gateway&#xff08;API GW / API 网关&#xff09;&#xff0c;顾名思义&#xff0c;是企业 IT 在系统边界上提供给外部访问内部接口服务…

一起开心寒假训练总复习

文章目录畅通工程题意&#xff1a;题解&#xff1a;代码&#xff1a;小希的迷宫题解&#xff1a;代码&#xff1a;Express Mail Taking题意&#xff1a;题解&#xff1a;代码&#xff1a;Reports题意&#xff1a;题解&#xff1a;代码&#xff1a;放苹果题意&#xff1a;题解&a…

YBTOJ:放置棋子(费用流)

文章目录题目描述解析代码题目描述 有一个n*n的棋盘&#xff0c;可以在上面放棋子。 有些格子不能放棋子&#xff0c;有些格子必须放棋子&#xff0c;剩下的格子随意。 要求放好棋子之后满足如下两条要求&#xff1a; 第 i 行和第 i 列的棋子数目必须一样多。 第 i 行的棋子数…

Prufer 序列

Prufer 序列 定义与建立 Prufer 序列可以将一个带标号 \(n\) 个结点的树用 \([1,n]\) 中的 \(n-2\) 个整数表示。一个无向带标号生成树与数列之间的双射。 对于一棵树&#xff0c;每次我们选择它编号最小的叶子结点&#xff0c;删除它并记录下与它相连的节点的编号&#xff0c;…

CF476D-Dreamoon and Sets【结论】

正题 题目链接:https://www.luogu.com.cn/problem/CF476D 题目大意 求nnn个四元组使得 所有四元组内没有重复的数。四元组内的数字两两之间gcdgcdgcd都为kkk。 要求使得最大的数字最小 1≤n≤10000,1≤k≤1001\leq n\leq 10000,1\leq k\leq 1001≤n≤10000,1≤k≤100 解题思…

使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试

0. 简要介绍WRK 是一款轻量且易用的 HTTP 压力测试工具&#xff0c;通过该工具我们可以方便地对我们所开发的 WebAPI 项目进行压力测试&#xff0c;并且针对测试的情况返回结果。PS&#xff1a;Wrk 并不能针对测试的结果生成动态的图表&#xff0c;如果有这种需要&#xff0c;可…

Codeforces Round #696

Codeforces Round #696 文章目录CF1474A Puzzle From the Future题意&#xff1a;题解&#xff1a;代码&#xff1a;CF1474B Different Divisors题意&#xff1a;题解&#xff1a;代码&#xff1a;CF1474C Array Destruction题意&#xff1a;题解&#xff1a;代码&#xff1a;C…

YBTOJ洛谷P4068:数字配对(网络流)

文章目录题目描述解析代码题目描述 有n种数字&#xff0c;第 i 种数字是 ai&#xff0c;有 bi个&#xff0c;权值是 ci。 若两个数字 ai,aj 满足&#xff0c; ai 是 aj 的倍数&#xff0c;且 ai/aj 是一个质数&#xff0c;那么这两个数字可以配对&#xff0c;并获得 ci*cj 的…

Comet OJ(Contest #14)-飞翔的小鸟【tarjan】

正题 题目链接:https://www.cometoj.com/contest/73/problem/E?problem_id4124 题目大意 给出nnn个点mmm条边的一张有向图&#xff0c;边有边权&#xff0c;qqq次询问从点111走到点xxx的所有路径&#xff08;可以重复经过任何点包括点xxx&#xff09;中极差最大是多少。 1≤…

[TJOI2019]唱、跳、rap和篮球(指数型生成函数+NTT+卷积)

文章目录题目题解code1&#xff08;NTT&#xff09;code2&#xff08;EGF卷积&#xff09;题目 大中锋的学院要组织学生参观博物馆&#xff0c;要求学生们在博物馆中排成一队进行参观。他的同学可以分为四类&#xff1a;一部分最喜欢唱、一部分最喜欢跳、一部分最喜欢rap&…

数数题(计数类 DP)做题记录

数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当&#xff1a;所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和。 完全图点数为 \(n\)&#xff0c;边权 \(\in[1,k]\)&#xff0c;\(1\le n,k\le 250\)。 发现所有和 \(1\)…