题目大意:给出一个n*m的矩阵,q个询问。每次询问改变(i,j)的状态(0改为1,1改为0),输出n行中最大连续为1的个数。
思路:直接模拟。最开始没有注意到要“连续为1”,wa了好多次。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<stack>
#include<algorithm>
#include<vector>
#define mx 505
#define y1 y12345
#define inf 0x3f3f3f3f
#define LL long long
#define ULL unsigned long long
#define mod 1000000007
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int mp[mx][mx];
int n,m,q;
struct aa{
int v,id; //v表示第i行中连续为1的最大个数
}ans[mx];
bool cmp1(aa a,aa b){
return a.v>b.v;
}
bool cmp2(aa a,aa b){
return a.id<b.id;
}
int cmax(int a,int b){
if(a>b)return a;
return b;
}
void shit(int x){ //计算第x行中连续为1的最大个数
int max=0,temp=0;
for(int i=0;i<m;i++){
if(mp[x][i])temp++;
else temp=0;
max=cmax(max,temp);
}
ans[x].v=max;
}
int main(){
scanf("%d %d %d",&n,&m,&q);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&mp[i][j]);
}
}
for(int i=0;i<n;i++)shit(i),ans[i].id=i; //初始化
while(q--){
int a,b;
scanf("%d %d",&a,&b);
a--,b--;
if(mp[a][b]==1)
mp[a][b]=0;
else if(mp[a][b]==0)
mp[a][b]=1;
shit(a);
sort(ans,ans+n,cmp1); //根据v排序,选出n行中最大
cout<<ans[0].v<<endl;
sort(ans,ans+n,cmp2); //复原
}
return 0;
}