hdu6162
这题一开始把我看愣了。难道是线段树套树状数组?空间根本开不下好不好!!!
后来想到维护区间极值,从而排除不必要情况,降低复杂度。
无需修改,码量顿减……
注意,同一组数据放一行,注意行末空格。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=;
int n,m,val[maxn];
int beg[maxn],nex[maxn],to[maxn],e;
void add(int x,int y){
e++;nex[e]=beg[x];
beg[x]=e;to[e]=y;
}
int son[maxn],size[maxn],dep[maxn],f[maxn];
void dfs1(int x,int fa){
dep[x]=dep[fa]+;
f[x]=fa;
size[x]=;
son[x]=;
for(int i=beg[x];i;i=nex[i]){
int t=to[i];
if(t==fa)continue;
dfs1(t,x);
size[x]+=size[t];
if(size[t]>size[son[x]])
son[x]=t;
}
}
int id[maxn],num[maxn],top[maxn],cnt;
void dfs2(int x,int topc){
id[x]=++cnt;
num[cnt]=val[x];
top[x]=topc;
if(!son[x])return;
dfs2(son[x],topc);
for(int i=beg[x];i;i=nex[i]){
int t=to[i];
if(t==son[x]||t==f[x])
continue;
dfs2(t,t);
}
}
int tr[maxn],mx[maxn],mn[maxn];
void build(int h,int l,int r){
if(l==r){
mx[h]=mn[h]=tr[h]=num[l];
return;
}
int mid=(l+r)>>;
build(h<<,l,mid);
build(h<<|,mid+,r);
tr[h]=tr[h<<]+tr[h<<|];
mx[h]=max(mx[h<<],mx[h<<|]);
mn[h]=min(mn[h<<],mn[h<<|]);
}
int query(int h,int l,int r,int x,int y,int a,int b){
if(l>y||r<x||mx[h]<a||mn[h]>b)return ;
if(l>=x&&r<=y&&mn[h]>=a&&mx[h]<=b)return tr[h];
int mid=(l+r)>>;
return query(h<<,l,mid,x,y,a,b)+query(h<<|,mid+,r,x,y,a,b);
}
int qc(int x,int y,int a,int b){
int ans=;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans+=query(,,n,id[top[x]],id[x],a,b);
x=f[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ans+=query(,,n,id[x],id[y],a,b);
return ans;
}
signed main(){
while(scanf("%lld%lld",&n,&m)!=EOF){
e=cnt=;
memset(beg,,sizeof(beg));
for(int i=;i<=n;i++)
scanf("%lld",&val[i]);
int x,y;
for(int i=;i<n;i++){
scanf("%lld%lld",&x,&y);
add(x,y),add(y,x);
}
dfs1(,);
dfs2(,);
build(,,n);
int a,b;
for(int i=;i<=m;i++){
scanf("%lld%lld%lld%lld",&x,&y,&a,&b);
printf("%lld",qc(x,y,a,b));
if(i!=m)printf(" ");
}
puts("");
}
return ;
}
深深地感到自己的弱小。
hdu6162的更多相关文章
- hdu6162(树链剖分)
hdu6162 题意 给出一颗带点权的树,每次询问一对节点 \((u, v)\),问 \(u\) 到 \(v\) 的最短路径上所有节点权值在 \([c1, c2]\) 区间内的和. 分析 树链剖分,那 ...
- hdu6162 Ch’s gift
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6162 题目: Ch’s gift Time Limit: 6000/3000 MS (Java ...
- 【主席树】【最近公共祖先】hdu6162 Ch’s gift
题意:一棵树,每个点有个权值,m次询问,每次给你一条链和两个值a,b,问你这条链上权值在[a,b]之间的权值的和是多少. std竟然是2个log的……完全没必要链剖,每个结点的主席树从其父节点转移过 ...
随机推荐
- LUA提取免费迅雷账号
--获取http://www.521xunlei.com/ 免费迅雷账号 function getPageid() local http = require("socket.http&quo ...
- 每日一练_PAT_B1001
鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”.鲁宾逊先生和多多都很开心,因为花生正是他们的最爱.在 ...
- AJAX的出现与跨域处理
XMLHttpRequest JSON AJAX CORS 四个名词来开会 如何发请求 在前端的世界里也逛荡了不少日子了,目前已经get到大约5种发起请求的方式,主流的.非主流的. 何种方式 请求方法 ...
- 面试官:你连RESTful都不知道我怎么敢要你? 文章解析
面试官:你连RESTful都不知道我怎么敢要你?文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接口4.一致的数据格式4.系统分层5.可缓 ...
- Go语言实现:【剑指offer】斐波那契数列
该题目来源于牛客网<剑指offer>专题. 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0) n<=39 Go语言实现: 递归: ...
- 动手学习pytorch——(3)多层感知机
多层感知机(multi perceptron,MLP).对于普通的含隐藏层的感知机,由于其全连接层只是对数据做了仿射变换,而多个仿射变换的叠加仍然是一个仿射变换,即使添加更多的隐藏层,这种设计也只能与 ...
- SqlServer触发器的基础知识
触发器的基础知识:create trigger tr_name on table/view{for | after | instead of } [update][,][insert][,][dele ...
- 集智学院 “Deep X:Deep Learning with Deep Knowledge”的公开讲座---总结
人工智能旨在了解人类智能的本质,并创造出能模仿人类智能做出反应的智能机器,目前在一些领域已经取得显著的成功,如AI玩游戏.问答系统.自动驾驶.无人机.机器人.翻译.人脸识别.语音识别等领域.深度学习的 ...
- Tensorflow和pytorch安装(windows安装)
一. Tensorflow安装 1. Tensorflow介绍 Tensorflow是广泛使用的实现机器学习以及其它涉及大量数学运算的算法库之一.Tensorflow由Google开发,是GitHub ...
- linux硬盘分区、格式化、挂载超详细步骤(fdisk/parted))