MLE 帮帮我吧
查看原帖
MLE 帮帮我吧
514727
bcdmwSjy楼主2024/11/2 13:38

卡了半天了, #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

2024/11/2 13:38
加载中...