题目传送门

这道题看了做了个神转换.....推荐个博客给各位大爷看看吧神犇传送门

代码敲了半天....题目也读了半天 线段树维护的东西很容易和lct混在一起 调了调能过也是很开心啊 运气比较好吧233

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=<<;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m,rt;
int next[M],sum,father[M],deep[M],first[M],second[M];
struct Edge{int u,v,from;}e[*M];
void ins(int a,int b){sum++; e[sum].u=a; e[sum].v=b; e[sum].from=next[a]; next[a]=sum;}
void insert(int a,int b){ins(a,b); ins(b,a);}
struct node{int l,r; LL sum,tag;}tr[M*];
int c[M][],fa[M],dfsum,rev[M];
void build(int x,int l,int r){
tr[x].l=l; tr[x].r=r;
if(l==r) return ;
int mid=(l+r)>>;
build(x<<,l,mid); build(x<<^,mid+,r);
}
void cal(int x,int w){tr[x].sum+=1LL*(tr[x].r-tr[x].l+)*w;}
void push_up(int x){tr[x].sum=tr[x<<].sum+tr[x<<^].sum;}
void push_down(int x){
if(!tr[x].tag) return ;
int w=tr[x].tag; tr[x].tag=;
int l=x<<,r=x<<^;
tr[l].tag+=w; cal(l,w);
tr[r].tag+=w; cal(r,w);
}
void push_add(int x,int L,int R,int w){
if(L>R) return ;
if(L<=tr[x].l&&tr[x].r<=R){
cal(x,w);
tr[x].tag+=1LL*w; return ;
}
if(tr[x].l==tr[x].r) return ;
push_down(x);
int mid=(tr[x].l+tr[x].r)>>;
if(L<=mid) push_add(x<<,L,R,w);
if(R>mid) push_add(x<<^,L,R,w);
push_up(x);
}
LL push_ans(int x,int L,int R){
if(L>R) return ;
if(L<=tr[x].l&&tr[x].r<=R) return tr[x].sum;
//if(tr[x].l==tr[x].r) return 0;
LL ans=; push_down(x);
int mid=(tr[x].l+tr[x].r)>>;
if(L<=mid) ans+=push_ans(x<<,L,R);
if(R>mid) ans+=push_ans(x<<^,L,R);
return ans;
}
void dfs(int x,int old){
father[x]=fa[x]=old;
first[x]=++dfsum;
deep[x]=deep[old]+;
push_add(,first[x],first[x],deep[x]);
for(int i=next[x];i;i=e[i].from) if(e[i].v!=old) dfs(e[i].v,x);
second[x]=dfsum;
}
bool isrt(int x){return !x||(c[fa[x]][]!=x&&c[fa[x]][]!=x);}//0也算
void down(int x){
if(!rev[x]) return ;
rev[x]=;
int l=c[x][],r=c[x][];
if(l) swap(c[l][],c[l][]),rev[l]^=;
if(r) swap(c[r][],c[r][]),rev[r]^=;
}
void rotate(int x){
int y=fa[x],z=fa[y],l=,r=;
if(c[y][]==x) l=,r=;
if(!isrt(y)) c[z][c[z][]==y]=x;
fa[y]=x; fa[x]=z; fa[c[x][r]]=y;
c[y][l]=c[x][r]; c[x][r]=y;
}
int st[M],top;
void splay(int x){
st[++top]=x; for(int i=x;!isrt(i);i=fa[i]) st[++top]=fa[i];
while(top) down(st[top--]);
while(!isrt(x)){
int y=fa[x],z=fa[y];
if(!isrt(y)){
if(c[z][]==y^c[y][]==x) rotate(x);
else rotate(y);
}
rotate(x);
}
}
bool inson(int x,int y){return first[x]<=first[y]&&second[y]<=second[x];}
int wson(int x,int y){
for(int i=next[x];i;i=e[i].from) if(e[i].v!=father[x])
if(first[e[i].v]<=first[y]&&second[y]<=second[e[i].v]) return e[i].v;
return ;
}
void add(int x,int w){
if(x==rt) push_add(,,n,w);
else if(inson(x,rt)){
int p=wson(x,rt);
push_add(,,first[p]-,w);
push_add(,second[p]+,n,w);
}
else push_add(,first[x],second[x],w);
}
int find(int x){
while(c[x][]) down(x),x=c[x][];
return x;
}
void acs(int x){
int y=;
while(x){
splay(x);
if(c[x][]) add(find(c[x][]),);
if(y) add(find(y),-);
c[x][]=y; y=x; x=fa[x];
}
}
double addup(int x){
if(x==rt) return (double)push_ans(,,n)/n;
if(inson(x,rt)){
int p=wson(x,rt);
return ((double)push_ans(,,first[p]-)+(double)push_ans(,second[p]+,n))/(n-(second[p]-first[p]+));
}
else return (double)push_ans(,first[x],second[x])/(second[x]-first[x]+);
}
void mrt(int x){splay(x); rt=x; swap(c[x][],c[x][]); rev[x]^=;}
int main()
{
int x,y;
n=read(); m=read();
for(int i=;i<n;i++) x=read(),y=read(),insert(x,y);
rt=; build(,,n); dfs(,);
char ch[];
for(int i=;i<=m;i++){
scanf("%s",ch); x=read();
if(ch[]=='Q') printf("%.10lf\n",addup(x));
else{
acs(x);
if(ch[]=='C') mrt(x);
}
}
return ;
}

