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的……完全没必要链剖,每个结点的主席树从其父节点转移过 ...
随机推荐
- WTL对话框添加背景图片
WTL91_5321_Final + VS2013 + WIN7 // MainDlg.h : interface of the CMainDlg class // ///////////////// ...
- 【SpringBoot MQ 系列】RabbitMq 核心知识点小结
[MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...
- Vmware初次安装虚拟机需要做的一些网络配置——nat模式与桥接模式
一.本机设置: 1.首先点击图中红线区域: 2.点击网络适配器 3.会出现如下区域: 4.网卡开启后设置ip地址,此处设置的ip和本机的ip没有关系,设置成你虚拟机里面运行的计算机需要的ip地址网段 ...
- Selenium实现微博自动化运营:关注、点赞、评论
目录 Selenium 是什么? 一.核心代码 二.步骤分解 1.打开浏览器 2.访问微博登录页 3.输入账号密码 4.点击登录 5.通过人机验证 6.打开我们的中公题库君首页 7.加一下关注 8.定 ...
- ReLU函数
Rectifier(neural networks) 在人工神经网络中,rectfier(整流器,校正器)是一个激活函数,它的定义是:参数中为正的部分. , 其中,x是神经元的输入.这也被称为ramp ...
- shell命令之一天一见:awk
AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一. 这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯.彼得·溫伯格和布萊恩·柯林漢姓氏的首个字 ...
- MySQL的简介
什么是数据库 1. 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同 的API(接口)用于创建,访问,管理,搜索和复制所保存的数据 2. 我们也可以将 ...
- 《Head first设计模式》之模版方法模式
模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 有些人没有咖啡就活不下去:有些人则离不开茶.两者共同的 ...
- Python3(六) 面向对象
一.类的定义 1. class Student(): name = ' ' #定义变量 age = 0 def print_file(self): #定义函数 ...
- jenkins SSH发布文件 Publish over SSH
jenkins 构建完成后需要一键发布,结构如下 A服务器 svn B服务器 jenkins C服务器 应用服务器 B从A拉取代码后打包成war,然后向C服务器拷贝war包 这里解决的就是远程拷贝问题 ...