[关闭]
@Rarfaeal 2019-12-12T04:34:54.000000Z 字数 2546 阅读 348

3 4

1 3 2 1

1 3 2 4

1 2 3 4

8

1 2 2 1

1 1 2 1

1 1 3 4

1 1 1 1

2 2 3 3

3 4 2 2

1 3 3 1

2 4 3 4

8

4

38

1

8

12

27

4

  1. Uses math;
  2. Const
  3. question=1000000+10;
  4. total=200+10;
  5. var
  6. sqrnum,bucket:array[-1..sqr(total)] of longint;
  7. matrix:array[-1..total,-1..total] of longint;
  8. point:array[-1..7,-1..question] of longint;
  9. ans:array[-1..question] of longint;
  10. i,j,m,a,b,c,d,n1,n2,sum,time,node_num:longint;
  11. procedure Swap(var a,b:longint); var t:longint; begin t:=a; a:=b; b:=t; end;
  12. function Gcd_(a,b:longint):longint;
  13. var c:longint;
  14. begin
  15. c:=a mod b;
  16. while c<>0 do begin a:=b; b:=c; c:=a mod b; end; exit(b);
  17. end;
  18. function Locate(node:longint):longint;
  19. begin
  20. if node mod node_num=0 then exit(node div node_num);
  21. exit(node div node_num+1);
  22. end;
  23. procedure Sort(l,r:longint);
  24. var i,j,k,s1,s2,s3,s4:longint;
  25. begin
  26. i:=l; j:=r; s1:=point[5,(l+r) >> 1]; s2:=point[2,(l+r) >> 1]; s3:=point[6,(l+r) >> 1]; s4:=point[4,(l+r) >> 1];
  27. repeat
  28. while (point[5,i]<s1)or((point[5,i]=s1)and(point[2,i]<s2))or((point[5,i]=s1)and(point[2,i]=s2)and(point[6,i]<s3))
  29. or((point[5,i]=s1)and(point[2,i]=s2)and(point[6,i]=s3)and(point[4,i]<s4)) do inc(i);
  30. while (point[5,j]>s1)or((point[5,j]=s1)and(point[2,j]>s2))or((point[5,j]=s1)and(point[2,j]=s2)and(point[6,j]>s3))
  31. or((point[5,j]=s1)and(point[2,j]=s2)and(point[6,j]=s3)and(point[4,j]>s4)) do dec(j);
  32. if i<=j then begin for k:=1 to 7 do Swap(point[k,i],point[k,j]); inc(i); dec(j); end;
  33. until i>=j;
  34. if i<r then Sort(i,r); if j>l then Sort(l,j);
  35. end;
  36. procedure Ready;
  37. var i,j,k:longint;
  38. begin
  39. read(n1,n2); for i:=1 to n1 do for j:=1 to n2 do read(matrix[i,j]);
  40. read(m); node_num:=trunc(max(n1,n2)/sqrt(sqrt(m)));
  41. for i:=1 to sqr(total) do sqrnum[i]:=sqr(i);
  42. for i:=1 to m do
  43. begin
  44. point[7,i]:=i; for j:=1 to 4 do read(point[j,i]);
  45. point[5,i]:=Locate(point[1,i]); point[6,i]:=Locate(point[3,i]);
  46. end;
  47. Sort(1,m); a:=1; b:=1; c:=1; d:=1; sum:=1; bucket[matrix[1,1]]:=1;
  48. end;
  49. procedure Transefer(key,l,r,mode:longint);
  50. var i:longint;
  51. begin
  52. if mode=1 then for i:=l to r do
  53. begin
  54. dec(sum,sqrnum[bucket[matrix[key,i]]]);
  55. inc(bucket[matrix[key,i]]);
  56. inc(sum,sqrnum[bucket[matrix[key,i]]]);
  57. end;
  58. if mode=2 then for i:=l to r do
  59. begin
  60. dec(sum,sqrnum[bucket[matrix[i,key]]]);
  61. dec(bucket[matrix[i,key]]);
  62. inc(sum,sqrnum[bucket[matrix[i,key]]]);
  63. end;
  64. end;
  65. begin
  66. Ready;
  67. for i:=1 to m do
  68. begin
  69. while (a>point[1,i]) do begin dec(a); Transefer(a,b,d,1); end;
  70. while (c>point[3,i]) do begin Transefer(c,b,d,2); dec(c); end;
  71. while (c<point[3,i]) do begin inc(c); Transefer(c,b,d,1); end;
  72. while (a<point[1,i]) do begin Transefer(a,b,d,2); inc(a); end;
  73. while (b>point[2,i]) do begin dec(b); Transefer(b,a,c,1); end;
  74. while (d>point[4,i]) do begin Transefer(d,a,c,2); dec(d); end;
  75. while (d<point[4,i]) do begin inc(d); Transefer(d,a,c,1); end;
  76. while (b<point[2,i]) do begin Transefer(b,a,c,2); inc(b); end;
  77. ans[point[7,i]]:=sum;
  78. end;
  79. for i:=1 to m do writeln(ans[i]);
  80. writeln(time);
  81. end.
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注