题面描述:尽可能多的放置符合要求的炸弹。

分析:

在i,j处放置炸弹,则在第i行,上一个硬石头之后,下一个硬石头之前,第j列,上一个硬石头之后,下一个硬石头之前,不能再次放置炸弹。

首先,这个题,一看很显然就是一道网络流的题面。

那么,我们可以这样想,硬石头与硬石头之间建立二分图,而如何建立呢?

假设在i,j处放炸弹,那么,一定是在第i行上一个硬石头之后,那么我们可以建一条边,从源点连向第i行上一个硬石头,流量为1。

那么为了保证j列同样满足性质,则可以建立一个边,从第j列上一个硬石头连向汇点,流量同样为1。

同时,为了保证i,j同时被选择,则可以将第i行的上一个硬石头连向第j列的上一个硬石头,流量为1。

那么这样可以保证题面要求的性质么?答案是肯定的。因为如果i,j的上一个硬石头间存在一个可以放置的点,那么就一定被选择,而如果存在多个,则只能选择一个,根据贪心,之后反悔的原则,可以将答案求出。

之后跑一遍dinic就可以了

代码附上:

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <queue>
  7. #include <iostream>
  8. using namespace std;
  9. #define N 10005
  10. #define maxn 1000000000
  11. #define lson l,m,tr[rt].ls
  12. #define rson m+1,r,tr[rt].rs
  13. struct node
  14. {
  15. int ls,rs,siz;
  16. }tr[N*400];
  17. int rot[N*400],n,Q,nx,ny,rx[N],ry[N],cnt,v[N];
  18. char s[N];
  19. void insert(int x,int l,int r,int &rt,int v,int c)
  20. {
  21. if(!rt)rt=++cnt;
  22. if(l==r)
  23. {
  24. tr[rt].siz=tr[x].siz+c;
  25. return ;
  26. }
  27. int m=(l+r)>>1;
  28. if(v<=m)tr[rt].rs=tr[x].rs,insert(tr[x].ls,lson,v,c);
  29. else tr[rt].ls=tr[x].ls,insert(tr[x].rs,rson,v,c);
  30. tr[rt].siz=tr[tr[rt].ls].siz+tr[tr[rt].rs].siz;
  31. }
  32. int query(int l,int r,int k)
  33. {
  34. if(l==r)return l;
  35. int m=(l+r)>>1,sizls=0;
  36. for(int i=1;i<=nx;i++)sizls-=tr[tr[rx[i]].ls].siz;
  37. for(int i=1;i<=ny;i++)sizls+=tr[tr[ry[i]].ls].siz;
  38. if(k<=sizls)
  39. {
  40. for(int i=1;i<=nx;i++)rx[i]=tr[rx[i]].ls;
  41. for(int i=1;i<=ny;i++)ry[i]=tr[ry[i]].ls;
  42. return query(l,m,k);
  43. }else
  44. {
  45. for(int i=1;i<=nx;i++)rx[i]=tr[rx[i]].rs;
  46. for(int i=1;i<=ny;i++)ry[i]=tr[ry[i]].rs;
  47. return query(m+1,r,k-sizls);
  48. }
  49. }
  50. int main()
  51. {
  52. scanf("%d%d",&n,&Q);
  53. for(int i=1;i<=n;i++)
  54. {
  55. scanf("%d",&v[i]);
  56. for(int j=i;j<=n;j+=(j&(-j)))insert(rot[j],0,maxn,rot[j],v[i],1);
  57. }
  58. while(Q--)
  59. {
  60. int x,y,z;
  61. scanf("%s%d%d",s,&x,&y);
  62. if(s[0]=='C')
  63. {
  64. for(int i=x;i<=n;i+=(i&(-i)))insert(rot[i],0,maxn,rot[i],v[x],-1);
  65. v[x]=y;
  66. for(int j=x;j<=n;j+=(j&(-j)))insert(rot[j],0,maxn,rot[j],v[x],1);
  67. }else
  68. {
  69. scanf("%d",&z);
  70. nx=ny=0;
  71. for(int j=x-1;j;j-=(j&(-j)))
  72. {
  73. rx[++nx]=rot[j];
  74. }
  75. for(int j=y;j;j-=(j&(-j)))
  76. {
  77. ry[++ny]=rot[j];
  78. }
  79. printf("%d\n",query(0,maxn,z));
  80. }
  81. }
  82. return 0;
  83. }

  

