赞
踩
首先我们用前缀和模板,然后暴力枚举所有的x1,y1,x2,y2;但是这是o(n^4)所以我们要想办法优化,
我们发现在矩形长相等,或者宽相等的时候,如:如果宽相等的矩形,某个长度的矩形不行,那么更长的长度的矩形肯定也不行,所以具有单调性。我们可以用(双指针)优化一层。变为o(n^3).
枚举宽度,长的起点。利用双指针找到右端点。
#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' #define LL __int128 using namespace std; const int N=2e5+10,M=1e3+10,mod=998244353,INF=0x3f3f3f3f; int g[M][M]; int pre[M][M]; int ptr(int x1,int y1,int x2,int y2) { return pre[x2][y2]-pre[x2][y1-1]-pre[x1-1][y2]+pre[x1-1][y1-1]; } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n,m,k;cin>>n>>m>>k; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>g[i][j]; pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+g[i][j]; } } int ans=0; for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { for(int l=1,r=1;l<=m;l++) { while(r<=m&&ptr(i,l,j,r)<=k)r++; //也可以ans+=r-l,某个线段不含某个端点的数量求法。 //因为退出循环的r不符合所以减一 r--; //某个线段,包含端点的个数求法。 ans+=r-l+1; } } } cout<<ans<<endl; return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。