1 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int N = 4040; int a[N][N]; int l[N][N],r[N][N],dn[N][N],up[N][N]; vector<int>e[N]; int b[N]; int n,m,len,p; int lowbit(int x){ return x&-x; } void add(int x,int v){ for(;x<=m;x+=lowbit(x))b[x]+=v; } int query(int x){ int res = 0; for(;x;x-=lowbit(x))res+=b[x]; return res; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n>>m>>len>>p; for(int i = 1;i<=p;i++){ int x,y; cin>>x>>y; a[x][y] = 1; } for(int i = 1;i<=n;i++){ for(int j = 1;j<=m;j++){ if(!a[i][j]){ l[i][j] = l[i][j-1]+1; up[i][j] = up[i-1][j]+1; } } } for(int i = n;i>=1;i--){ for(int j = m;j>=1;j--){ if(!a[i][j]){ r[i][j] = r[i][j+1]+1; dn[i][j] = dn[i+1][j]+1; } } } for(int i = 1;i<=n;i++){ for(int j = 1;j<=m;j++){ l[i][j] = min(l[i][j],dn[i][j]); r[i][j] = min(r[i][j],up[i][j]); } } long long ans = 0; for(int s = 2;s<=n+m;s++){ int fk = 1,dk = s-1; if(dk>m)fk = s-m,dk = m; for(int x = fk,y = dk;x<=n&&y>=1;x++,y--){ e[y-l[x][y]].push_back(y); add(y,1); } for(int x = fk,y = dk;x<=n&&y>=1;x++,y--){ for(auto v:e[y])add(v,-1); if(r[x][y]>=len)ans+=query(y+r[x][y]-1)-query(y+len-2); } for(int i = 1;i<=m;i++)e[i].clear(); memset(b,0,sizeof(b)); } cout<<ans; return 0; }
- 1
信息
- ID
- 9015
- 时间
- 10000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者