12.20成都联考题解
2017-12-20 19:55
267 查看
糖果镇
考虑n=2的情况,发现只要枚举在哪个点下去就可以了
同样的,对于n=3的数据,枚举第二行从哪里下第三行,暂时假设答案ans就是第二行的1~i和第三行的i~n,那么选第一行,对答案的影响为sum1,i−sum2,i,将这个值模p后插入一棵平衡树里,枚举断点时找出p-1-ans的前驱作为当前更新即可
代码如下:
#include<algorithm> #include<cstring> #include<ctype.h> #include<cstdio> #define N 100050 #define INF 2147483647 using namespace std; typedef long long LL; inline int read(){ int x=0,f=1;char c; do c=getchar(),f=c=='-'?-1:f; while(!isdigit(c)); do x=(x<<3)+(x<<1)+c-'0',c=getchar(); while(isdigit(c)); return x*f; } int n,m,p; int a[5] ; LL sum[5] ,f [5],ans; struct Node{ int siz,cnt,x,pri; Node *ch[2]; Node(int); inline int cmp(int k){ if(k==x) return -1; return k<x?0:1; } inline void maintain(){ siz=ch[0]->siz+ch[1]->siz+cnt; } }*null,*root; Node::Node(int _):x(_){ pri=rand(); siz=cnt=1; ch[0]=ch[1]=null; } inline void Rotate(Node *&x,int d){ Node *k=x->ch[d^1]; x->ch[d^1]=k->ch[d]; k->ch[d]=x; x->maintain();k->maintain(); x=k; } void Insert(Node *&x,int k){ if(x==null){ x=new Node(k); return; } int d=x->cmp(k); if(!~d){ x->cnt++;x->siz++; } else{ Insert(x->ch[d],k);x->maintain(); if(x->pri > x->ch[d]->pri) Rotate(x,d^1); } } int Lower(Node *x,int k){ if(x==null) return -INF; if(x->x>k) return Lower(x->ch[0],k); return max(x->x,Lower(x->ch[1],k)); } int main(){ m=read();n=read();p=read(); memset(sum,0,sizeof sum); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ a[i][j]=read(); sum[i][j]=sum[i][j-1]+a[i][j]; } if(n==2){ ans=0; for(int i=1;i<=m;i++) ans=max(ans,(sum[1][i]+sum[2][m]-sum[2][i-1])%p); printf("%lld",ans); return 0; } if(n==3){ null=new Node(-1); null->ch[1]=null->ch[0]=null; null->siz=null->cnt=0; root=null; for(int i=1;i<=m;i++){ Insert(root,(sum[1][i]-sum[2][i-1])%p); int t=p-1-(sum[2][i]+sum[3][m]-sum[3][i-1])%p; int k=Lower(root,t); if(k==-INF) k=0; ans=max(ans,(sum[2][i]+sum[3][m]-sum[3][i-1])%p+k); } printf("%lld",ans); } return 0; }
游戏
经典模型,最小点权覆盖
把每个点拆成两个,a1,a2。
从S向a1连一条流量为wi-的边,从a2向T连一条流量为wi+的边。
原图中的边从u2向v1连一条流量无穷大的边。
然后跑最大流即可。
点拆反了居然还可以80pts….
代码如下:
#include<algorithm> #include<cstring> #include<ctype.h> #include<cstdio> #include<queue> #define N 20050 #define INF 2147483647 using namespace std; const int S=20001; const int T=20002; inline int read(){ int x=0,f=1;char c; do c=getchar(),f=c=='-'?-1:f; while(!isdigit(c)); do x=(x<<3)+(x<<1)+c-'0',c=getchar(); while(isdigit(c)); return x*f; } queue<int>q; int d ,fir ,top=1,x,y; struct Edge{ int to,nex,k; Edge(){} Edge(int _,int __,int ___):to(_),nex(__),k(___){} }nex[200050]; inline void add(int x,int y,int k){ nex[++top]=Edge(y,fir[x],k); fir[x]=top; } inline bool bfs(){ while(!q.empty()) q.pop(); memset(d,-1,sizeof d); d[S]=1;q.push(S); while(!q.empty()){ int x=q.front();q.pop(); for(int i=fir[x];i;i=nex[i].nex) if(nex[i].k && !~d[nex[i].to]){ d[nex[i].to]=d[x]+1; q.push(nex[i].to); } } return ~d[T]; } int dfs(int x,int v){ if(x==T || !v) return v; int tmp=0; for(int i=fir[x];i;i=nex[i].nex) if(nex[i].k && d[nex[i].to]==d[x]+1){ int f=dfs(nex[i].to,min(v,nex[i].k)); v-=f;nex[i^1].k+=f;nex[i].k-=f;tmp+=f; if(!v) break; } if(!tmp) d[x]=-1; return tmp; } inline int dinic(){ int tmp=0; while(bfs()) tmp+=dfs(S,INF); return tmp; } int n,m; int main(){ n=read();m=read(); for(int i=1;i<=n;i++){ x=read(); add(i+n,T,x);add(T,i+n,0); } for(int i=1;i<=n;i++){ x=read(); add(S,i,x);add(i,S,0); } for(int i=1;i<=m;i++){ x=read();y=read(); add(x,y+n,INF);add(y+n,x,0); } printf("%d",dinic()); return 0; }
相关文章推荐
- 成都Uber优步司机奖励政策(4月17日)
- 11年成都 A 博弈论+记忆化搜索 HDU 4111
- Codevs5230【三校联考试题】 猴子(重庆一中高2018级信息学竞赛测验8) 解题报告
- 四校联考 推冰块
- 【NOIP2016提高A组五校联考2】running
- [JZOJ 4815]【NOIP2016提高A组五校联考4】ksum
- 【JZOJ4815】【NOIP2016提高A组五校联考4】ksum
- 16.10.7 A:4815. 【NOIP2016提高A组五校联考4】ksum
- 10.29三校联考反思
- 成都分贝块 专业制作游戏动漫音乐音效音频
- 从输入一个url后到页面加载完成都发生了什么
- [3.19FJ四校联考]
- jloi2017(shoi2017?)六省联考酱油记
- 成都云栖大会_阿里1582.73亿营收背后的持续交付如何玩?
- jzoj3450【NOIP2013模拟联考3】山峰(summits,dfs)
- 2013年计算机联考真题——确定主元
- jzoj4210. 【五校联考1day1】我才不是萝莉控呢(哈夫曼树)
- 学习记录1(17/09/13于成都)
- 9.25+9.27 联考
- 第九届Mockplus ▪ UXPA用户体验成都赛区决赛成功举行