蓝桥杯模拟赛 青出于蓝而胜于蓝


dfs序+树状数组
时间戳相减就是i管辖的范围,有点贪心的思想。
从最强的人开始,每次添加一个人,那么就把这个人的的树状数组的C[i]加上1.

例如只有两个,2是1的师傅。

code:

#include <bits/stdc++.h>
using namespace std;

const int maxn=100010;

int n,m;
vector<int> edge[maxn];
int start[maxn*2],end[maxn*2];
int ret;
int tree[maxn*2];


int lowbit(int t)
{
    return t&(-t);
}

void up(int x,int y)
{
    for(int i=x;i<=n;i+=lowbit(i))
        tree[i]+=y;
}

int getsum(int x)
{
    int ans=0;
    for(int i=x;i>0;i-=lowbit(i)) ans+=tree[i];
    return ans;
}

void dfs(int u,int fa)
{
    start[u]=++ret;
    int len=edge[u].size();
    for(int i=0;i<len;i++)
    {
        if(edge[u][i]!=fa)
        {
            dfs(edge[u][i],u);
        }
    }
    end[u]=ret;
}
int main()
{
    cin>>n>>m;
    memset(tree,0,sizeof(tree));
    ret=0;
    for(int i=0;i<=n;i++) edge[i].clear();

    for(int i=1;i<n;i++)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        edge[x].push_back(y);
        edge[y].push_back(x);
    }
    dfs(m,m);
    for(int i=1;i<=n;i++)
    {
        cout<<getsum(end[i])-getsum(start[i])<<" ";
        up (start[i],1);
    }
    cout<<endl;
    return 0;
}
posted @ 2020-03-12 21:23  aaaaassss  阅读(158)  评论(0编辑  收藏  举报