fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define foru(i,a,b) for(int i=(a); i<=(b); ++i)
  5. #define ford(i,a,b) for(int i=(a); i>=(b); --i)
  6. #define rep(i,a) for(int i=0; i<(a); ++i)
  7. #define sz(a) (int)(a).size()
  8. #define all(a) (a).begin(),(a).end()
  9. #define bit(s,i) (((s)>>(i))&1)
  10. #define ii pair<int,int>
  11. #define fi first
  12. #define se second
  13. #define pb push_back
  14. #define eb emplace_back
  15. #define ll long long
  16.  
  17. template <class X, class Y> bool maxi(X &x, Y y){return x<y?x=y,true:false;}
  18. template <class X, class Y> bool mini(X &x, Y y){return x>y?x=y,true:false;}
  19.  
  20. const int N=5050;
  21. const int R=3030;
  22.  
  23. int r,c,n,k,prv[N],nxt[N],vy[N];
  24. ii pt[N];
  25. vector<int> pos[R];
  26. bool on[N];
  27.  
  28. inline int c2(int x){
  29. if(x<0) return 0;
  30. return x*(x-1)/2 + x;
  31. }
  32.  
  33. void solve(){
  34. cin>>r>>c>>n>>k;
  35.  
  36. if(k==0){
  37. /// do something
  38. cout<<1LL*c2(r)*c2(c)<<'\n';
  39. return;
  40. } else{
  41. --k;
  42. }
  43.  
  44. foru(i,1,n){
  45. int x,y; cin>>x>>y;
  46. pt[i]={x,y};
  47. }
  48.  
  49. sort(pt+1, pt+1+n, [](ii x, ii y){return x.se<y.se;});
  50. foru(i,1,n){
  51. int x=pt[i].fi, y=pt[i].se;
  52. vy[i]=y;
  53. pos[x].eb(i);
  54. }
  55. vy[0]=0; vy[n+1]=c+1;
  56.  
  57. ll ans=0;
  58. foru(i,1,r){
  59. foru(j,i,r){
  60. for(int id:pos[j]){
  61. on[id]=1;
  62. }
  63. }
  64.  
  65. int lst=0;
  66. foru(j,1,n) if(on[j]){
  67. prv[j]=lst;
  68. nxt[lst]=j;
  69. lst=j;
  70. }
  71. nxt[lst]=n+1;
  72.  
  73. ll cur=0;
  74. foru(j,1,n) if(on[j]){
  75. int x=j;
  76. foru(l,1,k){
  77. if(x==n+1) break;
  78. cur+=(vy[j]-vy[prv[j]])*(vy[nxt[x]]-vy[x]);
  79. x=nxt[x];
  80. }
  81. cur+=c2(vy[j]-vy[prv[j]]-1);
  82. if(nxt[j]==n+1) cur+=c2(vy[nxt[j]]-vy[j]-1);
  83. }
  84. if(nxt[0]==n+1) cur=c2(c);
  85.  
  86. ford(j,r,i){
  87. // cout<<i<<" "<<j<<" "<<cur<<'\n';
  88. ans+=cur;
  89. for(int id:pos[j]){
  90. int lp=id, rp=id, cnt=k;
  91. foru(_,2,k+1){
  92. if(prv[lp]==0) break;
  93. lp=prv[lp]; --cnt;
  94. }
  95. while(cnt>0){
  96. if(nxt[rp]==n+1) break;
  97. rp=nxt[rp];
  98. --cnt;
  99. }
  100.  
  101. if(cnt==0){
  102. while(lp!=id){
  103. if(rp==n+1) break;
  104. cur+=(vy[lp]-vy[prv[lp]])*(vy[nxt[rp]]-vy[rp]);
  105. lp=nxt[lp]; rp=nxt[rp];
  106. }
  107. if(rp!=n+1){
  108. cur+=(vy[lp]-vy[prv[lp]])*(vy[nxt[rp]]-vy[rp]);
  109. }
  110. }
  111.  
  112. nxt[prv[id]]=nxt[id];
  113. prv[nxt[id]]=prv[id];
  114. on[id]=false;
  115. }
  116. }
  117. }
  118.  
  119.  
  120. // cout<<ans<<'\n';
  121. // cout<<1LL*c2(r)*c2(c)<<'\n';
  122. cout<<1LL*c2(r)*c2(c) - ans<<'\n';
  123. }
  124.  
  125. int32_t main(){
  126. #define task "recs"
  127. if(fopen(task".inp","r")){
  128. freopen(task".inp","r",stdin);
  129. freopen(task".out","w",stdout);
  130. }
  131. cin.tie(0)->sync_with_stdio(0);
  132.  
  133. int the; //cin>>the;
  134. int tc=1; //cin>>tc;
  135. rep(_,tc){
  136. solve();
  137. }
  138. }
  139.  
Success #stdin #stdout 0s 5304KB
stdin
Standard input is empty
stdout
0