BZOJ4554: [Tjoi2016&Heoi2016]游戏 luoguP2825 loj2057的更多相关文章

  1. [BZOJ4554][TJOI2016&&HEOI2016]游戏(匈牙利)

    4554: [Tjoi2016&Heoi2016]游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 857  Solved: 506[Sub ...

  2. bzoj4554: [Tjoi2016&Heoi2016]游戏 二分图匹配

    4554: [Tjoi2016&Heoi2016]游戏 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能 ...

  3. BZOJ4554 - [TJOI2016&HEOI2016]游戏

    原题链接 Description 给出一个的地图,地图上有空地.软石头和硬石头.求在这张地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到.炸弹能炸到的范围是该炸弹所在的一行和一列,炸弹的威 ...

  4. bzoj4554: [Tjoi2016&Heoi2016]游戏(二分图匹配)

    4554: [Tjoi2016&Heoi2016]游戏 题目:传送门 题解: 一道很牛逼的匈牙利..和之前模拟赛的一道题有点相似(不过这题不用完美匹配) 我们可以把连续的行和列全部编号(如果之 ...

  5. BZOJ4554: [Tjoi2016&Heoi2016]游戏

    Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能炸到对手,或者躲开对手的炸弹.在玩游戏的过程中,小H想到了这样一 ...

  6. 【BZOJ4554】[Tjoi2016&Heoi2016]游戏 二分图最大匹配

    [BZOJ4554][Tjoi2016&Heoi2016]游戏 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 ...

  7. BZOJ_4554_[Tjoi2016&Heoi2016]游戏_二分图匹配

    BZOJ_4554_[Tjoi2016&Heoi2016]游戏_二分图匹配 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若 ...

  8. BZOJ 4554: [Tjoi2016&Heoi2016]游戏 二分图匹配

    4554: [Tjoi2016&Heoi2016]游戏 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4554 Descripti ...

  9. 【bzoj4554】[Tjoi2016&Heoi2016]游戏

    现在问题有硬石头和软石头的限制 所以要对地图进行预处理 分行做,把有#隔开的*(x)形成联通块的存储下来. 分列作,把有#隔开的*(x)形成联通块的存储下来. 求出所有的行联通个数和列联通个数 作为二 ...

随机推荐

  1. Ubuntu 14.10下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)

    Ubuntu 14.10下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具) 最近因为项目关系,收朋友之托,想制作秀场网站,但是因为之前一直没有涉及到这 ...

  2. 解决vue在ios或android中用webview打开H5链接时#号后面的参数被忽略问题angular同样适用

    在ios或android如果直接用webview在打开H5链接例如: 打开:http://localhost:8080/#/answer?id=1509335039582001 会变成 http:// ...

  3. Django rest framework(6)----序列化

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  4. 学习AD、DA的体会

    AD转换器的转换是指模拟信号输入转化为数字信号输出,而DA转换器是把数字信号转换为模拟信号,在ADC0832.TLC549和TLC5615程序设计中,通过使用中断服务函数每0.5s对ADC0832进行 ...

  5. Python:怎样用线程将任务并行化?

    如果待处理任务满足: 可拆分,即任务可以被拆分为多个子任务,或任务是多个相同的任务的集合: 任务不是CPU密集型的,如任务涉及到较多IO操作(如文件读取和网络数据处理) 则使用多线程将任务并行运行,能 ...

  6. 微信小程序-统一下单、微信支付(Java后台)

    1.首先分享 微信统一下单接口: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1   微信接口 签名 对比网址: https: ...

  7. MyISAM和InnoDB的索引实现

    在 MySQL 中,主要有四种类型的索引,分别为: B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引.我们主要分析B-Tree 索引. B-Tree 索引是 MyS ...

  8. jmeter接口测试报java.net.SocketException: Socket closed错误。

    如题,jmeter报出java.net.SocketException: Socket closed,我查询了下,服务器是正常的,可以返回数据,基本确定问题出在我这边jmeter.查询原因,看到有人说 ...

  9. 节流throttle和防抖debounce

    underscore.js提供了很多很有用的函数,今天想说说其中的两个.这两个函数都用于限制函数的执行. debounce 在解释这个函数前,我们先从一个例子看下这个函数的使用场景.假设我们网站有个搜 ...

  10. springcloud(十):服务网关zuul(转)

    前面的文章我们介绍了,Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散,Spring Cloud Config服务集群配置中心,似乎一个 ...