记录编号 375994 评测结果 AAAAAAAAAA
题目名称 [HEOI 2012]朋友圈 最终得分 100
用户昵称 Gravatar再见 是否通过 通过
代码语言 C++ 运行时间 0.985 s
提交时间 2017-02-26 13:24:53 内存使用 60.83 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<cctype>
  5.  
  6. int A,B,m,ans,a[3010],b[3010];
  7. int x[3010],y[3010],xn,yn,link[3010],E[3010][3010];
  8. char go[3010][3010],g[3010][3010],gb[3010][3010];
  9. bool vis[3010];
  10.  
  11. inline int read(){
  12. int x=0; char ch;
  13. while(ch=getchar(),!isdigit(ch));
  14. while(x=x*10+ch-'0',ch=getchar(),isdigit(ch));
  15. return x;
  16. }
  17.  
  18. inline int max(int aa,int bb){return aa>bb?aa:bb;}
  19. inline bool jishu(int aa,int bb){
  20. int k=aa|bb,cnt=0;
  21. for(int i=1;i<=k;i<<=1)
  22. if(k&i)
  23. cnt++;
  24. return cnt&1;
  25. }
  26.  
  27. bool match(int u){
  28. for(int i=1;i<=E[u][0];i++){
  29. int &to=E[u][i];
  30. if(!vis[to]){
  31. vis[to]=true;
  32. if(!link[to]||match(link[to])){
  33. link[to]=u;
  34. return true;
  35. }
  36. }
  37. }
  38. return false;
  39. }
  40.  
  41. inline int zerop(){
  42. xn=yn=0;
  43. for(int i=1;i<=B;i++)
  44. b[i]&1?x[++xn]=i:y[++yn]=i;
  45. for(int i=1;i<=xn;i++){
  46. int &now=E[i][0]; now=0;
  47. for(int j=1;j<=yn;j++)
  48. gb[x[i]][y[j]]^1?E[i][++now]=j:false;
  49. }
  50. int flow=0;
  51. for(int i=1;i<=xn;i++){
  52. memset(vis,0,sizeof(vis));
  53. if(match(i)) flow++;
  54. }
  55. return xn+yn-flow;
  56. }
  57.  
  58. inline int onep(){
  59. int MAX=0;
  60. for(int j=1;j<=A;j++){
  61. xn=yn=0;
  62. for(int i=1;i<=B;i++)
  63. if(g[j][i])
  64. b[i]&1?x[++xn]=i:y[++yn]=i;
  65. for(int i=1;i<=xn;i++){
  66. int &now=E[i][0]; now=0;
  67. for(int j=1;j<=yn;j++)
  68. gb[x[i]][y[j]]^1?E[i][++now]=j:false;
  69. }
  70. int flow=0;
  71. for(int i=1;i<=yn;i++) link[i]=0;
  72. for(int i=1;i<=xn;i++){
  73. memset(vis,0,sizeof(vis));
  74. if(match(i)) flow++;
  75. }
  76. MAX=max(MAX,xn+yn-flow);
  77. }
  78. return MAX+1;
  79. }
  80.  
  81. inline int twop(){
  82. int MAX=0;
  83. for(int k=1;k<=A;k++){
  84. for(int j=k+1;j<=A;j++)
  85. if((a[k]^a[j])&1){
  86. xn=yn=0;
  87. for(int i=1;i<=B;i++)
  88. if(g[j][i]&&g[k][i])
  89. b[i]&1?x[++xn]=i:y[++yn]=i;
  90. for(int i=1;i<=xn;i++){
  91. int &now=E[i][0]; now=0;
  92. for(int j=1;j<=yn;j++)
  93. gb[x[i]][y[j]]^1?E[i][++now]=j:false;
  94. }
  95. int flow=0;
  96. for(int i=1;i<=yn;i++) link[i]=0;
  97. for(int i=1;i<=xn;i++){
  98. memset(vis,0,sizeof(vis));
  99. if(match(i)) flow++;
  100. }
  101. MAX=max(MAX,xn+yn-flow);
  102. }
  103. }
  104. return MAX;
  105. }
  106.  
  107. int main(){
  108. //freopen("a.txt","r",stdin);
  109. freopen("friends.in","r",stdin);
  110. freopen("friends.out","w",stdout);
  111. int T=read();
  112. while(T--){
  113. A=read(); B=read(); m=read();
  114. for(int i=1;i<=A;i++) a[i]=read();
  115. for(int i=1;i<=B;i++) b[i]=read();
  116. for(int i=1;i<=m;i++){
  117. int xi,yi; scanf("%d%d",&xi,&yi);
  118. g[xi][yi]=true;
  119. }
  120. for(int i=1;i<=B;i++)
  121. for(int j=i+1;j<=B;j++)
  122. if(jishu(b[i],b[j]))
  123. gb[i][j]=gb[j][i]=true;
  124. ans=0;
  125. ans=max(ans,zerop());
  126. ans=max(ans,onep());
  127. ans=max(ans,twop());
  128. printf("%d\n",ans);
  129. }
  130. return 0;
  131. }