【USACO 2010FEB】 slowdown

【题目链接】

           点击打开链接

【算法】

           dfs序 + 线段树

           树链剖分同样可以解决这个问题

【代码】

            

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

int i,n,p,a,b,timer;
int tag[MAXN<<2],sum[MAXN<<2],size[MAXN],fa[MAXN],dfn[MAXN];

vector< int > e[MAXN];

inline void dfs(int u)
{
        int i,v;
        dfn[u] = ++timer;
        size[u]    = 1;
        for (i = 0; i < e[u].size(); i++)
        {
                v = e[u][i];
                if (fa[u] != v)
                {
                        fa[v] = u;
                        dfs(v);
                        size[u] += size[v];        
                }    
        }
}
inline void pushdown(int index)
{
        if (tag[index])
        {
                sum[index<<1] += tag[index];
                sum[index<<1|1] += tag[index];
                tag[index<<1] += tag[index];
                tag[index<<1|1] += tag[index];
                tag[index] = 0;
        }
}
inline void update(int index)
{
        sum[index] = sum[index<<1] + sum[index<<1|1];
} 
inline void modify(int index,int l,int r,int ql,int qr,int val)
{
        int mid;
        if (l == ql && r == qr)
        {
                sum[index] += val;
                tag[index] += val;
                return;
        }
        pushdown(index);
        mid = (l + r) >> 1;
        if (mid >= qr) modify(index<<1,l,mid,ql,qr,val);
        else if (mid + 1 <= ql) modify(index<<1|1,mid+1,r,ql,qr,val);
        else
        {
                modify(index<<1,l,mid,ql,mid,val);
                modify(index<<1|1,mid+1,r,mid+1,qr,val);
        }
        update(index);
}
inline int query(int index,int l,int r,int pos)
{
        int mid;
        if (l == r) return sum[index];
        pushdown(index);
        mid = (l + r) >> 1;
        if (mid >= pos) return query(index<<1,l,mid,pos);
        else return query(index<<1|1,mid+1,r,pos);        
}

int main() {
        
        scanf("%d",&n);
        for (i = 1; i < n; i++)
        {
                scanf("%d%d",&a,&b);
                e[a].push_back(b);
                e[b].push_back(a);
        }
        dfs(1);
        for (i = 1; i <= n; i++)
        {
                scanf("%d",&p);
                printf("%d
",query(1,1,n,dfn[p]));
                modify(1,1,n,dfn[p],dfn[p]+size[p]-1,1);    
        }
        
        return 0;
    
}
原文地址:https://www.cnblogs.com/evenbao/p/9196301.html