标签:int day5 long break while 浙大 集训 lld
浙大集训day5:C
给出一个\(n\times m\)的矩阵。
询问有多少个子矩阵,满足内部元素和<=k。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
int _;
int n,m;
long long k;
int main () {
scanf("%d",&_);
while (_--) {
scanf("%d%d%lld",&n,&m,&k);
if (n>m) {
int a[m+2][n+2]={0};
long long c[m+2][n+2]={0};
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
scanf("%d",&a[j][i]);
}
}
swap(n,m);
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
c[i][j]=c[i-1][j]+c[i][j-1]+a[i][j]-c[i-1][j-1];
}
}
long long ans=0;
for (int i=1;i<=n;i++) {
//枚举高度
for (int j=1;j<=n;j++) {
//枚举行
if (j+i-1>n) break;
int A=j,B=j+i-1;
int L=1,R=1;
long long sum=c[B][1]-c[A-1][1];
while (1) {
while (R<m&&sum+c[B][R+1]-c[B][R]-c[A-1][R+1]+c[A-1][R]<=k) {
sum+=c[B][R+1]-c[B][R]-c[A-1][R+1]+c[A-1][R];
R++;
}
if (sum<=k)ans+=R-L+1;
sum-=c[B][L]-c[B][L-1]-c[A-1][L]+c[A-1][L-1];
L++;
if (L>m) break;
}
}
}
printf("%lld\n",ans);
}
else {
int a[n+2][m+2]={0};
long long c[n+2][m+2]={0};
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
scanf("%d",&a[i][j]);
}
}
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
c[i][j]=c[i-1][j]+c[i][j-1]+a[i][j]-c[i-1][j-1];
}
}
long long ans=0;
for (int i=1;i<=n;i++) {
//枚举高度
for (int j=1;j<=n;j++) {
//枚举行
if (j+i-1>n) break;
int A=j,B=j+i-1;
int L=1,R=1;
long long sum=c[B][1]-c[A-1][1];
while (1) {
while (R<m&&sum+c[B][R+1]-c[B][R]-c[A-1][R+1]+c[A-1][R]<=k) {
sum+=c[B][R+1]-c[B][R]-c[A-1][R+1]+c[A-1][R];
R++;
}
if (sum<=k)ans+=R-L+1;
sum-=c[B][L]-c[B][L-1]-c[A-1][L]+c[A-1][L-1];
L++;
if (L>m) break;
}
}
}
printf("%lld\n",ans);
}
}
}
标签:int,day5,long,break,while,浙大,集训,lld 来源: https://www.cnblogs.com/zhanglichen/p/15548865.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。