【链接】h在这里写链接


【题意】


给你一棵树,每个节点上都有一个权值.
然后给你m个询问,每个询问(x,y,a,b);
表示询问x->y这条路径上权值在[a,b]范围内的节点的权值和.

【题解】


树链剖分题。
在树链上建一个线段树,线段树的每个节点存3个值,max[i],min[i],sum[i]分别表示这个区间里面的数的最大值、最小值、以及权值和。
然后在线段树上做查找(a,b)范围内的数的权值和。
如果该节点在路径上,那么如果a<=min[i] && max[i] <= b的话,直接返回sum[i],否则如果不在范围里,直接范围0(肯定不在的话);
如果没办法确定在不在,则继续往下走。

【错的次数】


2

【反思】


关了同步之后,不能用puts("");

【代码】

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std; const int N = 1e5; int n, m, c[N + 10], uppest[N + 10], idx[N + 10], cnt, sz[N + 10], dep[N + 10];
long long sum[(N + 10) << 2];
int mi[(N + 10) << 2], ma[(N + 10) << 2], a, b, fat[N + 10];
vector <int> g[N + 10]; void dfs1(int x, int fa) {
    sz[x] = 1;
    for (int y : g[x]) {
        if (y == fa) continue;
        dep[y] = dep[x] + 1;
        dfs1(y, x);
        sz[x] += sz[y];
        fat[y] = x;
    }
} void dfs2(int x, int chain) {
    idx[x] = ++cnt;
    uppest[x] = chain;
    int ma = 0;
    for (int y : g[x]) {
        if (dep[y] > dep[x] && sz[y] > sz[ma]) {
            ma = y;
        }
    }
    if (ma == 0) return;
    dfs2(ma, chain);
    for (int y : g[x])
        if (dep[y] > dep[x] && y != ma)
            dfs2(y, y);
} void updata(int pos, int x, int l, int r, int rt) {
    if (l == r) {
        mi[rt] = ma[rt] = x;
        sum[rt] = x;
        return;
    }
    int m = (l + r) >> 1;
    if (pos <= m)
        updata(pos, x, l, m, rt << 1);
    else
        updata(pos, x, m + 1, r, rt << 1 | 1);
    ma[rt] = max(ma[rt << 1 | 1], ma[rt << 1]);
    mi[rt] = min(mi[rt << 1 | 1], mi[rt << 1]);
    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
} void pre() {
    for (int i = 1; i <= n; i++)
        updata(idx[i], c[i], 1, n, 1);
} long long get_ans(int L, int R, int l, int r, int rt) {
    if (L <= l && r <= R) {
        if (ma[rt] < a) return 0;
        if (mi[rt] > b) return 0;
        if (a <= mi[rt] && ma[rt] <= b) return sum[rt];
    }
    int m = (l + r) >> 1;
    long long temp = 0;
    if (L <= m)
        temp += get_ans(L, R, l, m, rt << 1);
    if (m < R)
        temp += get_ans(L, R, m + 1, r, rt << 1 | 1);
    return temp;
} long long calc(int x, int y) {
    long long temp = 0;
    while (uppest[x] != uppest[y]) {
        if (dep[uppest[x]] > dep[uppest[y]]) swap(x, y);
        //dep[x] < dep[y] ok
        temp += get_ans(idx[uppest[y]], idx[y], 1, n, 1);
        y = fat[uppest[y]];
    }
    if (dep[x] > dep[y]) swap(x, y);
    temp += get_ans(idx[x], idx[y], 1, n, 1);
    return temp;
} void deal() {
    for (int i = 1; i <= m; i++) {
        int s, t;
        cin >> s >> t >> a >> b;
        cout << calc(s, t);
        if (i == m)
            cout << endl;
        else
            cout << ' ';
    }
} int main() {
    //freopen("F:\\rush.txt", "r", stdin);
    ios::sync_with_stdio(0), cin.tie(0);     while (cin >> n >> m) {
        for (int i = 1; i <= n; i++) cin >> c[i];
        for (int i = 1; i <= n; i++) g[i].clear();
        for (int i = 1; i <= n - 1; i++) {
            int x, y;
            cin >> x >> y;
            g[x].push_back(y), g[y].push_back(x);
        }         dep[1] = 0;
        dfs1(1, 0);
        cnt = 0;
        dfs2(1, 1);         pre();         deal();
    }
    return 0;
}

