Description

有一个 n × m 的地图, 地图上的每一个位置可以是空地, 炮塔或是敌人. 你需要操纵炮塔消灭敌人.
对于每个炮塔都有一个它可以瞄准的方向, 你需要在它的瞄准方向上确定一个它的攻击位置,当然也可以不进行攻击. 一旦一个位置被攻击, 则在这个位置上的所有敌人都会被消灭.
保证对于任意一个炮塔, 它所有可能的攻击位置上不存在另外一个炮塔.
定义炮弹的运行轨迹为炮弹的起点和终点覆盖的区域. 你需要求出一种方案, 使得没有两条炮弹轨迹相交.

Input

第一行两个整数 n,m.
接下来 n 行, 每行 m 个整数, 0 表示空地, −1,−2,−3,−4 分别表示瞄准上下左右的炮塔, 正整
数 p 表示表示此位置有 p 个敌人.

Output

一行一个整数表示答案.

Sample Input

输入1:

3 2
0 9
-4 3
0 -1

输入2:

4 5
0 0 -2 0 0
-4 0 5 4 0
0 -4 3 0 6
9 0 0 -1 0

Sample Output

输出1:

9

输出2:

12

Data Constraint

对于前 20% 的数据, n,m ≤ 5;
对于另 20% 的数据, 朝向上下的炮塔至多有 2 个;
对于另 20% 的数据, 至多有 6 个炮塔;
对于 100% 的数据, 1 ≤ n,m ≤ 50, 每个位置的敌人数量 < 1000.

Solution

  • 博主偷懒 COPY 一波题解:(感谢 YaLi_HYJ 大佬的详细解析)


  • 这题用网络流解决问题十分巧妙,在解决相交的问题上采取了拆点的方法。

  • 最后跑一遍最小割来求得最小代价即可。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=52,M=N*N<<1,inf=1e9;
struct data
{int x,y;
}b[N*N];
int n,m,num,tot=1,p,ans,sum,s,t;
int first[M],next[M<<1],en[M<<1],w[M<<1];
int a[N][N],d[N][N],r[M],c[M];
int dis[M],gap[M],cur[M];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline void ins(int x,int y,int z)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;w[tot]=z;
}
inline void insert(int x,int y,int z)
{ins(x,y,z),ins(y,x,0);
}
int sap(int x,int y)
{if(x==t) return y;int use=0;for(int i=cur[x];i;i=next[i])if(w[i] && dis[x]==dis[en[i]]+1){cur[x]=i;int z=sap(en[i],min(w[i],y-use));w[i]-=z,w[i^1]+=z,use+=z;if(dis[s]>p || use==y) return use;}cur[x]=first[x];if(!--gap[dis[x]]) dis[s]=p+1;gap[++dis[x]]++;return use;
}
int main()
{n=read(),m=read();s=++p,t=++p;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){a[i][j]=read();if(a[i][j]<0) b[++num]=(data){i,j};int x=d[i][j]=(i-1)*m+j;r[x]=++p,c[x]=++p;insert(c[x],r[x],inf);}for(int i=1;i<=num;i++){int xx=b[i].x,yy=b[i].y,k=a[xx][yy];int x=d[xx][yy];if(k==-1 || k==-2) insert(s,c[x],inf); else insert(r[x],t,inf);if(k==-1){int mx=0,pos=0;for(int j=xx;j;j--)if(a[j][yy]>mx) mx=a[pos=j][yy];if(!mx) continue;sum+=mx;for(int j=xx;j>=pos;j--)if(j>1) insert(c[d[j][yy]],c[d[j-1][yy]],mx-(a[j][yy]<0?0:a[j][yy]));}elseif(k==-2){int mx=0,pos=0;for(int j=xx;j<=n;j++)if(a[j][yy]>mx) mx=a[pos=j][yy];if(!mx) continue;sum+=mx;for(int j=xx;j<=pos;j++)if(j<n) insert(c[d[j][yy]],c[d[j+1][yy]],mx-(a[j][yy]<0?0:a[j][yy]));}elseif(k==-3){int mx=0,pos=0;for(int j=yy;j;j--)if(a[xx][j]>mx) mx=a[xx][pos=j];if(!mx) continue;sum+=mx;for(int j=yy;j>=pos;j--)if(j>1) insert(r[d[xx][j-1]],r[d[xx][j]],mx-(a[xx][j]<0?0:a[xx][j]));}else{int mx=0,pos=0;for(int j=yy;j<=m;j++)if(a[xx][j]>mx) mx=a[xx][pos=j];if(!mx) continue;sum+=mx;for(int j=yy;j<=pos;j++)if(j<m) insert(r[d[xx][j+1]],r[d[xx][j]],mx-(a[xx][j]<0?0:a[xx][j]));}}for(int i=1;i<=p;i++) cur[i]=first[i];gap[0]=p;while(dis[s]<=p) ans+=sap(s,inf);printf("%d",sum-ans);return 0;
}

