Advertisement
Guest User

Untitled

a guest
Nov 14th, 2016
401
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <cstring>
  6. #include <deque>
  7. #include <stack>
  8. #include <stdio.h>
  9. #include <map>
  10. #include <set>
  11. #include <time.h>
  12. #include <string>
  13. #include <fstream>
  14. #include <queue>
  15. #include <bitset>
  16. #include <cstdlib>
  17. #define X first
  18. #define Y second
  19. #define mp make_pair
  20. #define pb push_back
  21. #define pdd pair<double,double>
  22. #define pii pair<ll,ll>
  23. #define PI 3.14159265358979323846
  24. #define MOD 1000000007
  25. #define MOD2 1000000009
  26. #define INF ((ll)1e+18)
  27. #define x1 fldgjdflgjhrthrl
  28. #define x2 fldgjdflgrtyrtyjl
  29. #define y1 fldggfhfghjdflgjl
  30. #define y2 ffgfldgjdflgjl
  31. #define N 500500
  32. #define SUM 23423
  33. #define MAG 1048576
  34. #define OPEN 0
  35. #define CLOSE 1
  36. typedef long long ll;
  37. typedef long double ld;
  38. using namespace std;
  39. ll i,j,n,k,l,m,x,y,tot, flag,h,r,ans,z, K,x1,y1,x2,y2;
  40. string s;
  41. vector<vector<ll> > a;
  42. vector<vector<ll> > t;
  43. vector<pii> scol[1005000];
  44. ll dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
  45. bool good(ll x, ll y, ll val)
  46. {
  47. if (x < 0 || x >= n || y < 0 || y >= m)
  48. return false;
  49. if (val == (a[x][y]&(MAG-1)))
  50. return true;
  51. return false;
  52. }
  53. void dfs(ll x, ll y, ll col)
  54. {
  55. if (a[x][y] == col)
  56. return;
  57. a[x][y] = col;
  58. scol[col].push_back(mp(x,y));
  59. for (int i = 0; i < 4; i++)
  60. if (good(x+dir[i][0], y+dir[i][1], 1))
  61. dfs(x+dir[i][0], y+dir[i][1], col);
  62. }
  63. void print()
  64. {
  65. for (int i = 0; i < n; i++)
  66. {
  67. for (int j = 0; j < m; j++)
  68. cout << a[i][j] << " ";
  69. cout << endl;
  70. }
  71. }
  72. bool cmp(pii x1, pii x2)
  73. {
  74. return t[x1.X][x1.Y] > t[x2.X][x2.Y];
  75. }
  76. int main() {
  77. //freopen("input.txt","r",stdin);
  78. //freopen("output.txt","w",stdout);
  79. ll tests;
  80. cin >> tests;
  81. while (tests--)
  82. {
  83. cin >> n >> m >> x >> k;
  84. a.clear();
  85. t.clear();
  86. a.resize(n);
  87. for (i = 0; i < n; i++)
  88. a[i].resize(m);
  89. t.resize(n+1);
  90. for (i = 0; i < n+1; i++)
  91. t[i].resize(m+1);
  92. for (i = 0; i < x; i++)
  93. {
  94. cin >> x1 >> y1 >> x2 >> y2;
  95. if (n<m)
  96. {
  97. for (j = x1; j <= x2; j++)
  98. {
  99. t[j][y1]++;
  100. t[j][y2+1]--;
  101. }
  102. } else
  103. {
  104. for (j = y1; j <= y2; j++)
  105. {
  106. t[x1][j]++;
  107. t[x2+1][j]--;
  108. }
  109. }
  110. }
  111. if (n < m)
  112. {
  113. for (i = 0; i < n; i++)
  114. {
  115. ll sum = 0;
  116. for (j = 0; j < m; j++)
  117. {
  118. sum += t[i][j];
  119. a[i][j] = sum;
  120. }
  121. }
  122. } else
  123. {
  124. for (j = 0; j < m; j++)
  125. {
  126. ll sum = 0;
  127. for (i = 0; i < n; i++)
  128. {
  129. sum += t[i][j];
  130. a[i][j] = sum;
  131. }
  132. }
  133. }
  134. for (i = 0; i < n; i++)
  135. {
  136. for (j = 0; j < m; j++)
  137. if (a[i][j] >= k)
  138. a[i][j] = 1;
  139. else
  140. a[i][j] = 0;
  141. }
  142. ll starting_color = 2;
  143. for (i = 0; i < n; i++)
  144. for (j = 0; j < m; j++)
  145. if (a[i][j] == 1)
  146. {
  147. scol[starting_color].clear();
  148. dfs(i,j,starting_color);
  149. starting_color++;
  150. }
  151. /*for (i = 0; i < n; i++)
  152. {
  153. for (j = 0; j < m; j++)
  154. cout << a[i][j];
  155. cout << endl;
  156. }*/
  157. ll ans = 0;
  158. for (i = 2; i < starting_color; i++)
  159. {
  160. ll sum = 0;
  161. for (j = 0; j < scol[i].size(); j++)
  162. {
  163. x = scol[i][j].X, y = scol[i][j].Y;
  164. if (a[x][y] > MAG)
  165. continue;
  166. sum++;
  167. if (!good(x-1,y,i) && !good(x+1,y,i))
  168. {
  169. a[x][y] += MAG;
  170. k = y;
  171. while (good(x,k+1,i))
  172. {
  173. k++;
  174. a[x][k] += MAG;
  175. }
  176. k = y;
  177. while (good(x,k-1,i))
  178. {
  179. k--;
  180. a[x][k] += MAG;
  181. }
  182. } else
  183. if (!good(x,y-1,i) && !good(x,y+1,i))
  184. {
  185. a[x][y] += MAG;
  186. k = x;
  187. while (good(k+1,y,i))
  188. {
  189. k++;
  190. a[k][y] += MAG;
  191. }
  192. k = x;
  193. while (good(k-1,y,i))
  194. {
  195. k--;
  196. a[k][y] += MAG;
  197. }
  198. } else
  199. sum--;
  200. //print();
  201. }
  202. ans += sum;
  203. sum = 0;
  204. for (j = 0; j < scol[i].size(); j++)
  205. {
  206. x = scol[i][j].X, y = scol[i][j].Y;
  207. if (a[x][y] > MAG)
  208. continue;
  209. ll tmp1 = 0, tmp2 = 0;
  210. k = y;
  211. while (good(x,k+1,i))
  212. {
  213. k++;
  214. if (a[x][k] == i)
  215. tmp1++;
  216. }
  217. k = y;
  218. while (good(x,k-1,i))
  219. {
  220. k--;
  221. if (a[x][k] == i)
  222. tmp1++;
  223. }
  224. k = x;
  225. while (good(k+1,y,i))
  226. {
  227. k++;
  228. if (a[k][y] == i)
  229. tmp2++;
  230. }
  231. k = x;
  232. while (good(k-1,y,i))
  233. {
  234. k--;
  235. if (a[k][y] == i)
  236. tmp2++;
  237. }
  238. t[x][y] = max(tmp1, tmp2);
  239. }
  240. sort(scol[i].begin(), scol[i].end(), cmp);
  241. for (j = 0; j < scol[i].size(); j++)
  242. {
  243. x = scol[i][j].X, y = scol[i][j].Y;
  244. if (a[x][y] > MAG)
  245. continue;
  246. sum++;
  247. a[x][y] += MAG;
  248. ll tmp1 = 0, tmp2 = 0;
  249. k = y;
  250. while (good(x,k+1,i))
  251. {
  252. k++;
  253. if (a[x][k] == i)
  254. tmp1++;
  255. }
  256. k = y;
  257. while (good(x,k-1,i))
  258. {
  259. k--;
  260. if (a[x][k] == i)
  261. tmp1++;
  262. }
  263.  
  264. k = x;
  265. while (good(k+1,y,i))
  266. {
  267. k++;
  268. if (a[k][y] == i)
  269. tmp2++;
  270. }
  271. k = x;
  272. while (good(k-1,y,i))
  273. {
  274. k--;
  275. if (a[k][y] == i)
  276. tmp2++;
  277. }
  278. if (tmp1 > tmp2)
  279. {
  280. k = y;
  281. while (good(x,k+1,i))
  282. {
  283. k++;
  284. a[x][k] += MAG;
  285. }
  286. k = y;
  287. while (good(x,k-1,i))
  288. {
  289. k--;
  290. a[x][k] += MAG;
  291. }
  292. } else
  293. {
  294. k = x;
  295. while (good(k+1,y,i))
  296. {
  297. k++;
  298. a[k][y] += MAG;
  299. }
  300. k = x;
  301. while (good(k-1,y,i))
  302. {
  303. k--;
  304. a[k][y] += MAG;
  305. }
  306. }
  307. }
  308. ans += sum;
  309. }
  310. cout << ans << endl;
  311. }
  312. return 0;
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement