萌新求助
查看原帖
萌新求助
82284
Echidna楼主2021/5/20 20:45

这题我调了两天了,找不到任何问题……

哪名大佬能帮帮我吗?

#include<iostream>
#include<vector>
using namespace std;
const int N=4e5;
int tree[15*N];
int maxp[15*N];
int ls[15*N];
int rs[15*N];
int cnt=0;
void pushup(int root){
    if(tree[ls[root]]>=tree[rs[root]])
        maxp[root]=maxp[ls[root]],tree[root]=tree[ls[root]];
    else maxp[root]=maxp[rs[root]],tree[root]=tree[rs[root]];
}
#define mid ((l+r)>>1)
void insert(int& root,int l,int r,int pos,int data){
    if(root==0)
        root=++cnt;
    if(l==r){
        tree[root]+=data;
        maxp[root]=l;
        return ;
    }
    if(pos<=mid)
        insert(ls[root],l,mid,pos,data);
    else insert(rs[root],mid+1,r,pos,data);
    pushup(root);
}
int merge(int x,int y,int l,int r){
    if(x==0||y==0)
        return x+y;
    if(l==r){
        tree[x]+=tree[y];
        maxp[x]=l;
        return x;
    }
    ls[x]=merge(ls[x],ls[y],l,mid);
    rs[x]=merge(rs[x],rs[y],mid+1,r);
    pushup(x);
    return x;
}
struct side{
    int t,n;
}ss[N];
int head[N];
int pcnt=0;
void add(int f,int t){
    ss[++pcnt].t=t;
    ss[pcnt].n=head[f];
    head[f]=pcnt;
}
#define FOR(x) for(int nxt=head[x];nxt;nxt=ss[nxt].n)
#define TP ss[nxt].t
vector<pair<int,int> > adp[N];
int n,m;
int fa[N][100];
int dep[N];
void dfs(int x,int fat){
    fa[x][0]=fat;
    dep[x]=dep[fat]+1;
    FOR(x){
        if(TP==fat)
            continue;
        dfs(TP,x);
    }
}
int lca(int x,int y){
    if(dep[x]<dep[y])
        swap(x,y);
    for(int i=30;i>=0;i--)
        if(dep[fa[x][i]]>=dep[y])
            x=fa[x][i];
    if(x==y)
        return x;
    for(int i=30;i>=0;i--)
        if(fa[x][i]!=fa[y][i])
            x=fa[x][i],y=fa[y][i];
    return fa[x][0];
}
void print(int root,int l,int r){
    if(l==r){
        if(tree[root]!=0)
            cout<<l<<":"<<tree[root]<<" ";
        return ;
    }
    print(ls[root],l,mid);
    print(rs[root],mid+1,r);
}
int ans[N];
int root[N];
const int Z=1e7;
void search(int x,int fa){
    FOR(x){
        if(TP==fa)
            continue;
        search(TP,x);
        root[x]=merge(root[x],root[TP],1,Z);
    }
    for(int i=0;i<adp[x].size();i++)
        insert(root[x],0,Z,adp[x][i].first,adp[x][i].second);
    // cout<<"at p="<<x<<" ";
    // print(root[x],1,Z);
    // cout<<endl;
    ans[x]=maxp[root[x]];
}
int main(){ 
    cin>>n>>m;
    for(int f,t,i=1;i<n;i++){
        cin>>f>>t;
        add(f,t);
        add(t,f);
    }
    dep[1]=1;
    dfs(1,0);
    fa[1][0]=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=30;j++)
            fa[i][j]=fa[fa[i][j-1]][j-1];
    for(int a,b,z,i=1;i<=m;i++){
        cin>>a>>b>>z;
        int lcap=lca(a,b);
        adp[a].push_back(make_pair(z,1));
        adp[b].push_back(make_pair(z,1));
        // cout<<lcap<<endl;
        adp[lcap].push_back(make_pair(z,-1));
        adp[fa[lcap][0]].push_back(make_pair(z,-1));
    }
    search(1,0);
    for(int i=1;i<=n;i++)
        cout<<ans[i]<<endl;
    // system("pause");
}
2021/5/20 20:45
加载中...