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 Output

16/3
6/1

HINT

对于所有数据满足 1<=N<=50,000 1<=M<=50,000 1<=Ai<=10^6 1<=D<=100 1<=U,V<=N

 
恶心的动态树上维护各种信息。
不难发现ans=ΣAi*i*(len-i+1)。
我们在splay树上维护几个值:
sumv=ΣAi*i*(len-i+1)
lsum=ΣAi*i
rsum=ΣAi*(len-i+1)
sum=ΣAi
不难维护者几个变量的关系,打懒标记时快速算一下Σi*(len-i+1)和Σi就行了。
注意flip时要交换两子树的lsum和rsum。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define lc ch[x][0]
#define rc ch[x][1]
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
const int BufferSize=<<;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=,f=;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-;
for(;isdigit(c);c=Getchar()) x=x*+c-'';
return x*f;
}
typedef long long ll;
const int maxn=;
ll f[maxn],sumv[maxn],sum[maxn],lsum[maxn],rsum[maxn],s[maxn],addv[maxn],val[maxn];
int pre[maxn],fa[maxn],ch[maxn][],flip[maxn];
void Add(int x,ll v) {
if(!v||!x) return;
sumv[x]+=v*f[s[x]];
lsum[x]+=v*(+s[x])*s[x]/;
rsum[x]+=v*(+s[x])*s[x]/;
sum[x]+=v*s[x];
}
void maintain(int x) {
if(!x) return;
s[x]=s[lc]+s[rc]+;
sum[x]=sum[lc]+sum[rc]+val[x];
sumv[x]=sumv[lc]+sumv[rc]+lsum[lc]*(s[rc]+)+rsum[rc]*(s[lc]+)+val[x]*(s[lc]+)*(s[rc]+);
lsum[x]=lsum[lc]+lsum[rc]+val[x]*(s[lc]+)+sum[rc]*(s[lc]+);
rsum[x]=rsum[rc]+rsum[lc]+val[x]*(s[rc]+)+sum[lc]*(s[rc]+);
Add(x,addv[x]);
}
void pushdown(int x) {
if(flip[x]) {
swap(lc,rc);
swap(lsum[lc],rsum[lc]);
swap(lsum[rc],rsum[rc]);
flip[lc]^=;flip[rc]^=;
flip[x]=;
}
if(addv[x]) {
val[x]+=addv[x];addv[lc]+=addv[x];addv[rc]+=addv[x];
Add(lc,addv[x]);Add(rc,addv[x]);addv[x]=;
}
}
void rotate(int x) {
int y=pre[x],z=pre[y],d=ch[y][]==x;
ch[y][d^]=ch[x][d];pre[ch[x][d]]=y;
ch[z][ch[z][]==y]=x;pre[x]=z;
ch[x][d]=y;pre[y]=x;maintain(y);
}
int S[maxn],top;
void splay(int x) {
for(int i=x;i;i=pre[i]) S[++top]=i;
if(top!=) fa[x]=fa[S[top]],fa[S[top]]=;
while(top) pushdown(S[top--]);
while(pre[x]) rotate(x);
maintain(x);
}
void access(int x) {
for(int y=;x;x=fa[x]) {
splay(x);pre[ch[x][]]=;fa[ch[x][]]=x;
ch[x][]=y;pre[y]=x;maintain(y=x);
}
}
void makeroot(int x) {
access(x);splay(x);flip[x]^=;
maintain(x);
}
int find(int x) {
access(x);splay(x);
while(ch[x][]) x=ch[x][];
return x;
}
void link(int x,int y) {
makeroot(x);fa[x]=y;
}
void cut(int x,int y) {
makeroot(x);access(y);splay(y);
if(s[y]==) {
pre[ch[y][]]=;ch[y][]=;
maintain(y);
}
}
ll gcd(ll x,ll y) {return !y?x:gcd(y,x%y);}
void query(int x,int y) {
makeroot(x);access(y);splay(y);
ll len=s[y]-;len=(len+)*(len+)/;
ll ans=sumv[y],t=gcd(len,ans);
printf("%lld/%lld\n",ans/t,len/t);
}
void update(int x,int y,ll v) {
makeroot(x);access(y);splay(y);
addv[y]+=v;Add(y,v);
}
int main() {
int n=read(),m=read();
f[]=;
rep(i,,n) f[i]=f[i-]+(ll)i*(i-)/+i;
rep(i,,n) val[i]=read();
rep(i,,n-) link(read(),read());
while(m--) {
int t=read(),x=read(),y=read();
if(t==) if(find(x)==find(y)) cut(x,y);
if(t==) if(find(x)!=find(y)) link(x,y);
if(t==) {
ll v=read();
if(find(x)==find(y)) update(x,y,v);
}
if(t==) {
if(find(x)==find(y)) query(x,y);
else puts("-1");
}
}
return ;
}

