题意:给一些节点简单额对应关系,可以组成一个树,如果树的某一个节点更新那么他的所有子节点都要更新,中间,会有一些查询

分析:题意倒也不难理解,但是但是不知道怎么建树。。。于是自能百度,看了kuangbin大神的博客豁然开朗,可以用每个节点的所包含的子节点段来当做线段树的节点,查找每个节点所包含的段可以用简单的DFS实现。
*************************************************************************
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std; const int MAXN = ; int Start[MAXN], End[MAXN];//每个员工所有下属的开始和结束节点,包含本身
int index;//DFS用记录节点的编号
vector<int> G[MAXN];//保存边 void DFS(int k)
{
    Start[k] = ++index;
    for(int i=,len=G[k].size(); i<len; i++)
        DFS(G[k][i]);
    End[k] = index;
} struct SegmentTree
{
    int L, R, task;
    bool isCover;
    int Mid(){return (L+R)/;}
}a[MAXN*]; void BuildTree(int r, int L, int R)
{
    a[r].L = L, a[r].R = R;
    a[r].task = -, a[r].isCover = false;     if(L == R)return ;     BuildTree(r<<, L, a[r].Mid());
    BuildTree(r<<|, a[r].Mid()+, R);
}
void Down(int r)
{
    if(a[r].L != a[r].R && a[r].isCover)
    {
        a[r<<].isCover = a[r<<|].isCover = true;
        a[r<<].task = a[r<<|].task = a[r].task;
        a[r].isCover = false;
    }
}
void Insert(int r, int L, int R, int task)
{
    Down(r);     if(a[r].L == L && a[r].R == R)
    {
        a[r].isCover = true;
        a[r].task = task;
        return ;
    }     if(R <= a[r].Mid())
        Insert(r<<, L, R, task);
    else if(L > a[r].Mid())
        Insert(r<<|, L, R, task);
    else
    {
        Insert(r<<, L, a[r].Mid(), task);
        Insert(r<<|, a[r].Mid()+, R, task);
    }
}
int  Query(int r, int k)
{
    Down(r);     if(a[r].L == a[r].R)
        return a[r].task;     if(k <= a[r].Mid())
        return Query(r<<, k);
    else
        return Query(r<<|, k);
} int main()
{
    int T, t=;     scanf("%d", &T);     while(T--)
    {
        int i, N, M, u, v; char s[];         scanf("%d", &N);         for(i=; i<=N; i++)
            G[i].clear();
        bool use[MAXN] = {};
        for(i=; i<N; i++)
        {
            scanf("%d%d",&u, &v);
            G[v].push_back(u);
            use[u] = true;
        }         index = ;
        for(i=; i<=N; i++)if(!use[i]){
            DFS(i); break;}         BuildTree(, , N);
        printf("Case #%d:\n", t++);         scanf("%d", &M);         while(M--)
        {
            scanf("%s", s);             if(s[] == 'C')
            {
                scanf("%d", &u);
                printf("%d\n", Query(, Start[u]));
            }
            else
            {
                scanf("%d%d", &u, &v);
                Insert(, Start[u], End[u], v);
            }
        }
    }     return ;
}

J - Assign the task - hdu 3974(DFS建树+简单线段树)的更多相关文章

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

    有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导).如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属.如果你是没有人的老板,那么你就没有下属 ...

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

    There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...

  3. J - Assign the task

    J - Assign the task HDU - 3974 思路:一眼秒思路<(* ̄▽ ̄*)/ dfs序+线段树. 通过dfs序把树上问题转化成线段上的问题.然后用线段树解决.    错因:都 ...

  4. R - Weak Pair HDU - 5877 离散化+权值线段树+dfs序 区间种类数

    R - Weak Pair HDU - 5877 离散化+权值线段树 这个题目的初步想法,首先用dfs序建一颗树,然后判断对于每一个节点进行遍历,判断他的子节点和他相乘是不是小于等于k, 这么暴力的算 ...

  5. HDU.1689 Just a Hook (线段树 区间替换 区间总和)

    HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...

  6. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

  7. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  8. bzoj3306: 树(dfs序+倍增+线段树)

    比较傻逼的一道题... 显然求子树最小值就是求出dfs序用线段树维护嘛 换根的时候树的形态不会改变,所以我们可以根据相对于根的位置分类讨论. 如果询问的x是根就直接输出整棵树的最小值. 如果询问的x是 ...

  9. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

随机推荐

  1. Python之路,Day4 - Python基础4 (new版)

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  2. Bridge 桥梁模式 桥接模式

    简介 将[抽象部分](Abstraction,人)与[实现部分](Implementor,人穿的衣服)分离,使它们都可以独立的变化. [业务抽象角色]引用[业务实现角色],或者说[业务抽象角色]的部分 ...

  3. GIT学习(二)-->Git分布式的好处

    分布式VS集中式(版本管理系统) 集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器down下最新的版本,然后开始干活,干完活了,再把自己的活推 ...

  4. Activity中setResult(int resultCode, Intent data)与onActivityResult(int requestCode, int resultCode, Intent data)方法的调用

    关于Activity的生命周期 onCreate(Bundle savedInstanceState):可以进行一些初始化的工作在activity第一次被创建的时候调用.这里是你做所有初始化设置的地方 ...

  5. knockoutjs关键点

    <p>Your value: <input data-bind="value: someValue, valueUpdate: 'afterkeydown'"/& ...

  6. ViewPager循环广告位的实现

    1.如何实现循环播放 2.如何实现自动循环 如何实现循环播放 现在网上实现循环播放都是在adapter的getCount()方法返回一个较大的值并且instantiateItem(ViewGroup ...

  7. android - 模拟器连接本地tomcat

    在使用android真机试图连接本地的tomcat的时候,发现一直没有反应.网上搜了很多资料,加上自己不断测试,后来发现模拟器访问tomcat的时候,ip的概念跟在pc上访问tomcat用的ip,根本 ...

  8. form表单中的label标签

    小伙伴们,你们在前面学习表单各种控件的时候,有没有发现一个标签--label,这一小节就来揭晓它的作用. label标签不会向用户呈现任何特殊效果,它的作用是为鼠标用户改进了可用性.如果你在 labe ...

  9. POJ3126 Prime Path (bfs+素数判断)

    POJ3126 Prime Path 一开始想通过终点值双向查找,从最高位开始依次递减或递增,每次找到最接近终点值的素数,后来发现这样找,即使找到,也可能不是最短路径, 而且代码实现起来特别麻烦,后来 ...

  10. 【USACO 2.3.4】货币系统

    [描述] 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单 ...