LOJ #6022. 重组病毒
Description
支持以下操作
1.access一个点
2.问一个点上面的重链的个数
3.换根 , 并access原来的根
Solution
对于重链个数 , 我们在 \(access\) 的时候对一个点的子树进行修改 .
换根的话 , 直接 $ mroot $就好了 , 注意要先 \(mroot\) 再 \(rt=x\) , 因为要删去现在的根和 \(x\) 在原来的根下的 \(lca\) 以上那一段的贡献 .
然后查询就讨论一下根在子树内和子树外就行了 .
注意讨论修改和询问的 \(x=rt\) 的情况 .
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int head[N],nxt[N*2],to[N*2],num=0,n,m,L[N],R[N],DFN=0,ch[N][2],fa[N];
bool rev[N];ll t1[N],t2[N];int f[N][19],dep[N],rt=1;
inline void add(int x,int t){
for(int i=x;i<=n;i+=(i&(-i)))t1[i]+=t,t2[i]+=x*t;
}
inline double qry(int x){
ll s1=0,s2=0;
for(int i=x;i;i-=(i&(-i)))s1+=t1[i],s2+=t2[i];
return (double)(s1*(x+1)-s2);
}
inline void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
inline void dfs(int x,int la){
L[x]=++DFN;
for(int i=1;i<=18;i++)f[x][i]=f[f[x][i-1]][i-1];
for(int i=head[x],u;i;i=nxt[i]){
if((u=to[i])==la)continue;
fa[u]=f[u][0]=x;dep[u]=dep[x]+1;dfs(u,x);
}
add(L[x],1);add((R[x]=DFN)+1,-1);
}
inline bool isrt(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
inline void rotate(int x){
int y=fa[x];bool t=ch[y][1]==x;
ch[y][t]=ch[x][!t];fa[ch[y][t]]=y;ch[x][!t]=y;fa[x]=fa[y];
if(!isrt(y))ch[fa[y]][ch[fa[y]][1]==y]=x;
fa[y]=x;
}
inline void Rev(int x){if(x)rev[x]^=1,swap(ch[x][0],ch[x][1]);}
inline void pushdown(int x){if(rev[x])Rev(ch[x][0]),Rev(ch[x][1]),rev[x]=0;}
inline void Push(int x){if(!isrt(x))Push(fa[x]);pushdown(x);}
inline void splay(int x){
Push(x);
while(!isrt(x)){
int y=fa[x],p=fa[y];
if(isrt(y))rotate(x);
else if((ch[p][0]==y)==(ch[y][0]==x))rotate(y),rotate(x);
else rotate(x),rotate(x);
}
}
inline int lca(int x,int y){
for(int i=18;i>=0;i--)if(dep[f[x][i]]>dep[y])x=f[x][i];
return x;
}
inline void mdf(int x,int t){
if(!x)return ;
pushdown(x);
while(ch[x][0])pushdown(x),x=ch[x][0];
if(x==rt)add(1,t);
if(L[rt]<=L[x] || L[rt]>R[x])add(L[x],t),add(R[x]+1,-t);
else{
int y=lca(rt,x);
add(1,t);add(L[y],-t);add(R[y]+1,t);
}
}
inline double query(int x){
if(x==rt)return qry(n)/n;
if(L[rt]<=L[x] || L[rt]>R[x])return (qry(R[x])-qry(L[x]-1))/(R[x]-L[x]+1);
else{
int y=lca(rt,x);
return (qry(L[y]-1)+qry(n)-qry(R[y]))/(L[y]-1+n-R[y]);
}
}
inline void access(int x){
int y=0;
while(x)splay(x),mdf(ch[x][1],1),ch[x][1]=y,mdf(y,-1),x=fa[y=x];
}
inline void mroot(int x){access(x);splay(x);Rev(x);}
int main(){
freopen("shamate.in","r",stdin);
freopen("shamate.out","w",stdout);
int x,y;
cin>>n>>m;
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
link(x,y);link(y,x);
}
dfs(1,1);
char op[10];
while(m--){
scanf("%s%d",op,&x);
if(op[2]=='Q')printf("%.10lf\n",query(x));
else if(op[2]=='L')access(x);
else mroot(x),rt=x;
}
return 0;
}
LOJ #6022. 重组病毒的更多相关文章
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- BZOJ3779重组病毒LCT
题目描述 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病毒.实验在一个封闭 ...
- 【bzoj 3779】重组病毒
Description 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病毒. ...
- BZOJ 3779 重组病毒 LCT+线段树(维护DFS序)
原题干(由于是权限题我就直接砸出原题干了,要看题意概述的话在下面): Description 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力 ...
- 【BZOJ3779】重组病毒 LCT+DFS序
[BZOJ3779]重组病毒 Description 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策 ...
- bzoj 3779: 重组病毒 LCT+线段树+倍增
题目: 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病毒. 实验在一个封闭 ...
- BZOJ 3779: 重组病毒(线段树+lct+树剖)
题面 escription 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病 ...
- bzoj 3779: 重组病毒【LCT+线段树维护dfs序】
%.8lf会WA!!%.8lf会WA!!%.8lf会WA!!要%.10lf!! 和4817有点像,但是更复杂. 首先对于操作一"在编号为x的计算机中植入病毒的一个新变种,在植入一个新变种时, ...
- bzoj千题计划274:bzoj3779: 重组病毒
http://www.lydsy.com/JudgeOnline/problem.php?id=3779 有一棵树,初始每个节点有不同的颜色 操作1:根节点到x的路径上的点 染上一种没有出现过的颜色 ...
随机推荐
- C# 使用 COALESCE 表达式简化 Null 检查
下面这个判断 null 的语句: a == null ? b: a 可以用 COALESCE 表达式,简化成: a ?? b
- 类文件结构与javap的使用
此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.javap的使用与类文件结构 使用过程: java源代码: 1 package compile; ...
- dokcer 的export 、improt和save 、load
export .improt 是对容器操作也就是类似于虚拟机的快照 save .load 是针对于镜像操作的..
- iOS NSMutableArray "removeObjectIdenticalTo" vs "removeObject"
NSMutableArray 有多种可以删除元素的方法. 其中 removeObject,removeObjectIdenticalTo 这两个方法是有区别的. [anArray removeObje ...
- Keepalived_vrrp: ip address associated with VRID not present in received packet
keepalived常见的启动报错: 5913 May 16 15:26:04 localhost Keepalived_vrrp: ip address associated with VRID n ...
- django系列2--下载安装、项目创建、配置、启动
Django下载与安装 一.使用pip: 1.下载: django的官网下载页:https://www.djangoproject.com/download/ 1.使用pip安装, 在cmd命令行中输 ...
- java学习笔记—ServletConfig、ServletContext接口(13)
ServletConfig是一个由Tomcat服务器在初始化Servlet的时候创建并传递进来的一个对象. 该对象主要描述的时候一个servlet的配置信息. 如: <servlet> ...
- ocp认证052最新题库-收集整理中-1
1..Which two are true about the Archive (ARCn) processes?❑ A) They automatically delete obsolete arc ...
- 如何外部访问你的本地网站natapp
用natapp,要实名制才可以获得免得authtoken 1.注册登录: https://natapp.cn/tunnel/lists 2.这个要填写一下,端口我写的是3000 3.客户端下载 解压: ...
- android 开发 简单的小计算器
↑大致效果 项目构成: 随便写的,用的线性布局 activity_main.xml <?xml version="1.0" encoding="utf-8" ...