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. ubuntu 14.04安装JDK

    As a workaround, you can install OpenJDK 8 from a PPA repository: 1. Open terminal from the Dash or ...

  2. JavaScript验证注册信息

    <script language="javascript"> function check_login(form){ if(form.username.value==& ...

  3. elasticsearch-head插件安装的一些坑!es6.5.4版本

    折腾了一晚上,总算成功了!,大部分坑都记录了下来,版本升级太快真实个大坑,每个版本都不一样,学的心累!! 这坑太多了!主要就是以下几点最主要的: 因为我这里只使用hear安装,不使用哪个打包工具,所以 ...

  4. 5 - django-csrf-session&cookie

    目录 1 CSRF跨站请求伪造 1.1 CSRF攻击介绍及防御 1.2 防御CSRF攻击 1.2.1 验证 HTTP Referer 字段 1.2.2 在请求地址中添加 token 并验证 1.2.3 ...

  5. 管道和xargs区别

    一直弄不懂,管道不就是把前一个命令的结果作为参数给下一个命令吗,那在 | 后面加不加xargs有什么区别 NewUserFF 写道: 懒蜗牛Gentoo 写道: 管道是实现“将前面的标准输出作为后面的 ...

  6. Mysql中truncate table和delete语句的区别

    Mysql中的truncate table和delete语句都可以删除表里面所有数据,但是在一些情况下有些不同! 例子: truncate table gag; (1)truncate table删除 ...

  7. Nodejs 发送邮件

    var nodemailer = require("nodemailer");var mailTitle='http://bemupa.forumieren.com:Best Mu ...

  8. @RequestParam,@PathParam,@PathVariable,@QueryParam注解的使用区别

    获取url模板上数据的(/{id})@DefaultValue 获取请求参数的(包括post表单提交)键值对(?param1=10&param2=20).可以设置defaultValue JA ...

  9. 洛谷P3811乘法逆元

    传送门 线性递推 #include <iostream> #include <cstdio> #include <cstring> #include <alg ...

  10. master..xp_fileexist

    declare @sql varchar(800) set @sql='E:\temp.dbf'create table #tb(a bit,b bit,c bit)   insert into #t ...