https://www.lydsy.com/JudgeOnline/problem.php?id=3091

https://blog.csdn.net/popoqqq/article/details/40823659

看题解吧,没什么好解释的。。。。板子题,

我觉得以后我写lct都可以像这样专门写个rev和add的函数出来,很好用。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
int n,m;
int fa[maxn]={},ch[maxn][]={};
long long siz[maxn]={},val[maxn]={},sum[maxn]={};
long long lsum[maxn]={},rsum[maxn]={};
long long num[maxn]={};long long ad[maxn]={};
int rev[maxn]={};int sta[maxn]={},tail=;
inline void updata(int x){
sum[x]=sum[ch[x][]]+sum[ch[x][]]+val[x];
siz[x]=siz[ch[x][]]+siz[ch[x][]]+; lsum[x]=lsum[ch[x][]]+lsum[ch[x][]]+(sum[ch[x][]]+val[x])*(siz[ch[x][]]+);
rsum[x]=rsum[ch[x][]]+rsum[ch[x][]]+(sum[ch[x][]]+val[x])*(siz[ch[x][]]+); num[x]=num[ch[x][]]+num[ch[x][]]
+lsum[ch[x][]]*(siz[ch[x][]]+)
+rsum[ch[x][]]*(siz[ch[x][]]+)
+val[x]*(siz[ch[x][]]+)*(siz[ch[x][]]+);
}
inline long long hex(long long x){return x*(x+)/;}
inline long long hex2(long long x){return x*(x+)*(x+)/;}
void Add(int x,long long v){
ad[x]+=v; sum[x]+=siz[x]*v; val[x]+=v;
lsum[x]+=hex(siz[x])*v;
rsum[x]+=hex(siz[x])*v;
num[x]+=hex2(siz[x])*v;
}
void Rev(int x){
swap(ch[x][],ch[x][]);
swap(lsum[x],rsum[x]);
rev[x]^=;
}
inline void downdata(int x){
if(rev[x]){
if(ch[x][])Rev(ch[x][]);
if(ch[x][])Rev(ch[x][]);
updata(x);
rev[x]=;
}
if(ad[x]){
if(ch[x][])Add(ch[x][],ad[x]);
if(ch[x][])Add(ch[x][],ad[x]);
updata(x);
ad[x]=;
}
}
inline bool isroot(int x){return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;}
void rotate(int x){
int y=fa[x];int fy=fa[y];
int l=ch[y][]==x?:;int r=l^;
if(!isroot(y)){
if(ch[fy][]==y)ch[fy][]=x;
else ch[fy][]=x;
}
fa[ch[x][r]]=y;fa[y]=x;fa[x]=fy;
ch[y][l]=ch[x][r];ch[x][r]=y;
updata(y);
}
void Splay(int x){
int y,fy,w=x;sta[++tail]=x;
while(!isroot(w)){ sta[++tail]=fa[w]; w=fa[w]; }
while(tail)downdata(sta[tail--]);
while(!isroot(x)){
y=fa[x];fy=fa[y];
if(!isroot(y)){
if((ch[fy][]==y)^(ch[y][]==x)) rotate(x);
else rotate(y);
}
rotate(x);
}updata(x);
}
void Access(int x){
int y=;
while(x){
Splay(x);ch[x][]=y;
updata(x);
y=x;x=fa[y];
}
}
int findfa(int x){
Access(x);Splay(x);
while(ch[x][])x=ch[x][];
return x;
}
void Reverse(int x){
Access(x);Splay(x);
Rev(x);
}
void Cut(int x,int y){
Reverse(x);Access(y);Splay(y);
if(ch[y][]==x&&!ch[x][]){fa[x]=;ch[y][]=;updata(y);}
}
void Link(int x,int y){
Reverse(x);
fa[x]=y;
}
long long mgcd(long long x,long long y){
long long z;
while(y){
z=x%y;x=y;y=z;
}return x;
}
int main(){
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){scanf("%lld",&val[i]);siz[i]=;sum[i]=lsum[i]=rsum[i]=num[i]=val[i];}
int x,y,op;long long v,aa,bb;
for(int i=;i<n;i++){
scanf("%d%d",&x,&y); if(findfa(x)!=findfa(y))Link(x,y);
}
for(int i=;i<=m;i++){
scanf("%d%d%d",&op,&x,&y);
if(op==){
if(findfa(x)==findfa(y))Cut(x,y);
}
else if(op==){
if(findfa(x)!=findfa(y))Link(x,y);
}
else if(op==){
scanf("%lld",&v);
if(findfa(x)==findfa(y)){
Reverse(x);Access(y);Splay(y);
Add(y,v);
}
}
else{
if(findfa(x)!=findfa(y)){printf("-1\n");}
else{
Reverse(x);Access(y);Splay(y);
aa=num[y];bb=hex(siz[y]);
v=mgcd(aa,bb);
printf("%lld/%lld\n",aa/v,bb/v);
}
}
}
}

