1001
1002
1003
两边离散化。暴力扫C就过了。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 #define maxn 1000010 7 bool vis1[maxn],vis2[maxn]; 8 int Hash[maxn],h[2][maxn]; 9 int tt[2],num[2],c1[maxn],c2[maxn]; 10 int sz[2][maxn]; 11 12 struct node 13 { 14 int to,pre; 15 } edge[2][maxn]; 16 17 void add(int op,int from,int to) 18 { 19 tt[op]++; 20 edge[op][tt[op]].pre=h[op][from]; 21 edge[op][tt[op]].to=to; 22 h[op][from]=tt[op]; 23 } 24 25 int id(int op,int x) 26 { 27 return lower_bound(Hash,Hash+num[op],x)-Hash; 28 } 29 30 int main(void) 31 { 32 int T; cin>>T; 33 for(int kase=1;kase<=T;kase++) 34 { 35 memset(tt,0,sizeof(tt)); 36 memset(h,0,sizeof(h)); 37 memset(sz,0,sizeof(sz)); 38 memset(Hash,0,sizeof(Hash)); 39 int n; scanf("%d",&n); 40 for(int i=0;i 1) M++;101 for(int j=h[1][i];j;j=edge[1][j].pre) vis1[c1[edge[1][j].to]]=1;102 }103 printf("Case #%d: %d %d %d\n",kase,S,M,O);104 }105 return 0;106 }
1004
1005
1006
1007
1008
1009
1010