[ABC278E] Grid Filling 题解
本题需要使用类似高维前缀和的做法。
首先预处理,用
转移方程的依据是容斥原理,考虑到学过二维前缀和的人较多,这里不多赘述。
然后对于每一对
可以发现,
如果我们称满足上述条件的的
具体地,每次询问中对于每个在矩阵中有出现过的
总时间复杂度
放代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=300;
int c[N+1][N+1][N+1];
bool v[N+1];
set<int> s;
main(){
ios::sync_with_stdio(false);
int h,w,n,a,b; cin>>h>>w>>n>>a>>b;
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++){
int x; cin>>x;
for(int k=1;k<=n;k++)
c[i][j][k]=c[i-1][j][k]+c[i][j-1][k]-c[i-1][j-1][k]+(x==k);
s.emplace(x); v[x]=true;
} // 前缀和预处理
for(int i=0;i<=h-a;i++,cout<<endl)
for(int j=0;j<=w-b;j++){
int r=0;
for(int k=1;k<=n;k++)
if(v[k])r+=(c[i+a][j+b][k]-c[i][j+b][k]-c[i+a][j][k]+c[i][j][k]==c[h][w][k]); // 统计“独特的”x
cout<<s.size()-r<<' ';
} // 枚举 (k,l)
return 0;
}