【bzoj3091】 城市旅行
http://www.lydsy.com/JudgeOnline/problem.php?id=3091 (题目链接)
题意
给出一棵无根树,维护四个操作。link,cut,路径加法,路径期望查询。
Solution
右转题解→_→:PoPoQQQ
对于无法直接维护的值,我们可以考虑做差,或者是用别的比较好维护的值来加减乘除得到。
细节
全程LL,先翻转再打标记。
代码
// bzoj3091
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=50010;
int n,m,fa[maxn];
struct node {
int son[2];
LL sum,tag,rev,ans,val,lsum,rsum,size;
int& operator [] (int x) {return son[x];}
}tr[maxn]; LL gcd(LL a,LL b) {return b==0 ? a : gcd(b,a%b);}
namespace LCT {
void reverse(int k) {
swap(tr[k][0],tr[k][1]);
swap(tr[k].lsum,tr[k].rsum);
tr[k].rev^=1;
}
void add(int k,LL val) {
tr[k].val+=val;
tr[k].sum+=tr[k].size*val;
tr[k].tag+=val;
tr[k].ans+=tr[k].size*(tr[k].size+1)*(tr[k].size+2)/6*val;
tr[k].lsum+=tr[k].size*(tr[k].size+1)/2*val;
tr[k].rsum+=tr[k].size*(tr[k].size+1)/2*val;
}
void pushdown(int k) {
if (tr[fa[k]][0]==k || tr[fa[k]][1]==k) pushdown(fa[k]);
int l=tr[k][0],r=tr[k][1];
if (tr[k].rev) {
if (l) reverse(l);
if (r) reverse(r);
tr[k].rev^=1;
}
if (tr[k].tag) {
if (l) add(l,tr[k].tag);
if (r) add(r,tr[k].tag);
tr[k].tag=0;
}
}
void pushup(int k) {
int l=tr[k][0],r=tr[k][1];
tr[k].size=tr[l].size+tr[r].size+1;
tr[k].lsum=tr[l].lsum+(tr[l].size+1)*tr[k].val+tr[r].lsum+tr[r].sum*(tr[l].size+1);
tr[k].rsum=tr[r].rsum+(tr[r].size+1)*tr[k].val+tr[l].rsum+tr[l].sum*(tr[r].size+1);
tr[k].sum=tr[l].sum+tr[r].sum+tr[k].val;
tr[k].ans=tr[l].ans+tr[r].ans+tr[l].lsum*(tr[r].size+1)+tr[r].rsum*(tr[l].size+1)+tr[k].val*(tr[l].size+1)*(tr[r].size+1);
}
void rotate(int x) {
int y=fa[x],z=fa[y],l,r;
l=tr[y][1]==x;r=l^1;
if (tr[z][0]==y || tr[z][1]==y) tr[z][tr[z][1]==y]=x;
fa[tr[x][r]]=y;fa[x]=z;fa[y]=x;
tr[y][l]=tr[x][r];tr[x][r]=y;
pushup(y);pushup(x);
}
void splay(int x) {
pushdown(x);
while (tr[fa[x]][0]==x || tr[fa[x]][1]==x) {
int y=fa[x],z=fa[y];
if (tr[z][0]==y || tr[z][1]==y) {
if (tr[z][0]==y ^ tr[y][0]==x) rotate(x);
else rotate(y);
}
rotate(x);
}
}
void access(int x) {
for (int y=0;x;y=x,x=fa[x]) splay(x),tr[x][1]=y,pushup(x);
}
void makeroot(int x) {
access(x);splay(x);reverse(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 (tr[y][0]==x && tr[x][1]==0)
tr[y][0]=0,fa[x]=0,pushup(y);
}
void modify(int x,int y,LL val) {
makeroot(x);access(y);splay(y);add(y,val);
}
int find(int x) {
return fa[x] ? find(fa[x]) : x;
}
void query(int x,int y) {
makeroot(x);access(y);splay(y);
LL A=tr[y].ans,B=tr[y].size*(tr[y].size+1)/2;
LL D=gcd(A,B);
printf("%lld/%lld\n",A/D,B/D);
}
}
using namespace LCT; int main() {
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%lld",&tr[i].val);
for (int u,v,i=1;i<n;i++) {
scanf("%d%d",&u,&v);
link(u,v);
}
for (int op,x,y,d,i=1;i<=m;i++) {
scanf("%d%d%d",&op,&x,&y);
if (op==1) if (find(x)==find(y)) cut(x,y);
if (op==2) if (find(x)!=find(y)) link(x,y);
if (op==3) {scanf("%d",&d);if (find(x)==find(y)) modify(x,y,d);}
if (op==4) if (find(x)==find(y)) query(x,y);else puts("-1");
}
return 0;
}
【bzoj3091】 城市旅行的更多相关文章
- 【LCT】BZOJ3091 城市旅行
3091: 城市旅行 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1927 Solved: 631[Submit][Status][Discuss ...
- BZOJ3091 城市旅行 LCT
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3091 题意概括 鉴于本人语文不好,此题的描述原题很清晰,废话不多,请看原题. 可怕,原题是图片,不 ...
- 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 1 4 1 4 Sample ...
- 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-- 不过不得不说我这暴力写的挺好看的.删边模仿链表删边,加边的时 ...
随机推荐
- 03-Python执行方式和Pycharm设置
https://www.python.org/ 单词列表 * error 错误 * name 名字 * defined 已经定义 * syntax 语法 * invalid 无效 * Indentat ...
- Django Rest Framework源码剖析(三)-----频率控制
一.简介 承接上篇文章Django Rest Framework源码剖析(二)-----权限,当服务的接口被频繁调用,导致资源紧张怎么办呢?当然或许有很多解决办法,比如:负载均衡.提高服务器配置.通过 ...
- 20155216 实验一 逆向与Bof基础
实验一 逆向与Bof基础 一.直接修改程序机器指令,改变程序执行流程 使用 objdump -d pwn1 对pwn1文件进行反汇编. 可知main函数跳转至foo函数,先要使main函数跳转至get ...
- # 20155337《网络对抗》Exp6 信息搜集与漏洞扫描
20155337<网络对抗>Exp6 信息搜集与漏洞扫描 实践目标 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测 ...
- vue 使用 proxyTable 解决跨域问题
1.在 main.js 中,在引入 axios: import axios from 'axios' Vue.config.productionTip = false Vue.prototype.$a ...
- vue.js 2.0实现的简单分页
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...
- 【干货】YUM安装PHP 7版本后,增加phalcon框架的报错解决
目录 1.yum安装php 7.x版本,此处部署7.3版本 2.安装phalcon框架 2.1.PHP版本依赖关系 2.2.编译phalcon扩展模块 2.3.增加扩展文件 3.部署phalcon遇到 ...
- 微信小程序实现各种特效实例
写在前面 最近在负责一个微信小程序的前端以及前后端接口的对接的项目,整体上所有页面的布局我都已经搭建完成,里面有一些常用的特效,总结一下,希望对大家和我都能有所帮助 实例1:滚动tab选项卡 先看一下 ...
- proe工程图输出dwg/dxf文件设置
网上看到不少人分享proe转转dxf/dwg配置文件的,但是看了一圈,几乎都没有涉及到转化线型的,所以自己整理自己的配置文件,写在这里分享出来. 以Pro/engineer WF5.0为例: 1.复制 ...
- UE4添加植被Foliage Type
在UE4中的地形渲染上不可避免的需要添加植被,而如果采取手动添加StaticMesh植被的方式则会浪费大量的时间精力. UE4提供了一种批量添加地面植被类型的方式Foliage Type.在编辑器内容 ...