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#高级编程》3--运算符重载
运算符的重载.C++的开发人员应该很熟悉这个概念,但这对Java 和 VB 开发人员确实全新的. 对于一些数值间的运算,如果通过方法来指定运算规则的话,不免会繁琐,这时就可以利用运算符的重载. 例: ...
- RoadFlow ASP.NET Core工作流配置文件说明
工作流配置文件及说明如下: { "Logging": { "LogLevel": { "Default": "Warning&qu ...
- sharepoint 2013工具
caml designer 2013 生成caml工具 http://camlbuilder.codeplex.com/ 设计工具 CamlDesigner2013 爬网工具 HtmlAgilityP ...
- css细节复习笔记——基本视觉格式化
css包含如此开放.如此强大的一个模型,对于这样一个模型,可以有无数种方法结合应用各种属性,可以得到的效果数不胜数. 基本框 css假定每个元素都会生成一个或多个矩形框,这称为元素框.各元素中心有一个 ...
- RabbitMq初探——消息持久化
消息持久化 前言 通过上一节,我们知道,有消息确认机制,保证了当消费者进程挂掉后,消息的不丢失. 但是如果rabbitmq挂掉呢?它的队列和消息都会丢失的.为了保证消息在rabbitmq挂掉重启后不丢 ...
- Delphi XE7的安卓程序如何调用JAVA的JAR,使用JAVA的类?
本文使用工具和全部源码下载: http://download.csdn.net/detail/sunylat/8190765 为什么我们要在Delphi XE7的安卓程序调用JAVA的JAR,使用JA ...
- Bootstrap中表单控件状态(验证状态)
Bootstrap 表单 http://www.runoob.com/try/try2.php?filename=bootstrap3-form-controlstate (这链接里有简介) &l ...
- 爬虫实战4:用selenium爬取淘宝美食
方案1:一次性爬取全部淘宝美食信息 1. spider.py文件如下 __author__ = 'Administrator' from selenium import webdriver from ...
- multiprocessor(下)
一.数据共享 展望未来,基于消息传递的并发编程是大势所趋即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分 ...
- python 第一天学习(画个正方体)
import turtleturtle.goto(200,0)turtle.goto(200,200)turtle.goto(0,200)turtle.goto(0,0)turtle.penup()t ...