BZOJ 4012 树链剖分+主席树
思路:
http://blog.csdn.net/lych_cys/article/details/50763073
lych的题解…… 写得很详细
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
#define N 300050
int n,Q,A,age[N],w[N],v[N],next[N],first[N],tot,rev[N],root[N];
int xx,yy,zz,size[N],fa[N],top[N],cnt,p[N],dis[N],son[N],deep[N];
int ans,edg[N],sum[N];
struct Node{int age,id;}node[N],jy;
struct Tree{int l,r,sum,lazy;}tr[N*40];
bool operator<(Node a,Node b){return a.age<b.age;}
void add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void dfs(int x){
size[x]=1;
for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]){
fa[v[i]]=x,dis[v[i]]=dis[x]+w[i],edg[v[i]]=w[i];
deep[v[i]]=deep[x]+1,dfs(v[i]);
size[x]+=size[v[i]];
if(size[son[x]]<size[v[i]])son[x]=v[i];
}
}
void dfs(int x,int tp){
top[x]=tp,p[x]=++cnt,rev[cnt]=x;
if(son[x])dfs(son[x],tp);
for(int i=first[x];~i;i=next[i])
if(v[i]!=fa[x]&&v[i]!=son[x])dfs(v[i],v[i]);
}
void insert(int l,int r,int x,int &y,int L,int R){
y=++cnt;int mid=(l+r)>>1;
tr[y].sum=tr[x].sum,tr[y].lazy=tr[x].lazy;
if(l==L&&r==R){tr[y].l=tr[x].l,tr[y].r=tr[x].r,tr[y].lazy++;return;}
tr[y].sum+=sum[R]-sum[L-1];
if(mid<L)tr[y].l=tr[x].l,insert(mid+1,r,tr[x].r,tr[y].r,L,R);
else if(mid>=R)tr[y].r=tr[x].r,insert(l,mid,tr[x].l,tr[y].l,L,R);
else insert(l,mid,tr[x].l,tr[y].l,L,mid),insert(mid+1,r,tr[x].r,tr[y].r,mid+1,R);
}
void insert(int x,int i){
root[i]=root[i-1];
while(top[x]!=1)insert(1,n,root[i],root[i],p[top[x]],p[x]),x=fa[top[x]];
insert(1,n,root[i],root[i],1,p[x]);
}
int query(int l,int r,int x,int y,int L,int R){
int mid=(l+r)>>1,temp=(tr[y].lazy-tr[x].lazy)*(sum[R]-sum[L-1]);
if(l>=L&&r<=R){return temp+tr[y].sum-tr[x].sum;}
if(mid<L)return temp+query(mid+1,r,tr[x].r,tr[y].r,L,R);
else if(mid>=R)return temp+query(l,mid,tr[x].l,tr[y].l,L,R);
else return temp+query(l,mid,tr[x].l,tr[y].l,L,mid)+query(mid+1,r,tr[x].r,tr[y].r,mid+1,R);
}
int query(int x,int y,int u){
int temp=0;
while(top[u]!=1)temp+=query(1,n,root[x],root[y],p[top[u]],p[u]),u=fa[top[u]];
return temp+query(1,n,root[x],root[y],1,p[u]);
}
signed main(){
memset(first,-1,sizeof(first));
scanf("%lld%lld%lld",&n,&Q,&A);
for(int i=1;i<=n;i++)scanf("%lld",&node[i].age),node[i].id=i;
sort(node+1,node+1+n);
for(int i=1;i<n;i++)
scanf("%lld%lld%lld",&xx,&yy,&zz),add(xx,yy,zz),add(yy,xx,zz);
dfs(1),dfs(1,1),cnt=0;
for(int i=1;i<=n;i++)sum[i]=sum[i-1]+edg[rev[i]];
for(int i=1;i<=n;i++)insert(node[i].id,i);
for(int i=1;i<=Q;i++){
int u,a,b,l,r;
scanf("%lld%lld%lld",&u,&a,&b);
a=(a+ans)%A,b=(b+ans)%A;
if(a>b)swap(a,b);
jy.age=a,l=lower_bound(node+1,node+1+n,jy)-node-1;
jy.age=b,r=upper_bound(node+1,node+1+n,jy)-node-1;
ans=tr[root[r]].sum-tr[root[l]].sum+dis[u]*(r-l)-2*query(l,r,u);
printf("%lld\n",ans);
}
}
BZOJ 4012 树链剖分+主席树的更多相关文章
- dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448
4448: [Scoi2015]情报传递 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 588 Solved: 308[Submit][Status ...
- bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4448 题面: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络 ...
- BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树
4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...
- Codechef FIBTREE 树链剖分 主席树 LCA 二次剩余 快速幂
原文链接https://www.cnblogs.com/zhouzhendong/p/CC-FIBTREE.html 题目传送门 - CC-FIBTREE 题意 给定一个有 $n$ 个节点,初始点权都 ...
- BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链 ...
- [GDOI2016][树链剖分+主席树]疯狂动物城
题面 Description Nick 是只在动物城以坑蒙拐骗为生的狐狸,儿时受到偏见的伤害,放弃了自己的理想.他被兔子 Judy 设下圈套,被迫与她合作查案,而卷入意想不到的阴谋,历尽艰险后成为搭档 ...
- HDU 5111 Alexandra and Two Trees 树链剖分 + 主席树
题意: 给出两棵树,每棵树的节点都有一个权值. 同一棵树上的节点的权值互不相同,不同树上节点的权值可以相同. 要求回答如下询问: \(u_1 \, v_1 \, u_2 \, v_2\):询问第一棵树 ...
- 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治
LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...
- BZOJ3531 SDOI2014 旅行 - 树链剖分,主席树
题意:给定一棵树,树上每个点有权值和类型.支持:修改某个点的类型:修改某个点的权值:询问某条链上某个类型的点的和/最大值.点数/类型数/询问数<=100000. 分析: 树链剖分,对每个类型的点 ...
- BZOJ4012 HNOI2015开店(树链剖分+主席树)
考虑这样一个问题:一棵树初始全是白点,有两种操作:把一个点染黑:询问某点到所有黑点的距离之和. 注意到树上两点x和y的距离为depth[x]+depth[y]-depth[lca(x,y)]*2.要求 ...
随机推荐
- Java基础9一面向对象
继承 1.特点 a) 要有一定的层次结构,并且具备可传递性. b) 判断两者之间是否有继承关系通过is-a来判断. c) 子类继承了父类,那么子类就继承了父类中所有的属性和方法,但是父类中的私有属性和 ...
- MySQL 5.6 Reference Manual-14.6 InnoDB Table Management
14.6 InnoDB Table Management 14.6.1 Creating InnoDB Tables 14.6.2 Moving or Copying InnoDB Tables to ...
- 腾讯云TrustAsia DV SSL CA证书的申请及使用
1.证书申请及管理 对于已经拥有域名及公网服务器的用户,可以通过腾讯云申请TrustAsia DV SSL CA证书,证书申请流程包含填写基本信息和域名认证两步,非常清晰和简单,没有什么需要过 ...
- easyui的datetimebox时间格式化详解
今天公司让用easyui的datetimebox组件,而且还要让格式化成大家通用的那种,网上搜了很多,但差不多都是复制黏贴的,最后请教了下螃蟹. 感谢螃蟹抽空给做了个例子,现在拿出来和大家分享下,效果 ...
- Struts2学习笔记 - Part.01
1.关于Struts2中的struts.xml文件中action设置 <!-- 它是一个通用action,此处的*表明它可以处理任意的请求--> <action name=" ...
- switch穿透中语句的执行顺序
Day04_SHJavaTraing_4-6-2017 计算下列switch语句的运行结果 1. int x = 2,y=3; switch(x){ default: y++; case 3: y++ ...
- highcharts例子
直接看代码 <script language="JavaScript"> $(document).ready(function() { $.ajax({ type:'p ...
- 接口测试及Postman工具
首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口.系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你提供一个他们写 ...
- http-server 简介 复制的
http-server 简介 https://blog.csdn.net/ithanmang/article/details/88375259http-server 是一个简单的零配置的命令行 htt ...
- 实现el-dialog的拖拽,全屏,缩小功能
基于el-dialog, 封装了一下.,实在懒得写,所以直接把代码 粘出来了 大概粘了一下效果.自己体会把. 组件使用 <el-dialog v-dialogDrag ref="xhz ...