题目
大致翻译:
现在有
n
×
m
n\times m
n×m个位置,有
n
×
m
n\times m
n×m个学生,每个学生为0或1,依次进入,依次进入规则如图
问:每加入一个学生后,至少有一个1的行列之和。
思路:
对于行列的考虑分开进行:
对于每列:
每次加入一个学生列中的1要不就不变,要不就加1;
对于每行:
每次加入一个学生行的变化可能会增加可能不变可能减少,可以运用滑动窗口,记录行的变化和每次加入学生后当前行1的个数;
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define int long long
const int N = 1e6+10;
int hang[N],vis[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
int n,m,ans;string s;int z;
while(t--){
cin>>n>>m;z=n*m;
cin>>s;
for(int i=0;i<=m;i++){
hang[i]=0;vis[i]=0;
}
for(int i=1,c=0,lie=0;i<=z;i++){
//hang 滑动窗口
if(s[i-1]=='1')c++;
if(i<=m){
if(c>0)hang[i]=1;
}else{
if(s[i-m-1]=='1')c--;
hang[i]=(c>0)+hang[i-m];
}
//lie
if(vis[(i-1)%m]==0&&s[i-1]=='1'){
vis[(i-1)%m]++;
lie++;
}
cout<<hang[i]+lie<<" ";
}
cout<<endl;
}
return 0;
}