[ZOJ3522]Hide and seek
题意:给一棵带边权的树,多次询问$(x,y,l)$表示如果加一条连接$x$和$y$的长为$l$的边,所有点到$x$和到$y$的最短路减少了多少
先把题目中的图放上来(雾

考虑用lct维护,先把路径提出来,然后在splay上二分找到最短路大小改变的临界点$p$,再统计答案

容易看出$p\rightarrow y$上的所有点的子树都对答案有贡献,对于一个点$p_1$,它和它的虚子树对答案的贡献都是$dis_{x,p_1}-dis_{p_1,y}-l$,即$dis_{x,y}-2dis_{p_1,y}-l$,于是我们可以维护每个点在splay中往左往右的答案(因为要换根,有区间翻转操作),再维护一下虚子树大小即可
车万题吼啊!
#include<stdio.h>
#include<string.h>
typedef long long ll;
template<class C>void swap(C&a,C&b){a^=b^=a^=b;}
int ch[100010][2],fa[100010],r[100010],siz[100010],vsiz[100010];
ll lsum[100010],rsum[100010],s[100010],v[100010];
#define ls ch[x][0]
#define rs ch[x][1]
void rev(int x){
r[x]^=1;
swap(ls,rs);
swap(lsum[x],rsum[x]);
}
void pushdown(int x){
if(r[x]){
if(ls)rev(ls);
if(rs)rev(rs);
r[x]=0;
}
}
void pushup(int x){
siz[x]=siz[ls]+siz[rs]+vsiz[x];
s[x]=s[ls]+s[rs]+v[x];
lsum[x]=lsum[ls]+lsum[rs]+(s[ls]+v[x])*siz[rs]+vsiz[x]*s[ls];
rsum[x]=rsum[ls]+rsum[rs]+(s[rs]+v[x])*siz[ls]+vsiz[x]*s[rs];
}
void rot(int x){
int y,z,f,b;
y=fa[x];
z=fa[y];
f=ch[y][0]==x;
b=ch[x][f];
fa[x]=z;
fa[y]=x;
if(b)fa[b]=y;
ch[x][f]=y;
ch[y][f^1]=b;
if(ch[z][0]==y)ch[z][0]=x;
if(ch[z][1]==y)ch[z][1]=x;
pushup(y);
pushup(x);
}
bool isrt(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
void gao(int x){
if(!isrt(x))gao(fa[x]);
pushdown(x);
}
void splay(int x){
gao(x);
int y,z;
while(!isrt(x)){
y=fa[x];
z=fa[y];
if(!isrt(y))rot((ch[z][0]==y&&ch[y][0]==x)||(ch[z][1]==y&&ch[y][1]==x)?y:x);
rot(x);
}
}
void access(int x){
int y=0;
while(x){
splay(x);
vsiz[x]+=siz[rs];
rs=y;
vsiz[x]-=siz[y];
pushup(x);
y=x;
x=fa[x];
}
}
void makert(int x){
access(x);
splay(x);
rev(x);
}
int find(int x,ll d){
int c=0;
ll al=s[x];
while(x){
pushdown(x);
if((s[ls]+v[x])*2<=al+d){
c=x;
d-=(s[ls]+v[x])*2;
x=rs;
}else
x=ls;
}
return c;
}
ll query(int x,int y,ll z){
if(x==y)return 0;
makert(x);
access(y);
splay(y);
if(s[y]<=z)return 0;
x=find(y,z);
splay(x);
return siz[rs]*(s[x]-z)-rsum[rs]*2;
}
int h[100010],nex[200010],to[200010],M;
void add(int a,int b){
M++;
to[M]=b;
nex[M]=h[a];
h[a]=M;
}
void dfs(int x){
for(int i=h[x];i;i=nex[i]){
if(to[i]!=fa[x]){
fa[to[i]]=x;
dfs(to[i]);
siz[x]+=siz[to[i]];
}
}
vsiz[x]=siz[x];
}
int main(){
int n,m,i,x,y,z;
while(~scanf("%d",&n)){
memset(h,0,sizeof(h));
memset(fa,0,sizeof(fa));
memset(ch,0,sizeof(ch));
memset(siz,0,sizeof(siz));
memset(r,0,sizeof(r));
memset(lsum,0,sizeof(lsum));
memset(rsum,0,sizeof(rsum));
memset(s,0,sizeof(s));
memset(v,0,sizeof(v));
M=0;
for(i=1;i<=n;i++)siz[i]=1;
for(i=1;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
v[n+i]=s[n+i]=z;
add(x,n+i);
add(n+i,x);
add(y,n+i);
add(n+i,y);
}
dfs(1);
scanf("%d",&m);
while(m--){
scanf("%d%d%d",&x,&y,&z);
printf("%lld\n",query(x,y,z)+query(y,x,z));
}
}
}
[ZOJ3522]Hide and seek的更多相关文章
- 【BZOJ-1941】Hide and Seek KD-Tree
1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 830 Solved: 455[Submi ...
- [BZOJ1941][Sdoi2010]Hide and Seek
[BZOJ1941][Sdoi2010]Hide and Seek 试题描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他 ...
- BZOJ3402: [Usaco2009 Open]Hide and Seek 捉迷藏
3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 51 Solved: 4 ...
- BZOJ 3402: [Usaco2009 Open]Hide and Seek 捉迷藏
题目 3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec Memory Limit: 128 MB Description 贝 ...
- 3402: [Usaco2009 Open]Hide and Seek 捉迷藏
3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 78 Solved: 6 ...
- bzoj:1941: [Sdoi2010]Hide and Seek
1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 531 Solved: 295[Submi ...
- 【BZOJ】【1941】【SDOI2010】Hide and Seek
KD-Tree 一开始看错题了
- 洛谷 P2951 [USACO09OPEN]捉迷藏Hide and Seek
题目戳 题目描述 Bessie is playing hide and seek (a game in which a number of players hide and a single play ...
- 【BZOJ1941】Hide and Seek(KD-Tree)
[BZOJ1941]Hide and Seek(KD-Tree) 题面 BZOJ 洛谷 题解 \(KD-Tree\)对于每个点搜一下最近点和最远点就好了 #include<iostream> ...
随机推荐
- 一些奇怪的JavaScript试题
JavaScript有很多地方和我们熟知的C.Java等的编程习惯不同,这些不同会产生很多让人意想不到的事情.前段时间在知乎有人发了写Javascrtip试题,觉得挺好玩的,这里跟大家分享一下. 01 ...
- BZOJ1001:狼抓兔子(最小割最大流+vector模板)
1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...
- bzoj1914 [Usaco2010 OPen]Triangle Counting 数三角形 计算机和
[Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 526 Solved: 2 ...
- oracle获取主机服务器IP
--要获取服务器端的IP :: SYS@XXX> select utl_inaddr.get_host_address from dual; GET_HOST_ADDRESS --------- ...
- fscanf函数的应用
转摘自:http://blog.csdn.net/mxgsgtc/article/details/13005675 以前老是被从文本里读取文件,然后逐个的进行字符解析,感觉非常的慢,自从知道了fsca ...
- Hackerrank [World CodeSprint 11] City Construction
传送门:https://www.hackerrank.com/contests/world-codesprint-11/challenges/hackerland [题解] 因为加点每次加1个点1条边 ...
- bzoj 1150 贪心
首先选取的线段一定是相邻两个端点线段,那么我们贪心的考虑这个问题,我们先在这n-1条线段中选出最短的一条,然后将这条线段的值改为左面的线段的值+右面的线段的值-自己的值,用这条线段取代原来这三条线段, ...
- CentOS 7 主机加固手册-中
CentOS 7 主机加固手册-上 CentOS 7 主机加固手册-中 CentOS 7 主机加固手册-下 0x0c 设置/boot/grub2/grub.cfg权限 Set grub.conf ...
- CVE-2016-6662 利用条件
首先执行SET GLOBAL 需要超级用户权限,所以利用条件要么用户本身是超级用户要么用户有trigger权限,通过创建trigger,由超级用户触发SET GLOBAL. 然而MYsql有个通过fi ...
- python2.7字典转换成json时中文字符串变成unicode的问题:
参考:http://blog.csdn.net/u014431852/article/details/53058951 编码问题: python2.7字典转换成json时中文字符串变成unicode的 ...