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

本文共 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

你可能感兴趣的文章
OO第一次总结博客
查看>>
day7
查看>>
iphone移动端踩坑
查看>>
vs无法加载项目
查看>>
Beanutils基本用法
查看>>
玉伯的一道课后题题解(关于 IEEE 754 双精度浮点型精度损失)
查看>>
《BI那点儿事》数据流转换——百分比抽样、行抽样
查看>>
哈希(1) hash的基本知识回顾
查看>>
Leetcode 6——ZigZag Conversion
查看>>
dockerfile_nginx+PHP+mongo数据库_完美搭建
查看>>
Http协议的学习
查看>>
【转】轻松记住大端小端的含义(附对大端和小端的解释)
查看>>
设计模式那点事读书笔记(3)----建造者模式
查看>>
ActiveMQ学习笔记(1)----初识ActiveMQ
查看>>
Java与算法之(2) - 快速排序
查看>>
Windows之IOCP
查看>>
WebSocket & websockets
查看>>
openssl 升级
查看>>
ASP.NET MVC:通过 FileResult 向 浏览器 发送文件
查看>>
CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
查看>>