标签:can online oid return while scan 测试数据 bit queue
Doctor Who乘着Tardis带着Amy来到了一个星球,一开Tadis大门,发现这个星球上有个壮观的石像群,全是一些天使石像,有的石像在哭泣,有的石像像在微笑,共有m行n列,Doctor用“音速起子”扫描了一下整个石像群,得到了每行天使中在哭泣的天使的个数。当他与Amy在这里行走了一段时间之后,Doctor忽然想起了什么,怀疑这些石像是不是传说中的一种黑暗生物——“哭泣天使”——一种看似石像,却会在人不看它的时候移动,会强制把人送回某个过去的时间点,并借此汲取时间能量的生物。Doctor可不想自己和Amy迷失在一个未知的时间点里,于是Doctor立刻用“音速起子”又扫描了整个石像群,想再看看每行的在哭泣的天使个数与刚才是否相符,但是,越急就越容易出错,他一不小心扫描错了,扫描出了每列中哭泣的天使的个数。现在,由于音速起子的能量不足了,他不能够再次扫描,他想根据已有的数据判断出是否有天使改变了自己的表情,从哭泣变成不哭泣或者从不哭泣变成哭泣了。
2 2 3 1 1 1 1 0 3 3 0 1 2 3 0 0
Not Sure Terrible
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 #define inf 0x3f3f3f3f 5 const int maxn=101000; 6 struct Edge 7 { 8 int v,w,next; 9 }; 10 class Dinic{ 11 public: 12 int d[maxn],cur[maxn],first[maxn],tot,s,t,n; 13 bool vis[maxn]; 14 Edge e[maxn<<3]; 15 16 void init(int n,int s,int t){ 17 this->n=n,this->s=s,this->t=t; 18 tot=0; 19 memset(first,-1,sizeof(first)); 20 } 21 22 void add(int u,int v,int w){ 23 e[tot].v=v; 24 e[tot].w=w; 25 e[tot].next=first[u]; 26 first[u]=tot++; 27 28 e[tot].v=u; 29 e[tot].w=0; 30 e[tot].next=first[v]; 31 first[v]=tot++; 32 } 33 34 bool bfs(){ 35 memset(vis,0,sizeof(vis)); 36 queue<int>q; 37 q.push(s); 38 d[s]=0; 39 vis[s]=1; 40 while(!q.empty()){ 41 int u=q.front(); 42 q.pop(); 43 for(int i=first[u];~i;i=e[i].next){ 44 if(!vis[e[i].v] && e[i].w>0){ 45 vis[e[i].v]=1; 46 d[e[i].v]=d[u]+1; 47 q.push(e[i].v); 48 } 49 } 50 } 51 return vis[t]; 52 } 53 54 int dfs(int u,int a){ 55 if(u==t||a==0)return a; 56 int flow=0,f; 57 for(int &i=cur[u];~i;i=e[i].next){ 58 if(d[e[i].v]==d[u]+1 && (f=dfs(e[i].v,min(a,e[i].w)))>0){ 59 e[i].w-=f; 60 e[i^1].w+=f; 61 flow+=f; 62 a-=f; 63 if(!a) break; 64 } 65 } 66 return flow; 67 } 68 69 int solve(){ 70 int ans=0; 71 while(bfs()){ 72 for(int i=1;i<=n;++i) cur[i]=first[i]; 73 ans+=dfs(s,inf) ; 74 } 75 return ans; 76 } 77 }AC; 78 int r[333],c[333]; 79 int main(){ 80 int t,m,n,sum; 81 scanf("%d",&t); 82 while(t--){ 83 int s1=0,s2=0; 84 scanf("%d%d",&m,&n); 85 sum=m*n+m+n+2; 86 AC.init(sum,sum-1,sum); 87 for(int i=1;i<=m;++i) { 88 scanf("%d",r+i); 89 s1+=r[i]; 90 AC.add(sum-1,m*n+i,r[i]); 91 for(int j=1;j<=n;++j) AC.add(m*n+i,(i-1)*n+j,1); 92 } 93 for(int i=1;i<=n;++i) { 94 scanf("%d",c+i); 95 s2+=c[i]; 96 AC.add(m*n+m+i,sum,c[i]); 97 for(int j=1;j<=m;++j) AC.add((j-1)*n+i,m*n+m+i,1); 98 } 99 //printf("%d\n",AC.solve()); 100 if(s1!=s2){ 101 puts("Terrible"); 102 continue; 103 } 104 AC.solve()==s1?puts("Not Sure"):puts("Terrible"); 105 } 106 return 0; 107 }
标签:can online oid return while scan 测试数据 bit queue
原文地址:https://www.cnblogs.com/zzqc/p/9384661.html