제출 #249606

#제출 시각아이디문제언어결과실행 시간메모리
249606huuducpro늑대인간 (IOI18_werewolf)C++14
100 / 100
775 ms98276 KiB
#include <bits/stdc++.h> #include "werewolf.h" using namespace std; const int N=200002; typedef vector <int> vi; typedef pair <int,int> pp; int m,q,n; vector <pp> pl[N],pr[N]; vector <int> A[N],vl[N],vr[N]; int dsu[N],gl[N],gr[N],fl[N],fr[N],x[N],y[N],rx[N],ry[N]; int type,dem; int bit[N]; vector <int> res; int root(int u) { while (dsu[u]>0) u=dsu[u]; return u; } void unionn(int u,int v) { if (dsu[u]>dsu[v]) swap(u,v); dsu[u]+=dsu[v];dsu[v]=u; if (type==0) vl[u].push_back(v); else vr[u].push_back(v); // cout<<type<<' '<<u<<' '<<v<<endl; } void dfsl(int u) { x[u]=++dem; for (int v:vl[u]) { if (x[v]>0) continue; dfsl(v); } rx[u]=dem; } void dfsr(int u) { y[u]=++dem; // cout<<u<<endl; for (int v:vr[u]) { if (y[v]>0) continue; dfsr(v); } ry[u]=dem; } void build() { type=0; for (int i=1;i<=n;i++) dsu[i]=-1; for (int i=1;i<=n;i++) { for (int v:A[i]) { if (v>i) continue; int a=root(i);int b=root(v); if (a!=b) unionn(a,b); } for (int j=0;j<pl[i].size();j++) { int u=pl[i][j].first; int pos=pl[i][j].second; u=root(u); fl[pos]=u; gl[pos]=vl[u].size(); } } //for (int i=1;i<=n;i++) // for (int j=1;j<=n;j++) assert(root(i)==root(j)); dem=0;dfsl(root(1));type=1; for (int i=1;i<=n;i++) dsu[i]=-1; for (int i=n;i>=1;i--) { for (int v:A[i]) { if (v<i) continue; int a=root(i);int b=root(v); if (a!=b) unionn(a,b); } for (int j=0;j<pr[i].size();j++) { int u=pr[i][j].first; int pos=pr[i][j].second; u=root(u); fr[pos]=u; gr[pos]=vr[u].size(); } } dem=0;dfsr(root(1)); } void update(int i,int val) { for (i;i<=n;i+=i&(-i)) bit[i]+=val; } int get(int i) { int ans=0; for (i;i>=1;i-=i&(-i)) ans+=bit[i]; return ans; } void solve_rec() { vector <int> X[N]; for (int i=1;i<=n;i++) X[x[i]].push_back(y[i]); vector <pair <pp,int> > Pl[N],Pr[N]; res.resize(q,0); for (int i=0;i<q;i++) { int u=fl[i]; //if (gl[i]==0||gr[i]==0) continue; int llx=x[u];int rrx=llx;if (gl[i]>0) rrx=rx[vl[u][gl[i]-1]]; u=fr[i]; int lly=y[u];int rry=lly;if (gr[i]>0) rry=ry[vr[u][gr[i]-1]]; Pl[llx-1].push_back({{lly,rry},i}); Pr[rrx].push_back({{lly,rry},i}); //cout<<i<<' '<<fl[i]<<' '<<gl[i]<<' '<<llx<<' '<<rrx<<' '<<lly<<' '<<rry<<endl; } // for (int i=1;i<=n;i++) // cout<<x[i]<<' '<<y[i]<<endl; for (int i=1;i<=n;i++) { for (int y:X[i]) update(y,1); for (int j=0;j<Pl[i].size();j++) { int a=Pl[i][j].first.first;int b=Pl[i][j].first.second; int pos=Pl[i][j].second; res[pos]-=get(b)-get(a-1); } for (int j=0;j<Pr[i].size();j++) { int a=Pr[i][j].first.first;int b=Pr[i][j].first.second; int pos=Pr[i][j].second; res[pos]+=get(b)-get(a-1); } } for (int i=0;i<q;i++) res[i]=(res[i]>0); } vector <int> check_validity(int nn,vi X,vi Y,vi S,vi E,vi L,vi R) { n=nn;m=X.size();q=S.size(); for (int i=0;i<m;i++) { X[i]++;Y[i]++; A[X[i]].push_back(Y[i]); A[Y[i]].push_back(X[i]); } for (int i=0;i<q;i++) { S[i]++;E[i]++;L[i]++;R[i]++; pl[R[i]].push_back({E[i],i}); pr[L[i]].push_back({S[i],i}); } build(); solve_rec(); return res; } /* namespace { int read_int() { int x; if (scanf("%d", &x) != 1) { fprintf(stderr, "Error while reading input\n"); exit(1); } return x; } } // namespace int main() { freopen("wereworf.inp","r",stdin); freopen("wereworf.out","w",stdout); int N = read_int(); int M = read_int(); int Q = read_int(); std::vector<int> X(M), Y(M), S(Q), E(Q), L(Q), R(Q); for (int j = 0; j < M; ++j) { X[j] = read_int(); Y[j] = read_int(); } for (int i = 0; i < Q; ++i) { S[i] = read_int(); E[i] = read_int(); L[i] = read_int(); R[i] = read_int(); } vector<int> A = check_validity(N, X, Y, S, E, L, R); for (int i = 0; i < A.size(); ++i) { printf("%d\n", A[i]); } return 0; } */

컴파일 시 표준 에러 (stderr) 메시지

werewolf.cpp: In function 'void build()':
werewolf.cpp:61:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j=0;j<pl[i].size();j++)
                      ~^~~~~~~~~~~~~
werewolf.cpp:83:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j=0;j<pr[i].size();j++)
                      ~^~~~~~~~~~~~~
werewolf.cpp: In function 'void update(int, int)':
werewolf.cpp:97:11: warning: statement has no effect [-Wunused-value]
     for (i;i<=n;i+=i&(-i))
           ^
werewolf.cpp: In function 'int get(int)':
werewolf.cpp:103:11: warning: statement has no effect [-Wunused-value]
     for (i;i>=1;i-=i&(-i))
           ^
werewolf.cpp: In function 'void solve_rec()':
werewolf.cpp:132:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j=0;j<Pl[i].size();j++)
                      ~^~~~~~~~~~~~~
werewolf.cpp:138:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j=0;j<Pr[i].size();j++)
                      ~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...