BZOJ 3091: 城市旅行 lct 期望 splay的更多相关文章

  1. BZOJ 3091: 城市旅行 [LCT splay 期望]

    3091: 城市旅行 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1454  Solved: 483[Submit][Status][Discuss ...

  2. bzoj 3091: 城市旅行 LCT

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=3091 题解: 首先前三个操作就是裸的LCT模板 只考虑第四个操作. 要求我们计算期望,所以我 ...

  3. bzoj 3091 城市旅行(LCT+数学分析)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3091 [思路] 膜Popoqqq大爷的题解 click here [代码]是坑... ...

  4. BZOJ 3091 城市旅行

    Description Input Output Sample Input 4 5 1 3 2 5 1 2 1 3 2 4 4 2 4 1 2 4 2 3 4 3 1 4 1 4 1 4 Sample ...

  5. 【BZOJ3091】城市旅行 LCT

    [BZOJ3091]城市旅行 Description Input Output Sample Input 4 5 1 3 2 5 1 2 1 3 2 4 4 2 4 1 2 4 2 3 4 3 1 4 ...

  6. BZOJ3091: 城市旅行(LCT,数学期望)

    Description Input Output Sample Input 4 5 1 3 2 5 1 2 1 3 2 4 4 2 4 1 2 4 2 3 4 3 1 4 1 4 1 4 Sample ...

  7. 【BZOJ】3091: 城市旅行 Link-Cut Tree

    [题意]参考PoPoQQQ. 给定一棵树,每个点有一个点权,提供四种操作: 1.删除两点之间的连边 不存在边则无视 2.在两点之前连接一条边 两点已经联通则无视 3.在两点之间的路径上所有点的点权加上 ...

  8. bzoj3091 城市旅行 LCT + 区间合并

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3091 题解 调了整个晚自习才调出来的问题. 乍一看是个 LCT 板子题. 再看一眼还是个 LC ...

  9. BZOJ3091城市旅行——LCT区间信息合并

    题目描述 输入 输出 样例输入 4 5 1 3 2 5 1 2 1 3 2 4 4 2 4 1 2 4 2 3 4 3 1 4 1 4 1 4 样例输出 16/3 6/1 提示 对于所有数据满足 1& ...

随机推荐

  1. vue组件之间传值方式解析

    vue组件之间传值方式解析一.父组件传到子组件 1.父组件parent代码如下: <template> <div class="parent"> <h ...

  2. python作业模拟计算器开发(第五周)

    作业需求: 模拟计算器开发: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/1 ...

  3. torch.Tensor.view (Python method, in torch.Tensor)

    返回具有相同数据但大小不同的新张量.返回的张量共享相同的数据,必须具有相同数量的元素,但可能有不同的大小. Example >>> x = torch.randn(4, 4) > ...

  4. 如何编译和安装libevent【转】

    转自:http://www.open-open.com/lib/view/open1455522194089.html 来自: http://blog.csdn.net/yangzhenping/ar ...

  5. mipi 调试经验【转】

    转自:http://blog.csdn.net/g_salamander/article/details/9163455 版权声明:本文为博主原创文章,未经博主允许不得转载. 以下是最近几个月在调试 ...

  6. 我所知道的MVVM框架(转 司徒大大 )

    RubyLouvre commented on 6 Sep 2014   avalon http://avalonjs.github.io/ (使用Object.defineProperties. V ...

  7. Windows版Oracle重建EM---备注

    前提条件添加环境变量 ORACLE_HOSTNAME=<主机名:如:DESKTOP-P6J1a>ORACLE_SID=orclORACLE_UNQNAME=orcl 执行删除命令 C:\U ...

  8. java基础29 迭代器 listIterator() 及各种遍历集合的方法

    listIterator() 迭代器包含了 Iterator() 迭代器中的所有方法. 1.ListIterator的常用方法 hasPrevious() :判断是否还有上一个元素,有则返回true  ...

  9. git —— 远程仓库(创建)

    一.SSH设置 1.创建SSH Key 在用户主目录下,看看有没有.ssh目录, 如果有,再看看这个目录下 有没有id_rsa和id_rsa.pub这两个文件, 如果已经有了,可直接 跳到下一步. 如 ...

  10. python随笔(二)

    range(2,10):不包括10 range(2,10,3):步长为3 range(10,2,-1):从10到2,步长-1.