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入门4---HTML5 与 HTML4 同一网页的不同写法
HTML4写法 css: body { font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana ...
- SQLServer中服务器角色和数据库角色权限详解
角色 当几个用户需要在某个特定的数据库中执行类似的动作时(这里没有相应的Windows用户组),就可以向该数据库中添加一个角色(role).数据库角色指定了可以访问相同数据库对象的一组数据库用户. 数 ...
- 在PowerDesigner中设计物理模型1——表和主外键
原文:在PowerDesigner中设计物理模型1--表和主外键 在PD中建立物理模型由以下几种办法: 直接新建物理模型. 设计好概念模型,然后由概念模型生成物理模型. 设计好逻辑模型,然后由逻辑模型 ...
- dubbo-admin管理平台搭建
参考:http://blog.csdn.net/u013142781/article/details/50396621 一.前言 dubbo的使用,其实只需要有注册中心,消费者,提供者这三个就可以使用 ...
- MyEclipse 2013 开发WebService
1.在Package Explorer窗口右键File新建WebService Project项目,我的名称为:TestWebService 2.WebService Framework选择JAX-W ...
- Java发送Http请求
package com.liuyu.test; import java.io.BufferedReader; import java.io.IOException; import java.io.In ...
- Oracle Create DBLink
DROP PUBLIC DATABASE LINK ORA11G_DBLINK; CREATE PUBLIC DATABASE LINK ORA11G_DBLINKCONNECT TO SYS ...
- Building Xcode iOS projects and creating *.ipa file from the command line
For our development process of iOS applications, we are using Jenkins set up on the Mac Mini Server, ...
- poj 3792 Area of Polycubes (简单模拟)
题目 题意:在三维坐标系中,给定n个立方体的中心坐标,立方体的边长为1,按照输入顺序,后来输入的必须和之前输入的立方体有公共的边. 而且,不能和之前输入的立方体相同. 如果满足条件,输出表面积.如果不 ...
- URAL 1992
CVS Description Yoda: Visit I will the cloners on Kamino... And see this army they have created for ...