这题一开始把我看愣了。难道是线段树套树状数组?空间根本开不下好不好!!!

后来想到维护区间极值,从而排除不必要情况,降低复杂度。

无需修改,码量顿减……

注意,同一组数据放一行,注意行末空格。

#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的更多相关文章

  1. hdu6162(树链剖分)

    hdu6162 题意 给出一颗带点权的树,每次询问一对节点 \((u, v)\),问 \(u\) 到 \(v\) 的最短路径上所有节点权值在 \([c1, c2]\) 区间内的和. 分析 树链剖分,那 ...

  2. hdu6162 Ch’s gift

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6162 题目: Ch’s gift Time Limit: 6000/3000 MS (Java ...

  3. 【主席树】【最近公共祖先】hdu6162 Ch’s gift

     题意:一棵树,每个点有个权值,m次询问,每次给你一条链和两个值a,b,问你这条链上权值在[a,b]之间的权值的和是多少. std竟然是2个log的……完全没必要链剖,每个结点的主席树从其父节点转移过 ...

随机推荐

  1. C# 接口和继承

    转:https://www.cnblogs.com/songhe123/p/9558545.html 接口是方法的抽象,如果不同的类有同样的方法,那么就应该考虑使用接口. 例1: using Syst ...

  2. DaSiamRPN学习

    9月14日,2018年视觉目标跟踪挑战赛(Visual-Object-Tracking Challenge 2018)的结果在ECCV Workshop上揭晓.VOT2018共设三项任务:Baseli ...

  3. error C2338: No Q_OBJECT in the class with the signal (NodeCreator.cpp)

    在Qt中,当派生类需要用到信号与槽机制时,有两个要求. 1.该类派生自QObject类. 2.类中有Q_OBJECT宏. 本次报错的原因就是因为没有在类中添加Q_OBJECT宏. 而我的出错原因更傻逼 ...

  4. ElasticSearch基础入门学习笔记

    前言 本笔记的内容主要是在从0开始学习ElasticSearch中,按照官方文档以及自己的一些测试的过程. 安装 由于是初学者,按照官方文档安装即可.前面ELK入门使用主要就是讲述了安装过程,这里不再 ...

  5. pos 访问超时 windows连接超时 497 天后未关闭 TIME_WAIT

    问题描述: nginx连接后台tomcat程序 一直报错 nginx的error日志如下 // :: [error] #: *: A connection attempt failed because ...

  6. df du 文件空间管理 命令

     df  可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力. du 可以查看文件及文件夹的大小.     df:常用   df -h    以易读形式显示 磁盘空间 linux ...

  7. clr via c# 程序集加载和反射(2)

    查看,clr via c# 程序集加载和反射(1) 8,发现类型的成员: 字段,构造器,方法,属性,事件,嵌套类型都可以作为类型成员.其包含在抽象类MemberInfo中,封装了所有类型都有的一组属性 ...

  8. 常用js封装

    //获取url参数 function getUrlParams(name, url) { if (!url) url = location.href; name = name.replace(/[\[ ...

  9. SAP 对HU做转库操作,系统报错 - 系统状态HUAS是活动的 - 分析

    SAP 对HU做转库操作,系统报错 - 系统状态HUAS是活动的 - 分析 近日收到业务团队报的问题,说是对某个HU做转库时候,系统报错.如下图示: HU里有是三个序列号, 1191111034011 ...

  10. ORACLE ANALYZE使用小结

      ANALYZE的介绍     使用ANALYZE可以收集或删除对象的统计信息.验证对象的结构.标识表或cluster中的行迁移/行链接信息等.官方文档关于ANALYZE功能介绍如下: ·      ...