Submission #20980

#TimeUsernameProblemLanguageResultExecution timeMemory
20980aintaIli (COI17_ili)C++14
100 / 100
2996 ms2680 KiB
#include<cstdio> #include<algorithm> #include<vector> using namespace std; int n, m, E[20100][2]; char p[10100]; vector<int> G[20100]; int Get(char *a){ int i, s = 0; for(i=1;a[i];i++)s=s*10+a[i]-'0'; if(a[0]=='x')return s; return s+n; } int v[20100]; struct point{ int a, b, c; }w[20100]; void DFS(int a){ v[a]=1; if(a<=n)return; int i; for(i=0;i<2;i++){ if(!v[E[a][i]])DFS(E[a][i]); } } int Q[20100], head, tail; int vv[20100]; bool Pos(int a, int b){ int i; if(!a){ for(i=1;i<=n+m;i++)v[i]=0; for(i=1;i<=m;i++){ if(p[i]=='1' && !v[n+i]) v[n+i] = 2; } for(i=1;i<=m;i++){ if(p[i]=='0' && !v[n+i])DFS(n+i); } } else{ for(i=1;i<=n+m;i++)v[i]=vv[i]; if(b==1) DFS(a); else v[a] = b; } for(i=1;i<=m;i++){ if(!v[w[i].c]){ if(v[w[i].a] == 1 && v[w[i].b] == 1) v[w[i].c] = 1; } } head = tail = 0; for(i=1;i<=n+m;i++){ if(v[i]==2)Q[++tail] = i; } while(head < tail){ int x = Q[++head]; if(x > n){ if(v[E[x][0]] == 1 && v[E[x][1]] == 0){ v[E[x][1]] = 2; Q[++tail] = E[x][1]; } if(v[E[x][1]] == 1 && v[E[x][0]] == 0){ v[E[x][0]] = 2; Q[++tail] = E[x][0]; } } for(i=0;i<G[x].size();i++){ if(!v[G[x][i]]){ v[G[x][i]] = 2; Q[++tail] = G[x][i]; } } } for(i=1;i<=m;i++){ if(v[w[i].a]==1 && v[w[i].b]==1 && v[w[i].c] == 2)return false; if((v[w[i].a]==2 || v[w[i].b]==2) && v[w[i].c] == 1)return false; } return true; } int main(){ int i; scanf("%d%d",&n,&m); scanf("%s",p+1); char p1[20], p2[20]; for(i=1;i<=m;i++){ scanf("%s%s",p1,p2); int t1 = Get(p1), t2 = Get(p2); E[n+i][0] = t1; E[n+i][1] = t2; G[t1].push_back(n+i); G[t2].push_back(n+i); w[i].a = t1, w[i].b = t2, w[i].c = n+i; } DFS(0); Pos(0,0); for(i=1;i<=n+m;i++)vv[i] = v[i]; for(i=1;i<=m;i++){ if(vv[n+i]){ printf("%d",vv[n+i]-1); continue; } if(!Pos(n+i, 1)){ printf("1"); } else if(!Pos(n+i, 2)){ printf("0"); } else printf("?"); } }

Compilation message (stderr)

ili.cpp: In function 'bool Pos(int, int)':
ili.cpp:65:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(i=0;i<G[x].size();i++){
                  ^
ili.cpp: In function 'int main()':
ili.cpp:80:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",&n,&m);
                        ^
ili.cpp:81:20: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%s",p+1);
                    ^
ili.cpp:84:28: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%s%s",p1,p2);
                            ^

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...