【链接】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("");

【代码】

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. const int N = 1e5;
  7.  
  8. int n, m, c[N + 10], uppest[N + 10], idx[N + 10], cnt, sz[N + 10], dep[N + 10];
  9. long long sum[(N + 10) << 2];
  10. int mi[(N + 10) << 2], ma[(N + 10) << 2], a, b, fat[N + 10];
  11. vector <int> g[N + 10];
  12.  
  13. void dfs1(int x, int fa) {
  14.     sz[x] = 1;
  15.     for (int y : g[x]) {
  16.         if (y == fa) continue;
  17.         dep[y] = dep[x] + 1;
  18.         dfs1(y, x);
  19.         sz[x] += sz[y];
  20.         fat[y] = x;
  21.     }
  22. }
  23.  
  24. void dfs2(int x, int chain) {
  25.     idx[x] = ++cnt;
  26.     uppest[x] = chain;
  27.     int ma = 0;
  28.     for (int y : g[x]) {
  29.         if (dep[y] > dep[x] && sz[y] > sz[ma]) {
  30.             ma = y;
  31.         }
  32.     }
  33.     if (ma == 0) return;
  34.     dfs2(ma, chain);
  35.     for (int y : g[x])
  36.         if (dep[y] > dep[x] && y != ma)
  37.             dfs2(y, y);
  38. }
  39.  
  40. void updata(int pos, int x, int l, int r, int rt) {
  41.     if (l == r) {
  42.         mi[rt] = ma[rt] = x;
  43.         sum[rt] = x;
  44.         return;
  45.     }
  46.     int m = (l + r) >> 1;
  47.     if (pos <= m)
  48.         updata(pos, x, l, m, rt << 1);
  49.     else
  50.         updata(pos, x, m + 1, r, rt << 1 | 1);
  51.     ma[rt] = max(ma[rt << 1 | 1], ma[rt << 1]);
  52.     mi[rt] = min(mi[rt << 1 | 1], mi[rt << 1]);
  53.     sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
  54. }
  55.  
  56. void pre() {
  57.     for (int i = 1; i <= n; i++)
  58.         updata(idx[i], c[i], 1, n, 1);
  59. }
  60.  
  61. long long get_ans(int L, int R, int l, int r, int rt) {
  62.     if (L <= l && r <= R) {
  63.         if (ma[rt] < a) return 0;
  64.         if (mi[rt] > b) return 0;
  65.         if (a <= mi[rt] && ma[rt] <= b) return sum[rt];
  66.     }
  67.     int m = (l + r) >> 1;
  68.     long long temp = 0;
  69.     if (L <= m)
  70.         temp += get_ans(L, R, l, m, rt << 1);
  71.     if (m < R)
  72.         temp += get_ans(L, R, m + 1, r, rt << 1 | 1);
  73.     return temp;
  74. }
  75.  
  76. long long calc(int x, int y) {
  77.     long long temp = 0;
  78.     while (uppest[x] != uppest[y]) {
  79.         if (dep[uppest[x]] > dep[uppest[y]]) swap(x, y);
  80.         //dep[x] < dep[y] ok
  81.         temp += get_ans(idx[uppest[y]], idx[y], 1, n, 1);
  82.         y = fat[uppest[y]];
  83.     }
  84.     if (dep[x] > dep[y]) swap(x, y);
  85.     temp += get_ans(idx[x], idx[y], 1, n, 1);
  86.     return temp;
  87. }
  88.  
  89. void deal() {
  90.     for (int i = 1; i <= m; i++) {
  91.         int s, t;
  92.         cin >> s >> t >> a >> b;
  93.         cout << calc(s, t);
  94.         if (i == m)
  95.             cout << endl;
  96.         else
  97.             cout << ' ';
  98.     }
  99. }
  100.  
  101. int main() {
  102.     //freopen("F:\\rush.txt", "r", stdin);
  103.     ios::sync_with_stdio(0), cin.tie(0);
  104.  
  105.     while (cin >> n >> m) {
  106.         for (int i = 1; i <= n; i++) cin >> c[i];
  107.         for (int i = 1; i <= n; i++) g[i].clear();
  108.         for (int i = 1; i <= n - 1; i++) {
  109.             int x, y;
  110.             cin >> x >> y;
  111.             g[x].push_back(y), g[y].push_back(x);
  112.         }
  113.  
  114.         dep[1] = 0;
  115.         dfs1(1, 0);
  116.         cnt = 0;
  117.         dfs2(1, 1);
  118.  
  119.         pre();
  120.  
  121.         deal();
  122.     }
  123.     return 0;
  124. }

【 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. Fastboot线刷“复活”之刷机心得(三)——错误处理

        在刷机的过程中可能不会是一帆风顺的.至少我是这种,总是会遇到这样或者那样的问题,下面是我为大家总结一些问题和解决办法,希望能对大家有所帮助. 一.电量问题     刷机和系统更新有一个共同的前 ...

  2. 自己写unicode转换ascii码,wchar*到char*

    对于ascii码的char事实上就是unicode码wchar的首个字节码, 如wchar[20] = "qqqq"; 在内存中排码事实上是char的'q' '\0'这类.因此我们 ...

  3. CesiumJS - 3D Tiles BIM

    CesiumJS - 3D Tiles BIM eryar@163.com 1. Introduction CesiumJS is an open-source JavaScript library ...

  4. .Net视图机制

    .Net会有默认的约定. HomeController下面的Index,会默认渲染Home/Index.cshtml. 当然可以设置成别的,比如设置成About. using System; usin ...

  5. select选择框实现跳转

    select选择框实现跳转 零.启示 1.启示把bom里面的几个对象稍微有点印象,那么主干有了,学其它的就感觉添置加瓦,很简单 就是关注树木的主干 2.万能的百度,不过当然要你基础好学得多才能看得懂, ...

  6. matlab 时频分析(短时傅里叶变换、STFT)

    短时傅里叶变换,short-time fourier transformation,有时也叫加窗傅里叶变换,时间窗口使得信号只在某一小区间内有效,这就避免了传统的傅里叶变换在时频局部表达能力上的不足, ...

  7. 58.express安装问题:express不是内部也或者外部的命令解决方案

    转自:https://www.cnblogs.com/zhangym118/p/5842094.html "Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列 ...

  8. | 插件下载陈磊SQL MD5 加密

    简介:SQL MD5 加密 下述是 SQL Server 中 MD5加密 16位和32位的 ,)) ,ModifiedOn=null ; ,)) ,ModifiedOn=null ;

  9. 错误日志写入到本地磁盘(lock 队列)

    今天照常在b站上看看编程:看到有讲错误日志处理的,自己没写过日志,就看看了看: 主要是在讲的时候牵扯到了队列和lock的知识点:这方面知识自己了解的更少,那就记录一下.

  10. netstat -p 显示 -

    http://4735839.blog.51cto.com/4725839/1418945 https://yq.aliyun.com/articles/63060