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.要求 ...
随机推荐
- Android开发笔记(7)——Intent启用应用软件
转载请注明:http://www.cnblogs.com/igoslly/p/6844154.html Intent启用应用软件 intent可以用来要求其他应用组件完成特定工作,如相机.电话.地图等 ...
- Domain=NSOSStatusErrorDomain Code=1937337955 关于iOS录音AVAudioRecorder与音频播放AVAudioPlayer真机调试录音不能播放的问题
error:Domain=NSOSStatusErrorDomain Code=1937337955 ,这个错误很常见, 原因是因为我们需要调用另外一个AVAudioPlayer 的初始化方法,来确定 ...
- 【Oracle】审计
1.审计的功能:监控用户在database 的 action (操作) 2.审计分类: 1) session :在同一个session,相同的语句只产生一个审计结果(默认) 2) access : 在 ...
- Linker scripts之SECTIONS
1 Purpose The linker script describes how the sections in the input files should be mapped into the ...
- OpenStack、KVM、Docker——Docker之后还需要OpenStack吗?
原文链接:http://news.csdn.net/article_preview.html?preview=1&reload=1&arcid=2823129 Docker从一个新兴的 ...
- Mysql优化-为表字段添加索引
1.添加PRIMARY KEY(主键索引): ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引) : ALTE ...
- 03--软件包管理工具 apt
APT APT(the Advanced Packaging Tool)是Ubuntu 软件包管理系统的高级界面,由几个名字以“apt-”打头的程序组成.apt-get.apt-cache ...
- Javascript阻止表单提交
Javascript阻止表单提交 Html 1.<form name="loginForm" action="login.aspx" method=&qu ...
- 脚本编写 nginx 启动
#!bin/bash#功能:本脚本编写完成后,放置在/etc/init.d/目录下,就可以被 Linux 系统自动识别到该脚本.#如果本脚本命名为/etc/init.d/nginx,则 service ...
- 解决value toDF is not a member of org.apache.spark.rdd.RDD (spark2.1 )
解决上述办法有两点: 1.两个import 需要放在 hiveCtx之后. val hiveCtx: SparkSession = SparkSession.builder.config(conf). ...