bzoj1782[Usaco2010 Feb]slowdown 慢慢游

来源:互联网 发布:装修公司淘宝店装修 编辑:程序博客网 时间:2024/05/19 13:28

1A真的爽。
网上那都什么鬼玩意,看着挺复杂,有必要吗。这不就是个裸链剖讲道理。

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;typedef long long ll;const int N=1e5+5;int n,m;struct node{    int sum;    int l,r;    //bool flag;}t[N*10];int tot,cnt;bool vis[N];int fa[N];int pos[N],dep[N],siz[N],son[N];int head[N<<1],go[N<<1],next[N<<1];int bl[N];inline void dfs(int x){    vis[x]=1;    siz[x]=1;    int i=head[x];    while (i)    {        int v=go[i];        if (!vis[v])        {            dep[v]=dep[x]+1;            fa[v]=x;            dfs(v);            siz[x]+=siz[v];        }        i=next[i];    }}inline void dfs1(int x,int top){    pos[x]=++cnt;    int k=0;    bl[x]=top;    int i=head[x];    while (i)    {        int v=go[i];        if (dep[v]>dep[x]&&siz[v]>siz[k])        k=v;        i=next[i];    }    if (!k)return;    dfs1(k,top);    i=head[x];    while (i)    {        int v=go[i];        if (dep[v]>dep[x]&&k!=v)        dfs1(v,v);        i=next[i];    }}inline void add(int x,int y){    go[++tot]=y;    next[tot]=head[x];    head[x]=tot;}inline void build(int x,int l,int r){    t[x].l=l,t[x].r=r;    if (l==r)    {        return;    }    int mid=(l+r)>>1;    build(x<<1,l,mid);    build(x<<1|1,mid+1,r);}inline void change(int x,int pos){    if (t[x].l==t[x].r)    {        t[x].sum+=1;        return ;    }    int mid=(t[x].l+t[x].r)>>1;    if (pos<=mid)change(x<<1,pos);    else change(x<<1|1,pos);    t[x].sum=t[x<<1].sum+t[x<<1|1].sum;}inline int query(int x,int l,int r){    //printf("%d %d %d\n",x,l,r);    if (t[x].l==l&&t[x].r==r)return t[x].sum;    int mid=(t[x].l+t[x].r)>>1;    if (r<=mid)return query(x<<1,l,r);    else if (l>mid)return query(x<<1|1,l,r);    else return query(x<<1,l,mid)+query(x<<1|1,mid+1,r);}inline int solvesum(int x,int y){    int sum=0;    while (bl[x]!=bl[y])    {        if (dep[bl[x]]<dep[bl[y]])swap(x,y);        sum+=query(1,pos[bl[x]],pos[x]);        x=fa[bl[x]];    }    if (pos[x]>pos[y])swap(x,y);    sum+=query(1,pos[x],pos[y]);    return sum;}inline void solve(){    build(1,1,n);    //fo(i,1,n)change(1,pos[i]);    //fo(i,1,n)printf("%d\n",pos[i]);    fo(i,1,n)    {        int x;        scanf("%d",&x);        printf("%d\n",solvesum(1,x));        change(1,pos[x]);    }}int main(){    scanf("%d",&n);    fo(i,1,n-1)    {        int x,y;        scanf("%d%d",&x,&y);        add(x,y);        add(y,x);    }    dep[1]=1;    dfs(1);    //memset(vis,0,sizeof(vis));    dfs1(1,1);    solve();    return 0;}
0 0
原创粉丝点击