社区讨论

为什么会有异常的MLE?

学术版参与者 9已保存回复 15

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@mm0pqyo3
此快照首次捕获于
2026/02/24 22:41
2 周前
此快照最后确认于
2026/02/26 14:05
2 周前
查看原帖
rt,在做P3950部落冲突出现了不知道是什么原因的MLE,这是怎么回事?
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=3e5+10;
int n,que;
int u,v;
char opt;
int x,y;
int dep[maxn],fa[maxn],siz[maxn],son[maxn];
int cnt,p[maxn],q[maxn];
int dfn,top[maxn],id[maxn];
struct seg{
	ll val,lzy;
	int Left,Right;
}tree[maxn*4];
vector<int> G[maxn];
void pushup(int u){
	tree[u].val=tree[u<<1].val+tree[u<<1|1].val;
	return;
}
bool inr(int L,int R,int l,int r){
	return L>=l&&R<=r;
}
bool otr(int L,int R,int l,int r){
	return (R<l)||(L>r);
}
void maketag(int u,ll k){
	tree[u].val+=(tree[u].Right-tree[u].Left+1)*k;
	tree[u].lzy+=k;
	return;
}
void pushdown(int u){
	maketag(u<<1,tree[u].lzy);
	maketag(u<<1|1,tree[u].lzy);
	tree[u].lzy=0;
	return;
}
void add(int u,int k,int d){
	if(tree[u].Left==tree[u].Right){
		tree[u].val+=d;
		return;
	}
	if(k<=tree[u<<1].Right) add(u<<1,k,d);
	else add(u<<1|1,k,d);
	pushup(u);
	return;
}
void update(int u,int l,int r,ll k){
	if(inr(tree[u].Left,tree[u].Right,l,r)){
		maketag(u,k);
		return;
	}else if(!otr(tree[u].Left,tree[u].Right,l,r)){
		pushdown(u);
		update(u<<1,l,r,k);
		update(u<<1|1,l,r,k);
		pushup(u);
	}
	return;
}
ll query(int u,int l,int r){
	if(inr(tree[u].Left,tree[u].Right,l,r)){
		return tree[u].val;
	}else if(!otr(tree[u].Left,tree[u].Right,l,r)){
		pushdown(u);
		ll res=query(u<<1,l,r)+query(u<<1|1,l,r);
		return res;
	}else return 0;
}
void build(int u,int L,int R){
	tree[u].Left=L;
	tree[u].Right=R;
	if(L==R) return;
	int mid=(L+R)>>1;
	build(u<<1,L,mid);
	build(u<<1|1,mid+1,R);
	return;
}
void dfs1(int u,int f){
    //cout << u << " " << f << "\n";
	fa[u]=f;
	siz[u]=1;
	dep[u]=dep[f]+1;
	int s=0;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(v==f) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>s){
			s=siz[v];
			son[u]=v;
		}
	}
	return;
}
void dfs2(int u,int f){
	top[u]=f;
	id[u]=++dfn;
	if(son[u]) dfs2(son[u],f);
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(v==f||v==son[u]) continue;
		dfs2(v,v);
	}
	return;
}
void addpathkai(int u,int v){
	if(fa[u]==v) add(1,id[u],1); 
	else add(1,id[v],1);
	return;
}
void addpathguan(int u,int v){
	if(fa[u]==v) add(1,id[u],-1);
	else add(1,id[v],-1);
	return;
}
bool check(int u,int v){
	ll res=0;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		res+=query(1,id[top[u]],id[u]);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	if(u!=v){
		res+=query(1,id[son[u]],id[v]);
	}
	return (res==0);
}
int main(){
	cin >> n >> que;
	for(int i=1;i<=n-1;i++){
		cin >> u >> v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	while(que--){
		cin >> opt;
		if(opt=='Q'){
			cin >> x >> y;
			if(check(x,y)) cout << "Yes\n";
			else cout << "No\n";
		}else if(opt=='C'){
			cin >> x >> y;
			cnt++;
			p[cnt]=x;
			q[cnt]=y;
			addpathkai(x,y);
		}else{
			cin >> x;
			addpathguan(p[x],q[x]);
		}
	}
    return 0;
}


回复

15 条回复,欢迎继续交流。

正在加载回复...