3091: 城市旅行

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1927  Solved: 631
[Submit][Status][Discuss]

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

题解

这题和BZOJ2752类似,只不过那个是在序列上而这个在链上,所以没做过2752的话可以先看看这里

我们发现每次询问其实就是算每个点对答案的贡献/C(n+1,2),也就是/(n+1)*n/2

所以每次只需要单独算每个点的贡献即可

然后每个点对答案的贡献就是a[i]*i*(n-i+1)

所以我们维护一个sum,一个siz,一个L=a[i]*i,一个R=a[i]*(n-i+1)

转移挺好想的(逃

代码

//by 减维
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<bitset>
#include<set>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<ctime>
#include<algorithm>
#define ll long long
#define il inline
#define rg register
#define db double
#define mpr make_pair
#define maxn 70005
#define inf (1<<30)
#define eps 1e-8
#define pi 3.1415926535897932384626
using namespace std; int n,m,fa[maxn],son[maxn][],siz[maxn];
ll val[maxn],sum[maxn],rev[maxn],mar[maxn],L[maxn],R[maxn],ans[maxn]; ll gcd(ll x,ll y){return y==?x:gcd(y,x%y);}
il bool pdp(int x){return son[fa[x]][]==x;}
il bool isrt(int x){return son[fa[x]][]!=x&&son[fa[x]][]!=x;}
il void rever(int x){rev[x]^=;swap(son[x][],son[x][]);swap(L[x],R[x]);} il void upda(int x)
{
siz[x]=siz[son[x][]]+siz[son[x][]]+;
sum[x]=sum[son[x][]]+sum[son[x][]]+val[x];
ans[x]=ans[son[x][]]+ans[son[x][]]+val[x]*(siz[son[x][]]+)*(siz[son[x][]]+)+L[son[x][]]*(siz[son[x][]]+)+R[son[x][]]*(siz[son[x][]]+);
L[x]=L[son[x][]]+L[son[x][]]+val[x]*(siz[son[x][]]+)+sum[son[x][]]*(siz[son[x][]]+);
R[x]=R[son[x][]]+R[son[x][]]+val[x]*(siz[son[x][]]+)+sum[son[x][]]*(siz[son[x][]]+);
} il void add(int x,ll y)
{
mar[x]+=y;
val[x]+=y;
sum[x]+=y*siz[x];
ans[x]+=y*(siz[x]+)*(siz[x]+)*siz[x]/;
L[x]+=y*(siz[x]+)*siz[x]/;
R[x]+=y*(siz[x]+)*siz[x]/;
} il void pdn(int x)
{
if(rev[x])
{
if(son[x][]) rever(son[x][]);
if(son[x][]) rever(son[x][]);
rev[x]=;
}
if(son[x][]) add(son[x][],mar[x]);
if(son[x][]) add(son[x][],mar[x]);
mar[x]=;
} il void pd(int x){if(!isrt(x)) pd(fa[x]);pdn(x);} il void rot(int x)
{
int f=fa[x],g=fa[f],o=pdp(x);
if(!isrt(f)) son[g][pdp(f)]=x;fa[x]=g;
son[f][o]=son[x][!o];fa[son[f][o]]=f;
son[x][!o]=f;fa[f]=x;
upda(f),upda(x);
} il void splay(int x)
{
pd(x);
for(;!isrt(x);rot(x))
if(!isrt(fa[x])) rot(pdp(fa[x])==pdp(x)?fa[x]:x);
} il void acc(int x)
{
for(int y=;x;y=x,x=fa[x])
splay(x),son[x][]=y,upda(x);
} il int find(int x)
{
acc(x);splay(x);
while(son[x][]) pdn(x),x=son[x][];
return x;
} il void bert(int x){acc(x);splay(x);rever(x);}
il void spli(int x,int y){bert(x);acc(y);splay(y);}
il void cut(int x,int y){spli(x,y);fa[x]=son[y][]=;upda(y);}
il void link(int x,int y){bert(x);fa[x]=y;} void dfs(int x)
{
if(son[x][]) dfs(son[x][]);
printf("%d ",x);
if(son[x][]) dfs(son[x][]);
} void dfs2(int x)
{
if(son[x][]) dfs2(son[x][]);
printf("%d ",sum[x]);
if(son[x][]) dfs2(son[x][]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i){
scanf("%lld",&val[i]);
siz[i]=;
sum[i]=val[i];
ans[i]=val[i];
L[i]=val[i];
R[i]=val[i];
}
for(int i=,x,y;i<n;++i) scanf("%d%d",&x,&y),link(x,y);
ll d;
for(int i=,op,x,y;i<=m;++i)
{
scanf("%d%d%d",&op,&x,&y);
if(op==){
if(find(x)==find(y)) cut(x,y);
}else if(op==){
if(find(x)!=find(y)) link(x,y);
}else if(op==){
scanf("%lld",&d);
if(find(x)==find(y))spli(x,y),add(y,d);
}else{
if(find(x)!=find(y)) puts("-1");
else{
spli(x,y);
ll ans1=ans[y];
ll ans2=siz[y]*(siz[y]+)/;
ll gc=gcd(ans1,ans2);
printf("%lld/%lld\n",ans1/gc,ans2/gc);
}
}
}
return ;
}

【LCT】BZOJ3091 城市旅行的更多相关文章

  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 提示 对于所有数据满足 1& ...

  2. BZOJ3091 城市旅行 LCT

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

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

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

  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: 城市旅行

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

  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】城市旅行 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区间合并 前三个 ...

随机推荐

  1. 最全Pycharm教程(32)——依据FHS在Linux上安装Pycharm

    1.主题 怎样在Linux上安装Pycharm,依据FHS. 2.平台要求 Intel Pentium III/800 MHz或更高. 内存最小512M.建议1G以上 屏幕最小分辨率1024x768 ...

  2. Qt之QHeaderView加入复选框

    简述 前面分享了QTableView中怎样加入复选框. 本节主要介绍QTableView中的表头-QHeaderView加入复选框的功能,以下以水平表头为例.垂直表头相似! 简述 效果 QHeader ...

  3. Python笔记·第九章—— 函数 (一)

    一.函数的作用 函数可以让我们代码结构更清晰,而且避免了代码的重复,冗余,使一段代码或者功能可以反复的被调用,大大提高了开发效率 二.函数的定义 def 函数名(参数1,参数2,*args,默认参数, ...

  4. 理解Babel是如何编译JS代码的及理解抽象语法树(AST)

    Babel是如何编译JS代码的及理解抽象语法树(AST) 1. Babel的作用是?   很多浏览器目前还不支持ES6的代码,但是我们可以通过Babel将ES6的代码转译成ES5代码,让所有的浏览器都 ...

  5. 3. python文件操作

            5 打开文件的模式有: r,只读模式(默认). w,只写模式.[不可读:不存在则创建:存在则删除内容:] a,追加模式.[可读:   不存在则创建:存在则只追加内容:]        ...

  6. 解决win7中防火墙的0x6D9问题的方法

    问题: 打开windows防火墙管理单元时出错:代码0x6d9" 解决方法: 下一步-->下一步-->完成.

  7. 破解iframe微信推文(图片)防盗链

    $.ajaxPrefilter(function(options) { if(options.crossDomain && jQuery.support.cors) { var htt ...

  8. iOS UIAlertController中加入倒计时,输入框,Swift讲解

    一.倒计时 @interface ViewController () { UIAlertController *alertview; NSString * message; NSTimer * wai ...

  9. iOS 轮播中遇到的问题(暂停、重新启动)

    一. 轮播的优化或者用Collection来实现 二.Timer  问题 我们可以这样来使用一个Timer [NSTimer scheduledTimerWithTimeInterval:1.0 ta ...

  10. ftp 只需上传禁止下载

    一.首先在ftp / 主目录下给所有用户授予读写权限 二.给子目录授予写入权限,不允许读取