[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> ...
随机推荐
- Qt 设置应用程序图标(windows)
Step 1: 创建 xxx.rc 文件. 将ico图标文件复制到项目根目录下.然后在该目录中新建xxx.rc文件,并输入一行代码: IDI_ICON1 ICON DISCARDABLE " ...
- rsync安装使用详解
rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync.它的特性如下: 可以镜像保存整个目录树和文件系统. 可以很容易做到保持原来文件的权限.时间.软硬 ...
- JavaScript中Array(数组)的属性和方法(转)
数组有四种定义的方式 使用构造函数:var a = new Array();var b = new Array(8);var c = new Array("first", &quo ...
- HDU5772 String problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission ...
- bzoj 4999: This Problem Is Too Simple!
Description 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将i节点的值改为x. 2. Q i j x(0<=x&l ...
- 鼠标DPI和液晶显示器分辨率的关系
鼠标DPI和液晶显示器分辨率的关系 说起鼠标,有两个性能指标是我们不能忽略的.一是游戏玩家相当熟悉的扫描率(单位:Frames Per Second),二是我们今天要和大家探讨的鼠标的分辨率(单位:D ...
- 渗透测试中如何科学地使用V*P*N
环境说明 Windows7 虚拟机,作为VPN网关,负责拨VPN.VPN可以直接OPENVPN,也可以使用ShadowSocks+SSTap. Kali 虚拟机, 渗透测试工作机 配置步骤 Windo ...
- 关于集合的size的操作
1.创建集合: 创建指定大小的集合:(大小为5) db.createCollection(}) 2.插入五条数据: > db.colle1.insert({name:}) WriteResult ...
- CentOS 7 部署nginx
**二进制安装 安装Nginx源 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el ...
- MySQL MyISAM优化设置点滴
先说一点问题: Mysql中的InnoDB和MyISAM是在使用MySQL中最常用的两个表类型,各有优缺点.两种类型最主要的差别就是 InnoDB 支持事务处理与外键和行级锁.而MyISAM不支持 ...