【 2017 Multi-University Training Contest - Team 9 && hdu 6162】Ch’s gift的更多相关文章

  1. 【2017 Multi-University Training Contest - Team 7 && hdu 6121】Build a tree

    [链接]点击打开链接 [题意] 询问n个点的完全k叉树,所有子树节点个数的异或总和为多少. [题解] 考虑如下的一棵k=3叉树,假设这棵树恰好有n个节点. 因为满的k叉树,第i层的节点个数为k^(i- ...

  2. 【HDU 6162】 Ch’s gift

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6162 [算法] 离线树剖 我们知道,u到v路径上权值为[A,B]的数的和 = u到v路径上权值小于 ...

  3. 2017 Multi-University Training Contest - Team 2 &&hdu 6050 Funny Function

    Funny Function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. 2017 Multi-University Training Contest - Team 2 &&hdu 6053 TrickGCD

    TrickGCD Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  5. 2017 Multi-University Training Contest - Team 2&&hdu 6047 Maximum Sequence

    Maximum Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. 2017 Multi-University Training Contest - Team 2 &hdu 6055 Regular polygon

    Regular polygon Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  7. 【2017中国大学生程序设计竞赛 - 网络选拔赛 && hdu 6154】CaoHaha's staff

    [链接]点击打开链接 [题意] 给你一个面积,让你求围成这个面积最少需要几条边,其中边的连线只能是在坐标轴上边长为1的的线或者是两个边长为1 的线的对角线. [题解] 找规律题 考虑s[i]表示i条边 ...

  8. 【2017中国大学生程序设计竞赛 - 网络选拔赛 hdu 6150】Vertex Cover

    [链接]点击打开链接 [题意] 有人写了一个最小点覆盖的贪心算法,然后,让你去hack它. 并且,要求这个算法得到的错误答案,是正确答案的三倍. 让你任意输出hack数据,点数<=500 [题解 ...

  9. 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

随机推荐

  1. java同步包种ArrayBlockingQueue类的分析与理解

    前言: ArrayBlockingQueue类是一个堵塞队列.重要用于多线程操作的条件. 一,官方解释 一个建立在数组之上被BlockingQueue绑定的堵塞队列.这个队列元素顺序是先进先出.队列的 ...

  2. TRIZ系列-创新原理-31-多孔材料原理

    多孔材料原理的详细描写叙述例如以下:1)让物体变成多孔的.或者使用辅助的多孔部件(如插入,覆盖):2)假设一个物体已经是多孔了,那么事先往里面填充某种物质:这个原理提出的原因是,一般机械系统通常都是由 ...

  3. POJ 1325 &amp;&amp; ZOJ 1364--Machine Schedule【二分图 &amp;&amp; 最小点覆盖数】

    Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13071   Accepted: 5575 ...

  4. 【Android】利用自己定义View的重绘实现拖动移动,获取组件的尺寸

    以下利用一个app来说明怎样利用自己定义View的重绘实现拖动移动.获取组件的尺寸. 例如以下图,触摸拖动,或者轻轻点击屏幕都能移动图片.假设碰到文字,则会弹出提示. 这里是利用自己定义View的重绘 ...

  5. 运行maven项目出现的报错

    java问题:严重: Error configuring application listener of class org.springframework.web.context.Cont 解决方案 ...

  6. Http协议简介【转】

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  7. hq-源码编译

    这里编译整个项目的基本格式是 ./mk + 平台名 +项目名_客户名 +mmm +new 例如 ./mk hq6735_65c_b1k_l1 al811_doov mmm new 编译单个模块 ./m ...

  8. #学习笔记#——JavaScript 数组部分编程(三)

    3.在数组 arr 末尾添加元素 item.不要直接修改数组 arr,结果返回新的数组 主要考察数组的concat方法,代码如下: arr.concat(item); concat 方法不修改原数组. ...

  9. 洛谷 P1255 数楼梯

    P1255 数楼梯 题目描述 楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶. 编一个程序,计算共有多少种不同的走法. 输入输出格式 输入格式: 一个数字,楼梯数. 输出格式: 走的方式几种. 输入 ...

  10. Chormium线程模型及应用指南

    核心概念 设计上遵循以下原则: 1 不要在UI线程做不论什么堵塞式的I/O操作,以及其他耗时的操作,通过消息传递把各种操作传给相应用途的线程去做. 2 不鼓舞线程加锁机制和线程安全对象. 对象仅仅存在 ...