社区讨论
为什么会有异常的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 条回复,欢迎继续交流。
正在加载回复...