JZOJ 5602. 【NOI2018模拟3.26】Cti JZOJ 5057. 【GDSOI2017模拟4.13】炮塔相关推荐

  1. jzoj3058. 【NOIP2012模拟10.26】火炬手

    jzoj3058. [NOIP2012模拟10.26]火炬手 题目 Description Input Output Sample Input Sample Output Hint 分析 做法一 做法 ...

  2. c++ 模拟拖动_2020电工(中级)模拟考试题及电工(中级)模拟考试题库

    题库来源:安全生产模拟考试一点通公众号小程序 2020电工(中级)模拟考试题及电工(中级)模拟考试题库,包含电工(中级)模拟考试题答案解析及电工(中级)模拟考试题库练习.由安全生产模拟考试一点通公众号 ...

  3. 2021年C证(安全员)复审模拟考试及C证(安全员)作业模拟考试

    题库来源:安全生产模拟考试一点通公众号小程序 C证(安全员)复审模拟考试是由公众号安全生产模拟考试一点通提供,C证(安全员)证模拟考试题库是根据C证(安全员)最新版教材汇编出C证(安全员)仿真模拟考试 ...

  4. 2020美容师(中级)复审模拟考试及美容师(中级)模拟考试系统

    题库来源:安全生产模拟考试一点通公众号小程序 2020美容师(中级)复审模拟考试及美容师(中级)模拟考试系统,包含美容师(中级)复审模拟考试答案解析及美容师(中级)模拟考试系统练习.由安全生产模拟考试 ...

  5. 2020年焊工(高级)模拟试题及焊工(高级)模拟考试

    题库来源:安全生产模拟考试一点通公众号小程序 2020年焊工(高级)模拟试题及焊工(高级)模拟考试,包含焊工(高级)模拟试题答案和解析及焊工(高级)模拟考试练习.由安全生产模拟考试一点通公众号结合国家 ...

  6. 2020低压电工模拟考试题库及低压电工复审模拟考试

    题库来源:安全生产模拟考试一点通公众号小程序 2020低压电工模拟考试题库及低压电工复审模拟考试,包含低压电工模拟考试题库答案解析及低压电工复审模拟考试练习.由安全生产模拟考试一点通公众号结合国家低压 ...

  7. 2020熔化焊接与热切割模拟考试及熔化焊接与热切割模拟考试系统

    题库来源:安全生产模拟考试一点通公众号小程序 2020熔化焊接与热切割模拟考试及熔化焊接与热切割模拟考试系统,包含熔化焊接与热切割模拟考试答案解析及熔化焊接与热切割模拟考试系统练习.由安全生产模拟考试 ...

  8. 2021年熔化焊接与热切割模拟试题及熔化焊接与热切割模拟考试

    题库来源:安全生产模拟考试一点通公众号小程序 2021年熔化焊接与热切割模拟试题为正在备考熔化焊接与热切割操作证的学员准备的理论考试专题,每个月更新的熔化焊接与热切割模拟考试祝您顺利通过熔化焊接与热切 ...

  9. 2021年安全员-A证模拟考试及安全员-A证复审模拟考试

    题库来源:安全生产模拟考试一点通公众号小程序 安全员-A证模拟考试考前必练!安全生产模拟考试一点通每个月更新安全员-A证复审模拟考试题目及答案!多做几遍,其实通过安全员-A证考试试题很简单. 1.[多 ...

  10. 2020C证(安全员)模拟考试题库及C证(安全员)模拟考试软件

    题库来源:安全生产模拟考试一点通公众号小程序 2020C证(安全员)模拟考试题库及C证(安全员)模拟考试软件,包含C证(安全员)模拟考试题库答案解析及C证(安全员)模拟考试软件练习.由安全生产模拟考试 ...

最新文章

  1. php 超全局变量(整理)
  2. python numpy教程_Python中的Numpy入门教程
  3. 【字节网盘】九款超好看不同页面404源码
  4. Hadoop之内存问题
  5. java 计算 四分位,Java四分位计算方法
  6. 机器学习--线性回归2(共线性问题、岭回归、lasso算法)
  7. alc662声卡注入id_ALC662驱动方法AppleALC+Lilu+DSDTalc662
  8. 推荐几款php探针,PHP探针推荐:检测服务器环境好帮手
  9. Unity Behavior Designer(行为树)Abort Type(中断类型)
  10. 概率论基础(3)一维随机变量(离散型和连续型)
  11. SLT2021: CONVERSATIONAL END-TO-END TTS FOR VOICE AGENTS
  12. Caffeine Eviction策略
  13. 【产业互联网周报】阿里将暂停阿里云美国扩张计划;协同办公领域硝烟又起,华为推WeLink,企业微信与微信打通;申通全面迁至阿里云...
  14. 10亿数据找出前100大的数据(网易大数据面试算法题)
  15. 笔者支招:巧用组策略为系统减压 提高效率
  16. 求最长不下降序列:逆推法
  17. 电子商务的整合之道--思践
  18. THOMSON TG789vn 汤姆逊 tg789vn路由器配置
  19. 软件加密系统Themida常见问题集锦—Themida是否支持命令行保护?
  20. 莫非是水产品?CASS10.1.6本可以支持CAD2010-2020不同的平台

热门文章

  1. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)的理解(即c++参数初始)
  2. 操作系统内存管理——分区、页式、段式管理
  3. Keras:基于Theano和TensorFlow的深度学习库
  4. oracle行级的触发器,Oracle触发器Trigger2行级
  5. 划重点!十分钟掌握牛顿法凸优化
  6. java 时分秒比较_小学三年级数学上册《时分秒》一课一练,含答案,巩固此知识点!...
  7. Win7下快速预览各种类型的文本文件
  8. 计算机理论在实际编程中的应用之我见
  9. 框架开发与编程模式编程思想的结合
  10. leetCode刷题--两数相加