2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】
Ch’s gift
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1354 Accepted Submission(s): 496
Cui is working off-campus and he misses his girl friend very much.
After a whole night tossing and turning, he decides to get to his girl
friend's city and of course, with well-chosen gifts. He knows neither
too low the price could a gift be since his girl friend won't like it,
nor too high of it since he might consider not worth to do. So he will
only buy gifts whose price is between [a,b].
There are n cities in
the country and (n-1) bi-directional roads. Each city can be reached
from any other city. In the ith city, there is a specialty of price ci
Cui could buy as a gift. Cui buy at most 1 gift in a city. Cui starts
his trip from city s and his girl friend is in city t. As mentioned
above, Cui is so hurry that he will choose the quickest way to his girl
friend(in other words, he won't pass a city twice) and of course, buy as
many as gifts as possible. Now he wants to know, how much money does he
need to prepare for all the gifts?
For each case:
The first line contains tow integers n,m(1≤n,m≤10^5), representing the number of cities and the number of situations.
The second line contains n integers c1,c2,...,cn(1≤ci≤10^9), indicating the price of city i's specialty.
Then n-1 lines follows. Each line has two integers x,y(1≤x,y≤n), meaning there is road between city x and city y.
Next
m line follows. In each line there are four integers
s,t,a,b(1≤s,t≤n;1≤a≤b≤10^9), which indicates start city, end city, lower
bound of the price, upper bound of the price, respectively, as the
exact meaning mentioned in the description above
5 3
1 2 1 3 2
1 2
2 4
3 1
2 5
4 5 1 3
1 1 1 1
3 5 2 3
将询问拆成1-x,1-y,1-LCA(x,y),则处理的问题转化为从根到节点的链上的问题。
解决这个问题,我们可以在dfs时向treap插入当前的数,在退出时删除这个数,并且每次维护在该点上的答案。
当然也可以将所有的查询和点权排序,用树链剖分做这个题,在线段树上面插入就ok。
#include<stdio.h>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long
vector<LL> G[];
typedef struct
{
LL id;
LL x, y;
LL l, r;
}Quer;
Quer s[], cnt[];
LL tre[];
LL n, val[], son[], fa[], siz[], dep[];
LL k, top[], rak[], id[], anl[], anr[];
bool comp1(Quer a, Quer b)
{
if(a.l<b.l)
return ;
return ;
}
bool compr(Quer a, Quer b)
{
if(a.r<b.r)
return ;
return ;
}
void Sechs(LL u, LL p)
{
LL v, i;
fa[u] = p;
dep[u] = dep[p]+;
for(i=;i<G[u].size();i++)
{
v = G[u][i];
if(v==p)
continue;
Sechs(v, u);
siz[u] += siz[v]+;
if(son[u]== || siz[v]>siz[son[u]])
son[u] = v;
}
}
void Sechr(LL u, LL p)
{
LL v, i;
top[u] = p;
rak[u] = ++k, id[k] = u;
if(son[u]==)
return;
Sechr(son[u], p);
for(i=;i<G[u].size();i++)
{
v = G[u][i];
if(v==son[u] || v==fa[u])
continue;
Sechr(v, v);
}
} void Update(LL l, LL r, LL x, LL a, LL b)
{
LL m;
if(l==r)
{
tre[x] += b;
return;
}
m = (l+r)/;
if(a<=m)
Update(l, m, x*, a, b);
else
Update(m+, r, x*+, a, b);
tre[x] = tre[x*]+tre[x*+];
}
LL Query(LL l, LL r, LL x, LL a, LL b)
{
LL m, sum = ;
if(l>=a && r<=b)
return tre[x];
m = (l+r)/;
if(a<=m)
sum += Query(l, m, x*, a, b);
if(b>=m+)
sum += Query(m+, r, x*+, a, b);
return sum;
}
LL TreQuery(LL x, LL y)
{
LL sum, p1, p2;
p1 = top[x], p2 = top[y], sum = ;
while(p1!=p2)
{
if(dep[p1]<dep[p2])
swap(p1, p2), swap(x, y);
sum += Query(, n, , rak[p1], rak[x]);
x = fa[p1], p1 = top[x];
}
if(dep[x]>dep[y])
swap(x, y);
sum += Query(, n, , rak[x], rak[y]);
return sum;
} int main(void)
{
LL i, j, x, y, q;
while(scanf("%lld%lld", &n, &q)!=EOF)
{
for(i=;i<=n;i++)
G[i].clear();
for(i=;i<=n;i++)
{
scanf("%lld", &val[i]);
cnt[i].id = i;
cnt[i].r = val[i];
}
sort(cnt+, cnt+n+, compr);
for(i=;i<=n-;i++)
{
scanf("%lld%lld", &x, &y);
G[x].push_back(y);
G[y].push_back(x);
}
memset(siz, , sizeof(siz));
memset(son, , sizeof(son));
k = ;
Sechs(, );
Sechr(, );
for(i=;i<=q;i++)
{
scanf("%lld%lld%lld%lld", &s[i].x, &s[i].y, &s[i].l, &s[i].r);
s[i].id = i;
} sort(s+, s+q+, comp1);
memset(tre, , sizeof(tre));
j = ;
for(i=;i<=q;i++)
{
while(cnt[j].r<s[i].l && j<=n)
{
Update(, n, , rak[cnt[j].id], cnt[j].r);
j += ;
}
anl[s[i].id] = TreQuery(s[i].x, s[i].y);
} sort(s+, s+q+, compr);
memset(tre, , sizeof(tre));
j = ;
for(i=;i<=q;i++)
{
while(cnt[j].r<=s[i].r && j<=n)
{
Update(, n, , rak[cnt[j].id], cnt[j].r);
j += ;
}
anr[s[i].id] = TreQuery(s[i].x, s[i].y);
} printf("%lld", anr[]-anl[]);
for(i=;i<=q;i++)
printf(" %lld", anr[i]-anl[i]);
printf("\n");
}
return ;
}
2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】的更多相关文章
- 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1002&&hdu 6034
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- HDU 6162 - Ch’s gift | 2017 ZJUT Multi-University Training 9
/* HDU 6162 - Ch’s gift [ LCA,线段树 ] | 2017 ZJUT Multi-University Training 9 题意: N节点的树,Q组询问 每次询问s,t两节 ...
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】
Dying Light Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
CSGO Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】
Big binary tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】
Colorful Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 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 ...
随机推荐
- mybatis防止sql注入
SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者).[摘自] SQL injection - Wikipedi ...
- 【二十一】基于mysqli的表格数据练习
mysqlitest.php <?php //调用数据库的函数 function connetionsql(){ $conn=mysqli_connect("127.0.0.1&quo ...
- iOS常见的几种加密方法(base64.MD5.Token传值.系统指纹验证。。加密)
普通加密方法是讲密码进行加密后保存到用户偏好设置中 钥匙串是以明文形式保存,但是不知道存放的具体位置 一. base64加密 base64 编码是现代密码学的基础 基本原理: 原本是 8个bit 一组 ...
- Java中的集合概述
Java中的集合类有两个重要的分支,分别是接口Collection(包括List,Set等)和接口Map. 由于HashSet的内部实现原理使用了HashMap,所以我们先来了解Map集合类. 1.H ...
- C# 内存模型
C# 内存模型 This is the first of a two-part series that will tell the long story of the C# memory model. ...
- ES6中Promise对象个人理解
Promise是ES6原生提供的一个用来传递异步消息的对象.它减少了传统ajax金字塔回调,可以将异步操作以同步操作的流程表达出来使得代码维护和可读性方面好很多. Promise的状态: 既然是用来传 ...
- shell 踩坑记
变量赋值时,等号两边不能有空格: 在判断表达式中,不论是 [ -n "$1" ] 还是 [ -f "$1" ] 都要在变量两侧加上双引号: 在使用与或非判断式 ...
- 跟我一起,利用bitcms内容管理系统从0到1学习小程序开发:一、IIS下SSL环境搭建
缘起 1.从事互联网十来年了,一直想把自己的从事开发过程遇到的问题给写出来,分享给大家.可是可是这只是个种想法,想想之后就放下了,写出来的类文章是少之又少.古人说无志之人常立志,有志之人立长志.今天, ...
- VS的使用插件
1. 插件安装: 1) productivity power tools:代码查看优化插件: 2) Visaul Studio Color Theme Editor 主题修改插件: 3) VS ...
- python中使用递归实现反转链表
反转链表一般有两种实现方式,一种是循环,另外一种是递归,前几天做了一个作业,用到这东西了. 这里就做个记录,方便以后温习. 递归的方法: class Node: def __init__(self,i ...