求助
查看原帖
求助
401215
xieziheng楼主2023/12/3 11:22

全 WA 了。

#include <bits/stdc++.h>
#define il inline
using namespace std;
const int N=1e5+5,K=22;
int n,m,q,k,fa[N],de[N],siz[N],dfn[N],id[N],top[N],son[N],cnt;
int a[N],b[N];multiset<int,greater<int> > s[N];
vector<int> e[N];
il void add(int x,int y){e[x].push_back(y);}
void dfs1(int x,int fath){
    fa[x]=fath,de[x]=de[fath]+1,siz[x]=1;
    for(int y:e[x]){
        if(y==fath) continue;
        dfs1(y,x),siz[x]+=siz[y];
        if(siz[y]>siz[son[x]]) son[x]=y;
    }
}
void dfs2(int x,int t){
    dfn[x]=++cnt,id[cnt]=x,top[x]=t;
    if(son[x]) dfs2(son[x],t);
    for(int y:e[x]){
        if(y==fa[x] || y==son[x]) continue;
        dfs2(y,y);
    }
}
struct node{
    int a[K];
    il node(){memset(a,0,sizeof(a));}
}tree[N<<2];
il node merge(node x,node y){
    node z;int u=0,v=0;
    for(int i=0;i<=20;++i) z.a[i]=0;
    for(int i=0;i<k;++i){
        if(x.a[u]>=y.a[v]) z.a[i]=x.a[u++];
        else z.a[i]=y.a[v++];
    }
    return z;
}
il void pushup(int x){tree[x]=merge(tree[x<<1],tree[x<<1|1]);}
il void to(int x,int p){
    int u=0;if(!s[p].size()) return ;
    for(int i=0;i<=k;++i) tree[x].a[i]=0;
    for(auto it=s[p].begin();it!=s[p].end();++it){
        if(u>=k) break;
        tree[x].a[u]=*it,++u;
    }
}
void build(int x,int l,int r){
    if(l==r){to(x,id[l]);return ;}
    int mid=(l+r)>>1;
    build(x<<1,l,mid),build(x<<1|1,mid+1,r);
    pushup(x);
}
void update(int x,int l,int r,int p){
    if(l==r){to(x,id[l]);return ;}
    int mid=(l+r)>>1;
    if(p<=mid) update(x<<1,l,mid,p);
    else update(x<<1|1,mid+1,r,p);
    pushup(x);
}
node query(int x,int l,int r,int L,int R){
    if(l>=L && r<=R) return tree[x];
    int mid=(l+r)>>1;
    if(L>mid) return query(x<<1|1,mid+1,r,L,R);
    else if(R<=mid) return query(x<<1,l,mid,L,R);
    else return merge(query(x<<1,l,mid,L,R),query(x<<1|1,mid+1,r,L,R));
}
il int lca(int x,int y){
    while(top[x]!=top[y]){
        if(de[top[x]]<de[top[y]]) swap(x,y);
        x=fa[top[x]];
    }
    return de[x]<de[y]?x:y;
}
il int dis(int x,int y){return de[x]+de[y]-2*de[lca(x,y)];}
il int ck(int x,int y,int z){return dis(x,z)+dis(z,y)==dis(x,y);}
il node querypath(int x,int y){
    node ans;int u=x,v=y;
    for(int i=0;i<=20;++i) ans.a[i]=0;
    while(top[x]!=top[y]){
        if(de[top[x]]<de[top[y]]) swap(x,y);
        ans=merge(ans,query(1,1,n,dfn[top[x]],dfn[x])),x=fa[top[x]];
        if(!ck(u,v,x)) puts("*");
    }
    if(de[x]<de[y]) swap(x,y);
    if(!ck(u,v,x) || !ck(u,v,y)) puts("*");
    ans=merge(ans,query(1,1,n,dfn[y],dfn[x]));
    return ans;
}

int c[N],tot;
int opt,x,y,z,u,v,w;node cur;
int main(){
    freopen("P6578.in","r",stdin);
    freopen("P6578.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<n;++i) scanf("%d%d",&x,&y),add(x,y),add(y,x);
    scanf("%d",&m);
    for(int i=1;i<=m;++i) scanf("%d%d",&a[i],&b[i]),s[b[i]].insert(a[i]);
    scanf("%d%d",&q,&k);
    dfs1(1,0),dfs2(1,1),build(1,1,n);
    while(q--){
        scanf("%d%d%d",&opt,&x,&y);
        if(opt==1){
            cur=querypath(x,y),z=k;
            for(int i=0;i<k;++i) if(!cur.a[i]){z=i;break;}
            if(!z) puts("-1");
            else{for(int i=0;i<z;++i) printf("%d ",cur.a[i]);puts("");}
        }
        else if(opt==2){
            auto it=s[b[x]].find(a[x]);if(it!=s[b[x]].end()) s[b[x]].erase(it);
            s[y].insert(a[x]);
            update(1,1,n,dfn[b[x]]),update(1,1,n,dfn[b[x]=y]);
        }
        else{
            auto it=s[b[x]].find(a[x]);if(it!=s[b[x]].end()) s[b[x]].erase(it);
            s[b[x]].insert(a[x]=y);
            update(1,1,n,dfn[b[x]]);
        }
    }
    return 0;
}

2023/12/3 11:22
加载中...