1 条题解

  • 0
    @ 2026-2-28 16:01:15
    #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
    上传者