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 ...
随机推荐
- DWR3.0 服务器推送及解惑
前言:在慕课网上学习一下服务器推送给客户端技术,代码亲测过,没毛病,今天整理记录一下: 一.环境搭建 直接上图,简单粗暴,myeclipse上file->new->WebProject 二 ...
- javaweb添加拦截器
js请求后台代码添加拦截器: package com.ctzj.biz.isale.deploy.controller; import java.io.IOException; import java ...
- iOS 用户密码 数字字母特殊符号设置 判断
//直接调用这个方法就行 -(int)checkIsHaveNumAndLetter:(NSString*)password{ //数字条件 NSRegularExpression *tNumRegu ...
- mac上虚拟机安装旧版本的macosx 10.8
前言 由于测试的需要,需要10.8的macosx,但又不想降级自己mac版本,所以还是装虚拟机,Parallels Desktop试验了安装不了osx,就换VMware Fusion,发现是可以的. ...
- 视觉SLAM中相机详解
视觉SLAM中,通常是指使用相机来解决定位和建图问题. SLAM中使用的相机往往更加简单,不携带昂贵的镜头,以一定的速率拍摄周围的环境,形成一个连续的视频流. 相机分类: 单目相机:只是用一个摄像头进 ...
- python 字符串中的%s与format
你可以选择字符串拼接,你也可以选择使用%s或者是format,下面简单介绍一下它们的使用方法: # 在字符串后面跟%,然后后面加上要被替换的值 print('I like %s' % 'apples' ...
- bootstrap 导航栏鼠标悬停显示下拉菜单
在jsp中加入一下代码: .navbar .nav > li:hover .dropdown-menu { display: block;} 全部代码如下所示: <%@ page lang ...
- 妙味课堂:JavaScript初级--第12课:json与数组
1.json数据格式及json语法 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- 关于php中,记录日志中,将数组转为json信息记录日志时遇到的问题总结
1 中文编码化,无法看到具体的中文,如:你好 => \u4F60\u597D 解决方案:可以使用 json_encode($arr,JSON_UNESCAPED_UNICODE) 转义中文[ ...
- CSS开发规范
虽然很久之前整理过一份简单的CSS规范,但是当时写的也不是很全面,有些细节也没有照顾到.记录一份较详细的版本,以备不时之需. 命名规范 [强制] class一律使用小写字母+下划线格式命名 例: cl ...