bzoj 3091 城市旅行(LCT+数学分析)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=3091
【思路】
膜Popoqqq大爷的题解 click here
【代码】是坑。。。
#include<cstdio>
#include<cstring>
#include<iostream>
#define FOR(a,b,c) for(int a=b;a<=c;a++)
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
using namespace std; typedef long long ll;
const int N = 4e5+; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
} namespace LCT { struct Node {
Node *ch[],*fa;
ll v,add,rev,ans,sum,ls,rs,siz;
Node() ;
void addv(ll x) {
add+=x;
v+=x;
sum+=siz*x;
ls+=x*siz*(siz+)/;
rs+=x*siz*(siz+)/;
ans+=x*siz*(siz+)*(siz+)/;
}
void reverse() {
rev^=;
swap(ls,rs);
swap(ch[],ch[]);
}
void up_push() {
if(fa->ch[]==this||fa->ch[]==this)
fa->up_push();
if(rev) {
ch[]->reverse();
ch[]->reverse();
rev=;
}
if(add) {
ch[]->addv(add);
ch[]->addv(add);
add=;
}
}
void maintain() {
siz=ch[]->siz+ch[]->siz+;
sum=ch[]->sum+ch[]->sum+v;
ls=ch[]->ls+v*(ch[]->siz+)+ch[]->ls+ch[]->sum*(ch[]->siz+);
rs=ch[]->rs+v*(ch[]->siz+)+ch[]->rs+ch[]->sum*(ch[]->siz+);
ans=ch[]->ans+ch[]->ans+(ch[]->siz+)*ch[]->ls+(ch[]->siz+)*ch[]->rs
+(ch[]->siz+)*(ch[]->siz+)*v;
}
} *null=new Node, T[N];
Node::Node() {
ch[]=ch[]=fa=null;
v=rev=add=ans=sum=ls=rs=;
siz=;
}
void rot(Node* o,int d) {
Node* p=o->fa;
p->ch[d]=o->ch[d^];
o->ch[d^]->fa=p;
o->ch[d^]=p;
o->fa=p->fa;
if(p==p->fa->ch[])
p->fa->ch[]=o;
else if(p==p->fa->ch[])
p->fa->ch[]=o;
p->fa=o;
p->maintain();
}
void splay(Node* o) {
o->up_push();
Node *nf,*nff;
while(o->fa->ch[]==o||o->fa->ch[]==o) {
nf=o->fa,nff=nf->fa;
if(o==nf->ch[]) {
if(nf==nff->ch[]) rot(nf,);
rot(o,);
} else {
if(nf==nff->ch[]) rot(nf,);
rot(o,);
}
}
o->maintain();
}
void Access(Node* o) {
Node* son=null;
while(o!=null) {
splay(o);
o->ch[]=son;
o->maintain();
son=o; o=o->fa;
}
}
void evert(Node* o) {
Access(o);
splay(o);
o->reverse();
}
void Link(Node* u,Node* v) {
evert(u);
u->fa=v;
}
void Cut(Node* u,Node* v) {
evert(u);
Access(v),splay(v);
v->ch[]=u->fa=null;
v->maintain();
}
Node* find(Node* o) {
while(o->fa!=null) o=o->fa;
return o;
} }
using namespace LCT; struct Edge { int v,nxt;
}e[N<<];
int en=,front[N];
void adde(int u,int v)
{
e[++en]=(Edge){v,front[u]}; front[u]=en;
} int n,m; void build(int u,int fa)
{
trav(u,i) {
int v=e[i].v;
if(v!=fa) {
T[v].fa=&T[u];
build(v,u);
}
}
}
ll gcd(ll a,ll b)
{
return b? gcd(b,a%b):a;
} int main()
{
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
null->siz=;
scanf("%d%d",&n,&m);
FOR(i,,n) {
ll x;
scanf("%lld",&x);
T[i].v=T[i].sum=T[i].ls=T[i].rs=T[i].ans=x;
}
int op,u,v; ll d;
FOR(i,,n-) {
scanf("%d%d",&u,&v);
adde(u,v),adde(v,u);
}
build(,-);
FOR(i,,m) {
scanf("%d%d%%d",&op,&u,&v);
if(op==) {
if(find(&T[u])==find(&T[v]))
Cut(&T[u],&T[v]);
} else
if(op==) {
if(find(&T[u])!=find(&T[v]))
Link(&T[u],&T[v]);
} else
if(op==) {
if(find(&T[u])==find(&T[v])) {
scanf("%lld",&d);
evert(&T[u]);
Access(&T[v]),splay(&T[v]);
T[v].addv(d);
}
} else {
if(find(&T[u])!=find(&T[v])) puts("-1");
else {
evert(&T[u]);
Access(&T[v]),splay(&T[v]);
ll x=T[v].ans,y=T[v].siz*(T[v].siz+)>>;
ll g=gcd(x,y);
printf("%lld/%lld\n",x/g,y/g);
}
}
}
return ;
}
bzoj 3091 城市旅行(LCT+数学分析)的更多相关文章
- BZOJ 3091: 城市旅行 [LCT splay 期望]
3091: 城市旅行 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1454 Solved: 483[Submit][Status][Discuss ...
- 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模板 只考虑第四个操作. 要求我们计算期望,所以我 ...
- 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 ...
- 【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 ...
- 【BZOJ】3091: 城市旅行 Link-Cut Tree
[题意]参考PoPoQQQ. 给定一棵树,每个点有一个点权,提供四种操作: 1.删除两点之间的连边 不存在边则无视 2.在两点之前连接一条边 两点已经联通则无视 3.在两点之间的路径上所有点的点权加上 ...
- bzoj3091 城市旅行 LCT + 区间合并
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3091 题解 调了整个晚自习才调出来的问题. 乍一看是个 LCT 板子题. 再看一眼还是个 LC ...
- 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区间合并
题目描述 输入 输出 样例输入 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区间合并 前三个 ...
随机推荐
- HTML5入门1---Canvas画布
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 利用python 获取 windows 组策略
工作中有时候会有这种需求: 1. 自动配置组策略的安全基线,这个东西不用你自己写了,微软有这个工具,Microsoft Security Compliance Manager,你可以在下面的地址去下载 ...
- iOS KVO的原理
KVO(Key Value Observing),是观察者模式在Foundation中的实现. KVO的原理 简而言之就是: 1.当一个object有观察者时,动态创建这个object的类 ...
- *Linux之rpm命令
在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比"添加/删除程序"强很多,它就是Red Hat Package Mana ...
- 78. Subsets
题目: Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset mus ...
- python处理Excel
Python中一般使用xlrd库来读取Excel文件,使用xlwt库来生成Excel文件,使用xlutils库复制和修改Excel文件.这三个库只支持到Excel2003. python-excel主 ...
- jQuery 表格排序插件 Tablesorter 使用
jQuery 表格排序插件 Tablesorter 使用方式如下: 1.引入头文件(注意一定要把jQuery放在前面): <script src="lib/jquery-1.8.3.m ...
- uva12716GCD XOR
筛法,打表. 通过打表可知,但gcd(a,b)==a xor b时,a xor b = a-b. 就是求满足 c = a-b且c = a xor b 的c的个数. #include<cstdio ...
- 让IE6下支持固定定位
让IE下支持固定定位 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...
- css虚线和css双实线
border线型主要有:1.dotted[点状]2.solid[实线] 3.double[双实线] 4.dashed;[虚线] 如果一个CSS这样写:border-style:dotted solid ...