HDU 3974 Assign the task(线段树+dfs序)

题意:

一棵树的结构,父节点是老板,子节点是员工,每次给父节点分配的任务,立即会下分到他所有的子节点,有更新和查询命令。

分析:

采用dfs序进行建树,可以很好的对区间进行修改和查询。

#include

using namespace std;

const int maxn=5e4+10;

vector g[maxn];

struct node{
    int val;
    bool mark;
}tree[maxn<<2];

bool vis[maxn];
int st[maxn];
int en[maxn];
int cnt;

void dfs(int u){
    st[u]=++cnt;
    for(int i=0;i>1;
    build(l,mid,i<<1);
    build(mid+1,r,i<<1|1);
}

inline void update(int i){
    if(!tree[i].mark) return;
    tree[i<<1].mark=tree[i<<1|1].mark=tree[i].mark;
    tree[i<<1].val=tree[i<<1|1].val=tree[i].val;
    tree[i].mark=0;
}

int query(int l,int r,int i,int t){
    update(i);
    if(l==r) return tree[i].val;
    int mid=l+r>>1;
    if(t<=mid) return query(l,mid,i<<1,t);
    else return query(mid+1,r,i<<1|1,t);
}

void change(int tl,int tr,int l,int r,int i,int val){
    if(tl>r||tr>1;
    change(tl,tr,l,mid,i<<1,val);
    change(tl,tr,mid+1,r,i<<1|1,val);
}

int main(){
    int T;
    scanf("%d",&T);
    for(int cs=1;cs<=T;cs++){
        printf("Case #%d:\n",cs);
        int n,m;
        scanf("%d",&n);
        memset(vis,0,sizeof vis);
        for(int i=1;i<=n;i++) g[i].clear();
        memset(tree,0,sizeof tree);
        memset(st,0,sizeof st);
        memset(en,0,sizeof en);
        cnt=0;
        for(int i=1;i

 

你可能感兴趣的:(数据结构)