博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ4554: [Tjoi2016&Heoi2016]游戏 luoguP2825 loj2057
阅读量:6559 次
发布时间:2019-06-24

本文共 2099 字,大约阅读时间需要 6 分钟。

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

分析:

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

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

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

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

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

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

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

之后跑一遍dinic就可以了

代码附上:

#include 
#include
#include
#include
#include
#include
#include
using namespace std;#define N 10005#define maxn 1000000000#define lson l,m,tr[rt].ls#define rson m+1,r,tr[rt].rsstruct node{ int ls,rs,siz;}tr[N*400];int rot[N*400],n,Q,nx,ny,rx[N],ry[N],cnt,v[N];char s[N];void insert(int x,int l,int r,int &rt,int v,int c){ if(!rt)rt=++cnt; if(l==r) { tr[rt].siz=tr[x].siz+c; return ; } int m=(l+r)>>1; if(v<=m)tr[rt].rs=tr[x].rs,insert(tr[x].ls,lson,v,c); else tr[rt].ls=tr[x].ls,insert(tr[x].rs,rson,v,c); tr[rt].siz=tr[tr[rt].ls].siz+tr[tr[rt].rs].siz;}int query(int l,int r,int k){ if(l==r)return l; int m=(l+r)>>1,sizls=0; for(int i=1;i<=nx;i++)sizls-=tr[tr[rx[i]].ls].siz; for(int i=1;i<=ny;i++)sizls+=tr[tr[ry[i]].ls].siz; if(k<=sizls) { for(int i=1;i<=nx;i++)rx[i]=tr[rx[i]].ls; for(int i=1;i<=ny;i++)ry[i]=tr[ry[i]].ls; return query(l,m,k); }else { for(int i=1;i<=nx;i++)rx[i]=tr[rx[i]].rs; for(int i=1;i<=ny;i++)ry[i]=tr[ry[i]].rs; return query(m+1,r,k-sizls); }}int main(){ scanf("%d%d",&n,&Q); for(int i=1;i<=n;i++) { scanf("%d",&v[i]); for(int j=i;j<=n;j+=(j&(-j)))insert(rot[j],0,maxn,rot[j],v[i],1); } while(Q--) { int x,y,z; scanf("%s%d%d",s,&x,&y); if(s[0]=='C') { for(int i=x;i<=n;i+=(i&(-i)))insert(rot[i],0,maxn,rot[i],v[x],-1); v[x]=y; for(int j=x;j<=n;j+=(j&(-j)))insert(rot[j],0,maxn,rot[j],v[x],1); }else { scanf("%d",&z); nx=ny=0; for(int j=x-1;j;j-=(j&(-j))) { rx[++nx]=rot[j]; } for(int j=y;j;j-=(j&(-j))) { ry[++ny]=rot[j]; } printf("%d\n",query(0,maxn,z)); } } return 0;}

  

转载于:https://www.cnblogs.com/Winniechen/p/8980931.html

你可能感兴趣的文章
第三十六天
查看>>
Python __元组
查看>>
【BZOJ2159】Crash的文明世界
查看>>
Jmeter,数据库压力测试
查看>>
我的前端工具集(四)树状结构前篇
查看>>
optional的使用
查看>>
列表 字典 元组 集合
查看>>
统计字符
查看>>
Android 测试 Appium、Robotium、monkey等框架或者工具对比
查看>>
文件夹路径映射 / 映射虚拟目录
查看>>
开发记录03
查看>>
第四次作业:个人项目-小学四则运算 “软件”之初版
查看>>
控件联动(三级联动)
查看>>
shell编程学习
查看>>
点击qq、点击邮箱01
查看>>
limit分页优化
查看>>
时间处理总结(三)javascript与WCF
查看>>
构建之法笔记4
查看>>
腾讯1面
查看>>
安装Microsoft oneDrive(原skyDrive)
查看>>