BZOJ3091 城市旅行 LCT
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ3091
题意概括
鉴于本人语文不好,此题的描述原题很清晰,废话不多,请看原题。
可怕,原题是图片,不可以复制题目+删掉废话了……
题解
http://blog.csdn.net/popoqqq/article/details/40823659
这位大佬写的很好。
我的代码在找错的时候一边找,一边该,然后发现和他改的好像……
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
typedef long long LL;
const int N=50005;
struct Gragh{
int cnt,y[N*2],nxt[N*2],fst[N];
void clear(){
cnt=0;
memset(fst,0,sizeof fst);
}
void add(int a,int b){
y[++cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt;
}
}g;
int n,m;
int fa[N],son[N][2],rev[N];
LL size[N],val[N],add[N],sum[N],Lsum[N],Rsum[N],Exp[N];
bool isroot(int x){
return son[fa[x]][0]!=x&&son[fa[x]][1]!=x;
}
void pushup(int x){
int ls=son[x][0],rs=son[x][1],lsz=size[ls],rsz=size[rs];
size[x]=lsz+rsz+1;
sum[x]=sum[ls]+sum[rs]+val[x];
Lsum[x]=Lsum[ls]+(lsz+1)*val[x]+Lsum[rs]+sum[rs]*(lsz+1);
Rsum[x]=Rsum[rs]+(rsz+1)*val[x]+Rsum[ls]+sum[ls]*(rsz+1);
Exp[x]=Exp[ls]+Exp[rs]+Lsum[ls]*(rsz+1)+Rsum[rs]*(lsz+1)+val[x]*(lsz+1)*(rsz+1);
}
void pushson(int x,LL v){
if (!x)
return;
val[x]+=v,sum[x]+=v*size[x],add[x]+=v;
Lsum[x]+=v*size[x]*(size[x]+1)/2;
Rsum[x]+=v*size[x]*(size[x]+1)/2;
Exp[x]+=v*size[x]*(size[x]+1)*(size[x]+2)/6;
}
void pushrev(int x){
rev[x]^=1;
swap(son[x][0],son[x][1]);
swap(Lsum[x],Rsum[x]);
}
void pushdown(int x){
int &ls=son[x][0],&rs=son[x][1];
if (rev[x]){
rev[x]=0;
pushrev(ls);
pushrev(rs);
}
if (add[x]){
LL &a=add[x];
pushson(ls,a);
pushson(rs,a);
a=0;
}
}
void pushadd(int x){
if (!isroot(x))
pushadd(fa[x]);
pushdown(x);
}
int wson(int x){
return son[fa[x]][1]==x;
}
void rotate(int x){
if (isroot(x))
return;
int y=fa[x],z=fa[y],L=wson(x),R=L^1;
if (!isroot(y))
son[z][wson(y)]=x;
fa[x]=z,fa[y]=x,fa[son[x][R]]=y;
son[y][L]=son[x][R],son[x][R]=y;
pushup(y),pushup(x);
}
void splay(int x){
pushadd(x);
for (int y=fa[x];!isroot(x);rotate(x),y=fa[x])
if (!isroot(y))
rotate(wson(x)==wson(y)?y:x);
}
void access(int x){
int t=0;
while (x){
splay(x);
son[x][1]=t;
pushup(x);
t=x;
x=fa[x];
}
}
void rever(int x){
access(x);
splay(x);
pushrev(x);
}
void link(int x,int y){
rever(x);
fa[x]=y;
}
void cut(int x,int y){
rever(x);
access(y);
splay(y);
fa[x]=son[y][0]=0;
}
int find(int x){
access(x);
splay(x);
while (1){
pushdown(x);
if (son[x][0])
x=son[x][0];
else
break;
}
return x;
}
void dfs(int x,int pre){
fa[x]=pre;
for (int i=g.fst[x];i;i=g.nxt[i])
if (g.y[i]!=pre)
dfs(g.y[i],x);
}
LL gcd(LL a,LL b){
return b==0?a:gcd(b,a%b);
}
void solve(int x,int y){
if (find(x)!=find(y)){
puts("-1");
return;
}
rever(x);
access(y);
splay(y);
LL a=Exp[y];
LL b=size[y]*(size[y]+1)/2;
LL Gcd=gcd(a,b);
a/=Gcd,b/=Gcd;
printf("%lld/%lld\n",a,b);
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
scanf("%lld",&val[i]);
fa[i]=son[i][0]=son[i][1]=rev[i]=0;
size[i]=1,Exp[i]=Lsum[i]=Rsum[i]=sum[i]=val[i],add[i]=0;
}
g.clear();
for (int i=1,a,b;i<n;i++){
scanf("%d%d",&a,&b);
g.add(a,b),g.add(b,a);
}
dfs(1,0);
for (int i=1;i<=m;i++){
int op,x,y;
LL v;
scanf("%d%d%d",&op,&x,&y);
if (op==1){
if (find(x)==find(y))
cut(x,y);
}
else if (op==2){
if (find(x)!=find(y))
link(x,y);
}
else if (op==3){
scanf("%lld",&v);
if (find(x)!=find(y))
continue;
rever(x);
access(y);
splay(y);
pushson(y,v);
}
else
solve(x,y);
}
return 0;
}
BZOJ3091 城市旅行 LCT的更多相关文章
- 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& ...
- bzoj3091 城市旅行 LCT + 区间合并
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3091 题解 调了整个晚自习才调出来的问题. 乍一看是个 LCT 板子题. 再看一眼还是个 LC ...
- 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 ...
- 【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 ...
- 【LCT】BZOJ3091 城市旅行
3091: 城市旅行 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1927 Solved: 631[Submit][Status][Discuss ...
- BZOJ 3091: 城市旅行 [LCT splay 期望]
3091: 城市旅行 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1454 Solved: 483[Submit][Status][Discuss ...
- 【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 题解 LCT区间合并 前三个 ...
- BZOJ 3091: 城市旅行 lct 期望 splay
https://www.lydsy.com/JudgeOnline/problem.php?id=3091 https://blog.csdn.net/popoqqq/article/details/ ...
- bzoj 3091: 城市旅行 LCT
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=3091 题解: 首先前三个操作就是裸的LCT模板 只考虑第四个操作. 要求我们计算期望,所以我 ...
随机推荐
- u-boot移植(十三)---代码修改---裁剪及环境变量 二
一.错误处理 上一节遇到一个错误: print一下: 发现我们在jz2440.h中静态写的网络参数都没有写进去. dm9000 address not set. dm9000的地址未设置. 这里对应两 ...
- mysql 架构~多写模式MGR
一 简介:今天咱们来聊聊MGR的单主切换和新节点加入二 单主模式下变成多主: 1 3306 STOP group_replication; set global group_replicati ...
- 实例详析ImageView的adjustViewBonds和scaleType
android:adjustViewBounds是否保持宽高比.需要与maxWidth.MaxHeight一起使用,否则单独使用没有效果. 设置View的最大高度,单独使用无效,需要与setAdjus ...
- ubuntu 禁用 nouveau 方法
(1)直接移除这个驱动(备份出来) $ mv /lib/modules/4.4.0-31-generic/kernel/drivers/gpu/drm/nouveau/nouveau.ko /lib/ ...
- Bootstrap2.x与Bootstrap3.x的区别
做项目时,有时也会参考别的案例的优秀之处.在用Bootstrap的时候,发现很多项目代码都有区别,在<div>布局class上,有用.span*,有用.col-md-*,实际上是Boots ...
- UML和模式应用5:细化阶段(9)---迈向对象设计
1.前言 开发者如何设计对象,可以采用如下三种方式: 编码:在编码的同时进行设计 绘图然后编码:绘制一些UML,然后转到如上编码方式,在集成开发环境中编码 只绘图,不编码:使用工具从图中生成一切 本章 ...
- JDK8 Lambda表达式对代码的简化
只是举个例子: public class LambdaDemo { public static String findData( String name , LambdaInterface finde ...
- MySQL在线更改binlog格式
今天变更jboss报错如下: SQLWarning ignored: SQL state ', message [Unsafe statement written to the binary log ...
- jdk8系列一、jdk8 Lamda表达式语法、接口的默认方法和静态方法、supplier用法
一.简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性. 在本文中我们将学习这些新特性,并用实际 ...
- jvm系列五、jvm垃圾回收机制、jvm各种参数及调优
转载自:http://yufenfei.iteye.com/blog/1746914 尊重原创. 一.GC有两种类型:Scavenge GC 和Full GC 1.Scavenge GC 一般情况下, ...