【 2017 Multi-University Training Contest - Team 9 && hdu 6162】Ch’s gift
【链接】h在这里写链接
【题意】
【题解】
【错的次数】
【反思】
【代码】
- #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的更多相关文章
- 【2017 Multi-University Training Contest - Team 7 && hdu 6121】Build a tree
[链接]点击打开链接 [题意] 询问n个点的完全k叉树,所有子树节点个数的异或总和为多少. [题解] 考虑如下的一棵k=3叉树,假设这棵树恰好有n个节点. 因为满的k叉树,第i层的节点个数为k^(i- ...
- 【HDU 6162】 Ch’s gift
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6162 [算法] 离线树剖 我们知道,u到v路径上权值为[A,B]的数的和 = u到v路径上权值小于 ...
- 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 ...
- 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 ...
- 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) ...
- 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 ...
- 【2017中国大学生程序设计竞赛 - 网络选拔赛 && hdu 6154】CaoHaha's staff
[链接]点击打开链接 [题意] 给你一个面积,让你求围成这个面积最少需要几条边,其中边的连线只能是在坐标轴上边长为1的的线或者是两个边长为1 的线的对角线. [题解] 找规律题 考虑s[i]表示i条边 ...
- 【2017中国大学生程序设计竞赛 - 网络选拔赛 hdu 6150】Vertex Cover
[链接]点击打开链接 [题意] 有人写了一个最小点覆盖的贪心算法,然后,让你去hack它. 并且,要求这个算法得到的错误答案,是正确答案的三倍. 让你任意输出hack数据,点数<=500 [题解 ...
- 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 ...
随机推荐
- Fastboot线刷“复活”之刷机心得(三)——错误处理
在刷机的过程中可能不会是一帆风顺的.至少我是这种,总是会遇到这样或者那样的问题,下面是我为大家总结一些问题和解决办法,希望能对大家有所帮助. 一.电量问题 刷机和系统更新有一个共同的前 ...
- 自己写unicode转换ascii码,wchar*到char*
对于ascii码的char事实上就是unicode码wchar的首个字节码, 如wchar[20] = "qqqq"; 在内存中排码事实上是char的'q' '\0'这类.因此我们 ...
- CesiumJS - 3D Tiles BIM
CesiumJS - 3D Tiles BIM eryar@163.com 1. Introduction CesiumJS is an open-source JavaScript library ...
- .Net视图机制
.Net会有默认的约定. HomeController下面的Index,会默认渲染Home/Index.cshtml. 当然可以设置成别的,比如设置成About. using System; usin ...
- select选择框实现跳转
select选择框实现跳转 零.启示 1.启示把bom里面的几个对象稍微有点印象,那么主干有了,学其它的就感觉添置加瓦,很简单 就是关注树木的主干 2.万能的百度,不过当然要你基础好学得多才能看得懂, ...
- matlab 时频分析(短时傅里叶变换、STFT)
短时傅里叶变换,short-time fourier transformation,有时也叫加窗傅里叶变换,时间窗口使得信号只在某一小区间内有效,这就避免了传统的傅里叶变换在时频局部表达能力上的不足, ...
- 58.express安装问题:express不是内部也或者外部的命令解决方案
转自:https://www.cnblogs.com/zhangym118/p/5842094.html "Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列 ...
- | 插件下载陈磊SQL MD5 加密
简介:SQL MD5 加密 下述是 SQL Server 中 MD5加密 16位和32位的 ,)) ,ModifiedOn=null ; ,)) ,ModifiedOn=null ;
- 错误日志写入到本地磁盘(lock 队列)
今天照常在b站上看看编程:看到有讲错误日志处理的,自己没写过日志,就看看了看: 主要是在讲的时候牵扯到了队列和lock的知识点:这方面知识自己了解的更少,那就记录一下.
- netstat -p 显示 -
http://4735839.blog.51cto.com/4725839/1418945 https://yq.aliyun.com/articles/63060