[SDOI2016]游戏
Description
Input
Output
每当 Bob 进行操作,输出一行一个数,表示他能够选择的最小的数字
Sample Input
1 2 10
2 3 20
2 1 3
1 2 3 5 6
2 2 3
1 2 3 -5 -6
2 2 3
Sample Output
6
-106
HINT
n≤100000,m≤100000,∣a∣≤10000,0<=w,|b|<=10^9
对于A*dis+B,将它分成s->lca,lca->t
s->lca:
A*(d[s]-d[x])+B=-A*d[x]+A*d[s]+B
lca->t:
A*(d[s]+d[x]-2*d[lca])+B=A*d[x]+A*d[s]-2*A*d[lca]+B
在一条链上显然d[fa]<d[son],所以相当于把一个一次函数放入几个线段
查询就是求区间线段最小值
然后就是lichao线段树
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long lol;
struct Node
{
int next,to;
lol dis;
}edge[];
struct Line
{
lol k,b;
bool id;
}tree[];
lol ans,d[],val[],inf=;
int num,head[],size[],fa[][],dep[],son[],dfn[],cnt,id[],top[],n,m;
void add(int u,int v,lol w)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
edge[num].dis=w;
}
void dfs1(int x,int pa)
{int i;
size[x]=;
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if (v==pa) continue;
fa[v][]=x;
d[v]=d[x]+edge[i].dis;
dep[v]=dep[x]+;
dfs1(v,x);
size[x]+=size[v];
if (size[v]>size[son[x]]) son[x]=v;
}
}
void dfs2(int x,int pa,int tp)
{int i;
dfn[x]=++cnt;
id[cnt]=x;
top[x]=tp;
if (son[x]) dfs2(son[x],x,tp);
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if (v==pa||v==son[x]) continue;
dfs2(v,x,v);
}
}
int lca(int x,int y)
{
while (top[x]!=top[y])
{
if (d[top[x]]<d[top[y]]) swap(x,y);
x=fa[top[x]][];
}
if (d[x]<d[y]) return x;
else return y;
}
lol cal(Line a,lol x)
{
return a.k*x+a.b;
}
double cross(Line x,Line y)
{
return (x.b-y.b)/(1.0*(y.k-x.k));
}
void add_min(int rt,int l,int r,Line x)
{
if (!tree[rt].id)
{
tree[rt]=x;
return;
}
lol f1=cal(x,d[id[l]]);lol f2=cal(tree[rt],d[id[l]]);
lol f3=cal(x,d[id[r]]);lol f4=cal(tree[rt],d[id[r]]);
if (f1>=f2&&f3>=f4) return;
else
if (f1<=f2&&f3<=f4)
{tree[rt]=x;}
else
{
double p=cross(tree[rt],x);
int mid=(l+r)/;
if (f1<=f2)
{
if (p<=d[id[mid]]) add_min(rt<<,l,mid,x);
else add_min(rt<<|,mid+,r,tree[rt]),tree[rt]=x;
}
else
{
if (p<=d[id[mid]]) add_min(rt<<,l,mid,tree[rt]),tree[rt]=x;
else add_min(rt<<|,mid+,r,x);
}
}
}
void update(int rt,int l,int r,int L,int R,Line x)
{
val[rt]=min(val[rt],min(cal(x,d[id[L]]),cal(x,d[id[R]])));
if (l==L&&r==R)
{
add_min(rt,l,r,x);
return;
}
int mid=(l+r)/;
if (R<=mid) update(rt<<,l,mid,L,R,x);
else if (L>mid) update(rt<<|,mid+,r,L,R,x);
else
{
update(rt<<,l,mid,L,mid,x);
update(rt<<|,mid+,r,mid+,R,x);
}
}
void query(int rt,int l,int r,int L,int R)
{
if (tree[rt].id)
{
ans=min(ans,min(cal(tree[rt],d[id[L]]),cal(tree[rt],d[id[R]])));
}
if (l==L&&r==R)
{
ans=min(ans,val[rt]);
return;
}
int mid=(l+r)/;
if (R<=mid) query(rt<<,l,mid,L,R);
else if (L>mid) query(rt<<|,mid+,r,L,R);
else
{
query(rt<<,l,mid,L,mid);query(rt<<|,mid+,r,mid+,R);
}
}
void build(int rt,int l,int r)
{
val[rt]=inf;
if (l==r) return;
int mid=(l+r)/;
build(rt*,l,mid);
build(rt*+,mid+,r);
}
int main()
{int i,u,v,j,opt,s,t,x,y;
lol w,A,B;
cin>>n>>m;
for (i=;i<=n-;i++)
{
scanf("%d%d%lld",&u,&v,&w);
add(u,v,w);add(v,u,w);
}
dfs1(,);
dfs2(,,);
for (i=;i<=;i++)
{
for (j=;j<=n;j++)
fa[j][i]=fa[fa[j][i-]][i-];
}
build(,,n);
for (i=;i<=m;i++)
{
scanf("%d",&opt);
if (opt==)
{
scanf("%d%d%lld%lld",&s,&t,&A,&B);
int z=lca(s,t);
x=s;y=t;
while (top[x]!=top[z])
{
update(,,n,dfn[top[x]],dfn[x],(Line){-A,B+A*d[s],});
x=fa[top[x]][];
}
update(,,n,dfn[z],dfn[x],(Line){-A,B+A*d[s],});
while (top[y]!=top[z])
{
update(,,n,dfn[top[y]],dfn[y],(Line){A,B-*A*d[z]+A*d[s],});
y=fa[top[y]][];
}
update(,,n,dfn[z],dfn[y],(Line){A,B-*A*d[z]+A*d[s],});
}
else
{
scanf("%d%d",&s,&t);
int z=lca(s,t);
x=s;y=t;ans=inf;
while (top[x]!=top[z])
{
query(,,n,dfn[top[x]],dfn[x]);
x=fa[top[x]][];
}
query(,,n,dfn[z],dfn[x]);
while (top[y]!=top[z])
{
query(,,n,dfn[top[y]],dfn[y]);
y=fa[top[y]][];
}
query(,,n,dfn[z],dfn[y]);
printf("%lld\n",ans);
}
}
}
[SDOI2016]游戏的更多相关文章
- 4515: [Sdoi2016]游戏
4515: [Sdoi2016]游戏 链接 分析: 树链剖分 + 超哥线段树.注意细节. 代码: #include<cstdio> #include<algorithm> #i ...
- 【BZOJ4515】[Sdoi2016]游戏 树链剖分+线段树
[BZOJ4515][Sdoi2016]游戏 Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 1234567 ...
- BZOJ4515: [Sdoi2016]游戏
Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...
- bzoj 4515: [Sdoi2016]游戏
Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...
- [bzoj4515][Sdoi2016]游戏-树链剖分+李超线段树
Brief Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,A ...
- bzoj千题计划276:bzoj4515: [Sdoi2016]游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=4515 把lca带进式子,得到新的式子 然后就是 维护树上一次函数取min 一个调了一下午的错误: 当 ...
- 【题解】Luogu P4069 [SDOI2016]游戏
原题传送门 看到这种题,想都不用想,先写一个树链剖分 然后发现修改操作增加的是等差数列,这使我们想到了李超线段树 先进性树剖,然后用李超线段树维护区间最小,这样就做完了(写码很容易出错) 复杂度为\( ...
- BZOJ.4515.[SDOI2016]游戏(树链剖分 李超线段树)
BZOJ 洛谷 每次在路径上加的数是个一次函数,容易看出是树剖+李超线段树维护函数最小值.所以其实依旧是模板题. 横坐标自然是取个确定的距离标准.取每个点到根节点的距离\(dis[i]\)作为\(i\ ...
- [SDOI2016]游戏 树剖+李超树
目录 链接 思路 update 代码 链接 https://www.luogu.org/problemnew/show/P4069 思路 树剖+超哥线段树 我已经自毙了,自闭了!!!! update ...
随机推荐
- alpha-咸鱼冲刺day8-紫仪
总汇链接 一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 正在进行页面整合.然后还有注册跟登陆的功能完善-- 四,问题困难 数据流程大概是搞定了.不过语法不是很熟悉,然后还有各 ...
- mongodb 集群分片
分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量,这 ...
- HTML5文件操作API
HTML5文件操作API 一.文件操作API 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或 ...
- iOS 简易无限滚动的图片轮播器-SDCycleScrollView
@interface ViewController () <</span>SDCycleScrollViewDelegate> @end @implementation Vie ...
- 同样是IT培训,为什么人家月薪过万,你才几千,问题在哪?!
听过一句话"360行,行行转IT",虽然有些夸张,但也不难看出IT行业的火爆程度.从李总理提的"互联网+大数据"开始,中国的这场"互联网+" ...
- EasyUI中easyui-combobox的onchange事件。
html: <select id="cbox" class="easyui-combobox" name="dept" style=& ...
- cocos2d 判断旋转矩形是否包含某个点
本来想画个图演示一下,但是折腾了一会发现画不好,我的win10系统没有安装office,以后再看的话再补上吧.不废话了. 如图所以,如果判断点P是否被矩形A所包含,非常容易.那么如果矩形A以中心点逆时 ...
- redis 持久化之 RDB
redis的运维过程中,我们对数据持久化做一个基本的总结. 1什么是持久化: redis 所有数据保持在内存中,对数据的更新将异步地保存到磁盘上. RDB 文件创建的过程是直接从内存 写入到我们我磁盘 ...
- python 单例模式的四种创建方式
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- 快速搭建fabric-v1.1.0的chaincode开发环境
本文参考了fabric官方文档:http://hyperledger-fabric.readthedocs.io/en/latest/peer-chaincode-devmode.html?highl ...