bzoj3779: 重组病毒 link-cut-tree的更多相关文章

  1. [BZOJ3779]重组病毒:Link-Cut Tree+线段树

    分析 其实其他的题解说的都很清楚了. 一个点出发感染到根结点所花费的时间是路径上虚边的条数+1. RELEASE相当于\(access()\). RECENTER相当于\(makeroot()\).( ...

  2. link cut tree 入门

    鉴于最近写bzoj还有51nod都出现写不动的现象,决定学习一波厉害的算法/数据结构. link cut tree:研究popoqqq那个神ppt. bzoj1036:维护access操作就可以了. ...

  3. Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题

    A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostis ...

  4. Link/cut Tree

    Link/cut Tree 一棵link/cut tree是一种用以表示一个森林,一个有根树集合的数据结构.它提供以下操作: 向森林中加入一棵只有一个点的树. 将一个点及其子树从其所在的树上断开. 将 ...

  5. 洛谷P3690 Link Cut Tree (模板)

    Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...

  6. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  7. bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门

    link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...

  8. P3690 【模板】Link Cut Tree (动态树)

    P3690 [模板]Link Cut Tree (动态树) 认父不认子的lct 注意:不 要 把 $fa[x]$和$nrt(x)$ 混 在 一 起 ! #include<cstdio> v ...

  9. Link Cut Tree学习笔记

    从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...

  10. [CodeForces - 614A] A - Link/Cut Tree

    A - Link/Cut Tree Programmer Rostislav got seriously interested in the Link/Cut Tree data structure, ...

随机推荐

  1. Office Web Apps Server(1)

         Office Web Apps Server runs on one or more servers and provides browser-based Office file viewi ...

  2. i8浏览器不支持placeholder属性解决办法,以及解决后,文字不居中问题

    这里想实现的效果是:设置和移除文本框默认值,如下图鼠标放到文本框中的时候,灰字消失. 1.可以用简单的方式,就是给input文本框加上onfocus属性,如下代码: <input id=&quo ...

  3. resetroot_169route_python2(用于ubuntu12.04和14.04,centos系列)

    #!/usr/bin/python import os import json import subprocess from cloudinit.sources.DataSourceConfigDri ...

  4. Word2Vec词向量(一)

    一.词向量基础(一)来源背景  word2vec是google在2013年推出的一个NLP工具,它的特点是将所有的词向量化,这样词与词之间就可以定量的去度量他们之间的关系,挖掘词之间的联系.虽然源码是 ...

  5. Win7系统下删除文件时出现“正在准备再循环”的解决方法

    今天,笔者在备份文件的时候,将一个word文档从移动硬盘复制到桌面.经过一系列“复(meng)杂(bi)”的操作之后,笔者突然发现,文件无法删除了.当右键文件点击“删除”时,出现对话框显示“正在准备 ...

  6. 多线程&&I/O

    不是操作系统的,是UNIX环境高级编程的!

  7. shell 中的expect 用法

    expect一般用于实现用脚本来自动远程登录,对远程机器执行相关操作 测试机上的expect目录一般在/usr/bin/expect路径 下面是从网上查询的用法总结: 1. expect中的判断语句: ...

  8. 安装并配置maven

    1下载Maven 2添加仓库(仓库就是maven项目统一存放依赖的地方 根据groupId ArtifactId Version来组成项目依赖路径) conf——settings.xml------- ...

  9. c语言第五次作业-指针-总结博客

    本次作业亮点 1.1整体情况 本次作业主要是对上次的大作业利用指针进行改进,但是大部分同学并没有很好按照老师的要求对大作业进行改进,函数的分装性也做得不够好,由于是初步学习指针,大家在本次的作业改造中 ...

  10. [Leetcode] spiral matrix ii 螺旋矩阵

    Given an integer n, generate a square matrix filled with elements from 1 to n 2 in spiral order. For ...