以下内容搬运自cf官方题解
真是毒瘤。
题解晚上写。
代码:
#include<cstdio> #include<algorithm> using namespace std; int D=20; int n,m,q,cnt=-1; int fir[1000],in[1000]; int nxt[200000],to[200000]; int tp[1000],pos[1000]; int have[1<<20]; int K=0,A[10000],B[10000]; bool C[10000]; inline void addedge(int a,int b,bool c) { A[K]=a; B[K]=b; C[K++]=c; return; } inline void add(int a,int b) { to[++cnt]=b; in[b]++; nxt[cnt]=fir[a]; fir[a]=cnt; return; } #include<queue> queue<int> que; void topo(void) { for(int i=0;i<n;i++) if(in[i]==0){ tp[cnt++]=i; que.push(i); } while(que.size()>0){ int i=que.front(); que.pop(); for(int j=fir[i];j!=-1;j=nxt[j]){ in[to[j]]--; if(in[to[j]]==0){ tp[cnt++]=to[j]; que.push(to[j]); } } } return; } void changeS(int p,int S) { for(int p1=D;p1>=0;p1--) for(int p2=(p1==D?D:p1-1);p2>=0;p2--) for(int p3=(p2==D?D:p2-1);p3>=0;p3--){ int S2=(S^(1<<p1)^(1<<p2)^(1<<p3))&((1<<D)-1); if(have[S2]==-1){ have[S2]=p; if(p1<D) addedge(p,tp[n-D+p1],!(S>>p1&1)); if(p2<D) addedge(p,tp[n-D+p2],!(S>>p2&1)); if(p3<D) addedge(p,tp[n-D+p3],!(S>>p3&1)); return; } } return; } void edge(void) { for(int i=0;i<n;i++) pos[tp[i]]=i; for(int i=n-D;i<n;i++) for(int j=i+1;j<n;j++) addedge(tp[i],tp[j],1); for(int i=0;i<n;i++){ if(pos[i]>=n-D) continue; addedge(i,i,1); int S=0; for(int p=fir[i];p!=-1;p=nxt[p]){ int j=to[p]; if(pos[j]>=n-D) S|=(1<<(pos[j]-n+D)); } changeS(i,S); } return; } int main(void) { scanf("%d%d%d",&n,&m,&q); if(D>n) D=n; for(int i=0;i<n;i++) fir[i]=-1; for(int i=0;i<(1<<D);i++) have[i]=-1; while(m--){ int a,b; scanf("%d%d",&a,&b); add(a-1,b-1); } cnt=0; topo(); edge(); printf("%d\n",K); for(int i=0;i<K;i++) if(C[i]==1) printf("+ %d %d\n",A[i]+1,B[i]+1); else printf("- %d %d\n",A[i]+1,B[i]+1); fflush(stdout); while(q--){ char s[20]; int S=0; for(int i=0;i<D;i++){ printf("? 1 %d\n",tp[i+n-D]+1); fflush(stdout); scanf(" %s",s); if(s[0]=='L'){ printf("! %d\n",tp[i+n-D]+1); fflush(stdout); break; } if(s[0]=='W') S|=(1<<i); } if(s[0]!='L'){ printf("! %d\n",have[S]+1); fflush(stdout); } scanf(" %s",s); if(s[0]=='W') return 0; } return 0; }View Code