BZOJ3091: 城市旅行的更多相关文章

  1. 【LCT】BZOJ3091 城市旅行

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

  2. BZOJ3091 城市旅行 LCT

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3091 题意概括 鉴于本人语文不好,此题的描述原题很清晰,废话不多,请看原题. 可怕,原题是图片,不 ...

  3. 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& ...

  4. 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 ...

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

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

  6. 【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 ...

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

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

  8. luogu P4842 城市旅行

    嘟嘟嘟 好题,好题 刚开始突发奇想写了一个\(O(n ^ 2)\)暴力,结果竟然过了?!后来才知道是上传题的人把单个数据点开成了10s-- 不过不得不说我这暴力写的挺好看的.删边模仿链表删边,加边的时 ...

  9. 【bzoj3091】 城市旅行

    http://www.lydsy.com/JudgeOnline/problem.php?id=3091 (题目链接) 题意 给出一棵无根树,维护四个操作.link,cut,路径加法,路径期望查询. ...

随机推荐

  1. SSDB 数据库如何换用 rocksdb 引擎?

     牧童遥指杏花村,一枝红杏出墙来… SSDB 数据库如何换用 rocksdb 引擎? idea's blog 2014-04-12 71 阅读 rocksdb NoSQL SSDB 数据库使用的是 G ...

  2. PHP session的实现原理

    PHP SESSION原理 我们知道,session是在服务器端保持用户会话数据的一种方法,对应的cookie是在客户端保持用户数据.HTTP协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联 ...

  3. Reverse Linked List | & ||

    Reverse Linked List I Reverse a linked list. Example For linked list 1->2->3, the reversed lin ...

  4. 到天宫做客-最后一分钟AC!!!

    问题 C: 到天宫做客 时间限制: 1 Sec  内存限制: 128 MB提交: 100  解决: 26[提交][状态][讨论版] 题目描述 有一天,我做了个梦,梦见我很荣幸的接到了猪八戒的邀请,到天 ...

  5. Android Session

    AsyncHttpClient保持session http://blog.csdn.net/ewrfedf/article/details/21968511

  6. Cocos2dx实现象棋之布局

    开始界面 #ifndef SCENESTART_H #define SCENESTART_H #include "cocos2d.h" #include "SceneGa ...

  7. 了解 hadoop

    <Hadoop基础教程>之初识Hadoop 博客分类: 读后感   Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我 ...

  8. 提高IO性能

    noatime - 不更新文件系统上 inode 访问记录,可以提升性能 [root@ok etc]# cat /etc/fstab |grep noatime /dev/mapper/vg_ok-l ...

  9. 使yum保留下载的rpm包

    [root@14LN yum]# egrep 'cachedir|keepcache' /etc/yum.conf #cachedir=/var/cache/yum/$basearch/$releas ...

  10. 3.工厂方法模式(Factory Method)

    using System; using System.Reflection; namespace ConsoleApplication1 { class Program { static void M ...