卡了半天了, #2 #6 MLE,别的点最多 300 MB,这两个点直接干到 1000 MB 了,是我写的有问题还是单纯空间大,求大佬帮我看看
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (i<<1)
#define rs (i<<1|1)
int n,m,q;
struct Tree{
int l,r,len;
vector<int> up,down,ans;
Tree(){
l=r=0;
len=1;
up.resize(m+1,0);
down.resize(m+1,0);
ans.resize(m+1,0);
}
};
vector<Tree> tr;
vector<vector<int> > a;
void meg(Tree &rt,const Tree &l,const Tree &r){
deque<int> q1,q2;
for (int i=1,j=1;i<=m;i++){
while (not q1.empty() and l.down[i]<l.down[q1.back()]) q1.pop_back();
q1.push_back(i);
while (not q2.empty() and r.up[i]<r.up[q2.back()]) q2.pop_back();
q2.push_back(i);
while (j<=i and i-j+1>r.up[q2.front()]+l.down[q1.front()]){
j++;
if (q1.front()<j) q1.pop_front();
if (q2.front()<j) q2.pop_front();
}
rt.ans[i]=max({l.ans[i],r.ans[i],i-j+1});
}
for (int i=1;i<=m;i++){
rt.up[i]=l.up[i]+(l.up[i]==l.len?r.up[i]:0);
rt.down[i]=r.down[i]+(r.down[i]==r.len?l.down[i]:0);
}
}
void pushup(int i){
meg(tr[i],tr[ls],tr[rs]);
}
void build(int i,int l,int r){
tr[i].l=l;
tr[i].r=r;
tr[i].len=r-l+1;
if (l==r){
tr[i].up.resize(m+1,0);
tr[i].down.resize(m+1,0);
tr[i].ans.resize(m+1,0);
for (int j=1;j<=m;j++){
tr[i].up[j]=tr[i].down[j]=tr[i].ans[j]=a[l][j];
}
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(i);
}
void update(int i,int x,int y){
if (tr[i].l==tr[i].r){
a[x][y]^=1;
tr[i].up[y]=tr[i].down[y]=tr[i].ans[y]=a[x][y];
return;
}
if (tr[ls].r>=x) update(ls,x,y);
else update(rs,x,y);
pushup(i);
}
Tree query(int i,int l,int r){
if (tr[i].l>=l and tr[i].r<=r) return tr[i];
Tree ans;
if (tr[ls].r>=l) ans=query(ls,l,r);
if (tr[rs].l<=r) meg(ans,ans,query(rs,l,r));
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>q;
bool flag=false;
if (n<m){
swap(n,m);
flag=true;
}
a.resize(n+1);
for (int i=1;i<=n;i++) a[i].resize(m+1,0);
if (not flag){
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
cin>>a[i][j];
}
}
}else{
for (int i=1;i<=m;i++){
for (int j=1;j<=n;j++){
cin>>a[j][i];
}
}
}
tr.resize((1<<(int(ceil(log2(n)))+1))+1);
build(1,1,n);
while (q--){
int op;
cin>>op;
if (op==0){
int x,y;
cin>>x>>y;
if (flag) swap(x,y);
update(1,x,y);
}else{
int l,s,r,t;
cin>>l>>s>>r>>t;
if (flag) swap(l,s),swap(r,t);
Tree q=query(1,l,r);
int maxn=0;
for (int i=s;i<=t;i++){
maxn=max(maxn,min(q.ans[i],i-s+1));
}
cout<<maxn<<"\n";
}
}
return 0;
}
如果把 main 一开始的 if 中的符号换一下就会 T 一片 qwq