BZOJ3091: 城市旅行
Description
Input
Output
Sample Input
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
6/1
HINT
对于所有数据满足 1<=N<=50,000 1<=M<=50,000 1<=Ai<=10^6 1<=D<=100 1<=U,V<=N
sumv=ΣAi*i*(len-i+1)
#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: 城市旅行的更多相关文章
- 【LCT】BZOJ3091 城市旅行
3091: 城市旅行 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1927 Solved: 631[Submit][Status][Discuss ...
- BZOJ3091 城市旅行 LCT
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3091 题意概括 鉴于本人语文不好,此题的描述原题很清晰,废话不多,请看原题. 可怕,原题是图片,不 ...
- 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,数学期望)
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 + 区间合并
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3091 题解 调了整个晚自习才调出来的问题. 乍一看是个 LCT 板子题. 再看一眼还是个 LC ...
- 【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: 城市旅行 [LCT splay 期望]
3091: 城市旅行 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1454 Solved: 483[Submit][Status][Discuss ...
- luogu P4842 城市旅行
嘟嘟嘟 好题,好题 刚开始突发奇想写了一个\(O(n ^ 2)\)暴力,结果竟然过了?!后来才知道是上传题的人把单个数据点开成了10s-- 不过不得不说我这暴力写的挺好看的.删边模仿链表删边,加边的时 ...
- 【bzoj3091】 城市旅行
http://www.lydsy.com/JudgeOnline/problem.php?id=3091 (题目链接) 题意 给出一棵无根树,维护四个操作.link,cut,路径加法,路径期望查询. ...
随机推荐
- BZOJ 1058
服气!我果然就是个傻逼. 傻兮兮地感觉两个数之间的差距无需删除一些答案,妈个鸡就只加入了一些新的答案忘记了去掉无效的答案.我果然是傻逼,经验不足脑子笨... 这么水的题...不说了,说多了都是泪. 自 ...
- Html form 表单提交前验证
可以使用form表单的onsubmit方法,在提交表单之前,对表单或者网页中的数据进行检验. onsubmit指定的方法返回true,则提交数据:返回false不提交数据. 直接看下面的代码: 1 & ...
- A + B Problem
Write a function that add two numbers A and B. You should not use + or any arithmetic operators. 分析: ...
- sharepoint添加应用程序
- frameset框架下,刷新整个页面
<a href="index.jsp" target="_parent"> index.jsp主frameset页面
- 【USACO】sprime
有了前面的基础,做这道题真是so easy啊. 因为要分解后每个数都是素数,所以采用先生成短的素数,长的素数在短素数的基础上生成. 比如长度为1的素数只有 2 3 5 7, 那么符合要求的长度为2的素 ...
- atom 震动特效
1.下载atom 2.配置环境变量 3.运行apm install activate-power-mode 4.打开Atom激活(control+alt+o(是o不是零)) 注:新标签若没效果可以ct ...
- 现在不能使用foxmail同步qq记事本功能,可能是对字数的大小有限制
那么在经过了两个星期的时间完成的主要功能就是幻灯片和站点管理,在之后还有更多的任务要做,本来从时间的安排上不太合理,在这个月底要基本完成,主要是其他的组员也有比较重的任务,那么就是需要随时有一个状态, ...
- SSH 超时断开连接解决办法
配置服务器端: vi /etc/ssh/sshd.conf ClientAliveInterval 120 #以秒为单位(可以改大些) ClientAliveCountMax 0 #发现客户端没有相应 ...
- HTTP协议中状态码的应用
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码. 所有状态码的第一个数字代表了响应的五种状态之一. Mark from 维基百科 消息 ...