Guest User

Untitled

a guest
Oct 23rd, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.73 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <sstream>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <string>
  7. #include <set>
  8.  
  9. using namespace std;
  10.  
  11. int N,M,M2,rmin[200],rmax[200],cmin[200],cmax[200];
  12. set<int> SR,SC;
  13.  
  14. void add(int r1, int r2, int c1, int c2){
  15. if(r2 >= N && c2 >= N){
  16. rmin[M2] = r1; rmax[M2] = N - 1;
  17. cmin[M2] = c1; cmax[M2] = N - 1;
  18. SR.insert(rmin[M2]); SR.insert(rmax[M2] + 1);
  19. SC.insert(cmin[M2]); SC.insert(cmax[M2] + 1);
  20. ++M2;
  21.  
  22. rmin[M2] = r1; rmax[M2] = N - 1;
  23. cmin[M2] = 0; cmax[M2] = c2 - N;
  24. SR.insert(rmin[M2]); SR.insert(rmax[M2] + 1);
  25. SC.insert(cmin[M2]); SC.insert(cmax[M2] + 1);
  26. ++M2;
  27.  
  28. rmin[M2] = 0; rmax[M2] = r2 - N;
  29. cmin[M2] = c1; cmax[M2] = N - 1;
  30. SR.insert(rmin[M2]); SR.insert(rmax[M2] + 1);
  31. SC.insert(cmin[M2]); SC.insert(cmax[M2] + 1);
  32. ++M2;
  33.  
  34. rmin[M2] = 0; rmax[M2] = r2 - N;
  35. cmin[M2] = 0; cmax[M2] = c2 - N;
  36. SR.insert(rmin[M2]); SR.insert(rmax[M2] + 1);
  37. SC.insert(cmin[M2]); SC.insert(cmax[M2] + 1);
  38. ++M2;
  39. }else if(r2 >= N){
  40. rmin[M2] = r1; rmax[M2] = N - 1;
  41. cmin[M2] = c1; cmax[M2] = c2;
  42. SR.insert(rmin[M2]); SR.insert(rmax[M2] + 1);
  43. SC.insert(cmin[M2]); SC.insert(cmax[M2] + 1);
  44. ++M2;
  45.  
  46. rmin[M2] = 0; rmax[M2] = r2 - N;
  47. cmin[M2] = c1; cmax[M2] = c2;
  48. SR.insert(rmin[M2]); SR.insert(rmax[M2] + 1);
  49. SC.insert(cmin[M2]); SC.insert(cmax[M2] + 1);
  50. ++M2;
  51. }else if(c2 >= N){
  52. rmin[M2] = r1; rmax[M2] = r2;
  53. cmin[M2] = c1; cmax[M2] = N - 1;
  54. SR.insert(rmin[M2]); SR.insert(rmax[M2] + 1);
  55. SC.insert(cmin[M2]); SC.insert(cmax[M2] + 1);
  56. ++M2;
  57.  
  58. rmin[M2] = r1; rmax[M2] = r2;
  59. cmin[M2] = 0; cmax[M2] = c2 - N;
  60. SR.insert(rmin[M2]); SR.insert(rmax[M2] + 1);
  61. SC.insert(cmin[M2]); SC.insert(cmax[M2] + 1);
  62. ++M2;
  63. }else{
  64. rmin[M2] = r1; rmax[M2] = r2;
  65. cmin[M2] = c1; cmax[M2] = c2;
  66. SR.insert(rmin[M2]); SR.insert(rmax[M2] + 1);
  67. SC.insert(cmin[M2]); SC.insert(cmax[M2] + 1);
  68. ++M2;
  69. }
  70. }
  71.  
  72. long long f(int n){
  73. return (long long)n * (n+1) / 2;
  74. }
  75.  
  76. long long count(long long r1, long long r2, long long c1, long long c2){
  77. if(c1 > r2 - 1) return (r2-r1) * (c2-c1);
  78. if(c2 - 1 <= r1) return 0;
  79.  
  80. if(r2 - 1 <= c2 - 2){
  81. if(c1 - 1 >= r1) return f(r2 - c1 + 1) + (c1 - r1 - 1) * (c2 - c1) + (r2 - c1 + 1) * (c2 - r2 - 1);
  82. return f(r2 - r1) + (r2 - r1) * (c2 - r2 - 1);
  83. }else{
  84. if(r1 + 1 >= c1) return f(c2 - r1 - 1);
  85. return f(c2 - c1) + (c1 - r1 - 1) * (c2 - c1);
  86. }
  87.  
  88. return 0;
  89. }
  90.  
  91. int main(){
  92. int T;
  93. char line[100];
  94.  
  95. scanf("%d",&T);
  96.  
  97. for(int tc = 1;tc <= T;++tc){
  98. scanf("%d %d\n",&N,&M);
  99.  
  100. SR.clear(); SC.clear();
  101. SR.insert(0); SR.insert(N);
  102. SC.insert(0); SC.insert(N);
  103. M2 = 0;
  104.  
  105. for(int i = 0;i < M;++i){
  106. fgets(line,100,stdin);
  107.  
  108. int L = strlen(line);
  109.  
  110. for(int j = 0;j < L;++j)
  111. if(line[j] < '0' || line[j] > '9')
  112. line[j] = ' ';
  113.  
  114. istringstream is(line);
  115. vector<int> param;
  116. int aux;
  117.  
  118. while(is >> aux) param.push_back(aux);
  119.  
  120. int r1 = param[0] - 1;
  121. int c1 = param[1] - 1;
  122. int c2 = c1 + param[2] - 1;
  123.  
  124. if(param.size() == 4 && param[3] % 2 == 1) add(r1,r1 + param[2] - 1,c1,c2);
  125. if(param.size() == 5 && param[4] % 2 == 1) add(r1,r1 + param[3] - 1,c1,c2);
  126. }
  127.  
  128. vector<int> R(SR.begin(),SR.end()),C(SC.begin(),SC.end());
  129. int nR = R.size(),nC = C.size();
  130.  
  131. bool change[nR - 1][nC - 1];
  132. memset(change,0,sizeof(change));
  133.  
  134. for(int k = 0;k < M2;++k)
  135. for(int i = 0;i+1 < nR;++i)
  136. if(rmin[k] <= R[i] && R[i+1]-1 <= rmax[k])
  137. for(int j = 0;j+1 < nC;++j)
  138. if(cmin[k] <= C[j] && C[j+1]-1 <= cmax[k])
  139. change[i][j] ^= 1;
  140.  
  141. long long ans = 0;
  142.  
  143. for(int i = 0;i+1 < nR;++i)
  144. for(int j = 0;j+1 < nC;++j)
  145. if(!change[i][j])
  146. ans += (long long)(R[i+1] - R[i]) * (C[j+1] - C[j]) - count(R[i],R[i+1],C[j],C[j+1]);
  147. else
  148. ans += count(R[i],R[i+1],C[j],C[j+1]);
  149.  
  150. printf("%lld\n",ans);
  151. }
  152.  
  153. return 0;
  154. }
Add Comment
Please, Sign In to add comment