BZOJ4515: [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
- #include<cstdio>
- #include<cctype>
- #include<queue>
- #include<cstring>
- #include<algorithm>
- #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;i=next[i])
- using namespace std;
- typedef long long ll;
- const int BufferSize=1<<16;
- char buffer[BufferSize],*head,*tail;
- inline char Getchar() {
- if(head==tail) {
- int l=fread(buffer,1,BufferSize,stdin);
- tail=(head=buffer)+l;
- }
- return *head++;
- }
- inline int read() {
- int x=0,f=1;char c=Getchar();
- for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
- for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
- return x*f;
- }
- const int maxn=100010;
- const ll inf=123456789123456789ll;
- ll ans,minv[maxn<<2],val[maxn],dist[maxn];
- int n,m,first[maxn],next[maxn<<1],to[maxn<<1],dis[maxn<<1],e;
- void AddEdge(int w,int v,int u) {
- to[++e]=v;dis[e]=w;next[e]=first[u];first[u]=e;
- to[++e]=u;dis[e]=w;next[e]=first[v];first[v]=e;
- }
- int fa[maxn],dep[maxn],son[maxn],siz[maxn];
- void dfs(int x) {
- dep[x]=dep[fa[x]]+1;siz[x]=1;
- ren if(to[i]!=fa[x]) {
- fa[to[i]]=x;dist[to[i]]=dist[x]+dis[i];
- dfs(to[i]);siz[x]+=siz[to[i]];
- if(siz[to[i]]>siz[to[son[x]]]) son[x]=i;
- }
- }
- int top[maxn],pos[maxn],cnt;
- void build(int x,int tp) {
- top[x]=tp;pos[x]=++cnt;val[cnt]=dist[x];
- if(son[x]) build(to[son[x]],tp);
- ren if(to[i]!=fa[x]&&i!=son[x]) build(to[i],to[i]);
- }
- int setv[maxn<<2];
- struct Line {
- int k;ll b;
- ll f(ll x) {return x*k+b;}
- }A[maxn<<2];
- void query(int o,int l,int r,int ql,int qr) {
- if(setv[o]) ans=min(ans,min(A[o].f(val[max(ql,l)]),A[o].f(val[min(qr,r)])));
- if(ql<=l&&r<=qr) ans=min(ans,minv[o]);
- else {
- int mid=l+r>>1,lc=o<<1,rc=lc|1;
- if(ql<=mid) query(lc,l,mid,ql,qr);
- if(qr>mid) query(rc,mid+1,r,ql,qr);
- }
- }
- void maintain(int o,int l,int r) {
- int lc=o<<1,rc=lc|1;
- if(l<r) minv[o]=min(minv[lc],minv[rc]);
- if(setv[o]) minv[o]=min(minv[o],min(A[o].f(val[l]),A[o].f(val[r])));
- }
- void cover(int o,int l,int r,Line x) {
- if(!setv[o]) setv[o]=1,A[o]=x;
- else if(l==r) {
- if(A[o].f(val[l])>x.f(val[l])) A[o]=x;
- }
- else {
- int mid=l+r>>1,lc=o<<1,rc=lc|1;
- ll fl=A[o].f(val[l]),fr=A[o].f(val[r]);
- ll gl=x.f(val[l]),gr=x.f(val[r]);
- if(fl>=gl&&fr>=gr) A[o]=x;
- else if(fl<=gl&&fr<=gr) return;
- else {
- if(gl<fl) {
- if(A[o].f(val[mid])<=x.f(val[mid])) cover(lc,l,mid,x);
- else cover(rc,mid+1,r,A[o]),A[o]=x;
- }
- if(gr<fr) {
- if(A[o].f(val[mid+1])<=x.f(val[mid+1])) cover(rc,mid+1,r,x);
- else cover(lc,l,mid,A[o]),A[o]=x;
- }
- }
- }
- maintain(o,l,r);
- }
- void update(int o,int l,int r,int ql,int qr,Line x) {
- if(ql<=l&&r<=qr) cover(o,l,r,x);
- else {
- int mid=l+r>>1,lc=o<<1,rc=lc|1;
- if(ql<=mid) update(lc,l,mid,ql,qr,x);
- if(qr>mid) update(rc,mid+1,r,ql,qr,x);
- maintain(o,l,r);
- }
- }
- int query(int x,int y,int tp) {
- int f1=top[x],f2=top[y];
- while(f1!=f2) {
- if(dep[f1]<dep[f2]) swap(f1,f2),swap(x,y);
- if(tp) query(1,1,n,pos[f1],pos[x]);
- x=fa[f1];f1=top[x];
- }
- if(dep[x]>dep[y]) swap(x,y);
- if(tp) query(1,1,n,pos[x],pos[y]);
- return x;
- }
- void update(int x,int z,int k,ll b) {
- int f=top[x];
- while(f!=top[z]) {
- update(1,1,n,pos[f],pos[x],(Line){k,b});
- x=fa[f];f=top[x];
- }
- update(1,1,n,pos[z],pos[x],(Line){k,b});
- }
- int main() {
- n=read();m=read();
- rep(i,2,n) AddEdge(read(),read(),read());
- dfs(1);build(1,1);
- rep(i,1,n*4) minv[i]=inf;
- rep(i,1,m) {
- int tp=read(),x=read(),y=read();
- if(tp==2) {
- ans=inf;query(x,y,1);
- printf("%lld\n",ans);
- }
- else {
- int a=read(),b=read();
- int z=query(x,y,0);
- update(x,z,-a,b+dist[x]*a);
- update(y,z,a,b+(dist[x]-2*dist[z])*a);
- }
- }
- return 0;
- }
BZOJ4515: [Sdoi2016]游戏的更多相关文章
- [bzoj4515][Sdoi2016]游戏-树链剖分+李超线段树
Brief Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,A ...
- bzoj千题计划276:bzoj4515: [Sdoi2016]游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=4515 把lca带进式子,得到新的式子 然后就是 维护树上一次函数取min 一个调了一下午的错误: 当 ...
- 【BZOJ4515】[Sdoi2016]游戏 树链剖分+线段树
[BZOJ4515][Sdoi2016]游戏 Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 1234567 ...
- 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交
4515: [Sdoi2016]游戏 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 304 Solved: 129[Submit][Status][ ...
- 4515: [Sdoi2016]游戏
4515: [Sdoi2016]游戏 链接 分析: 树链剖分 + 超哥线段树.注意细节. 代码: #include<cstdio> #include<algorithm> #i ...
- bzoj 4515: [Sdoi2016]游戏
Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...
- [SDOI2016]游戏
Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...
- 【题解】Luogu P4069 [SDOI2016]游戏
原题传送门 看到这种题,想都不用想,先写一个树链剖分 然后发现修改操作增加的是等差数列,这使我们想到了李超线段树 先进性树剖,然后用李超线段树维护区间最小,这样就做完了(写码很容易出错) 复杂度为\( ...
- BZOJ.4515.[SDOI2016]游戏(树链剖分 李超线段树)
BZOJ 洛谷 每次在路径上加的数是个一次函数,容易看出是树剖+李超线段树维护函数最小值.所以其实依旧是模板题. 横坐标自然是取个确定的距离标准.取每个点到根节点的距离\(dis[i]\)作为\(i\ ...
随机推荐
- 在SQL里如何写条件逻辑?
主要涉及CASE,WHEN之类.. 不同的服务器上实现if...else...是不一样的. 建议用CASE ,WHEN,因为它们是SQL国标呢. mysql> SELECT -> SUM( ...
- [LeetCode] Pow(x, n)
Implement pow(x, n). 有史以来做过最简单的一题,大概用5分钟ac,我采用fast exponential,这个在sicp的第一章就有描述.思想是:如果n是偶数的话,那么m^n = ...
- Oracle 创建/删除 表空间、用户、授权
首先以DBA连接到数据库:sqlplus / as sysdba; --创建表空间 create tablespace test_tablespace datafile 'D:\developer\o ...
- MongoDB学习(2)—Node.js与MongoDB的基本连接示例
前提 已经安装了node.js和MongoDB,本文使用的node.js是v0.12.0,MongoDB是3.0.0. 初始化数据 启动MongoDB服务,在test数据库中插入一条实例数据: db. ...
- LeetCode——Same Tree(判断两棵树是否相同)
问题: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...
- Element selector doesn't have required
这个错误是因为创建xml文件时文件类型弄成了layout xml file ,这样就会自动到layout文件夹下 应该是drawable resource file
- HTML概况性介绍
HTML(HyperText Markup Language)汉语的意思是:超文本标记语言. ”超文本”是指.html页面内不仅仅可以包含文字,还可以包含图片.链接,甚至音乐.程序等非文字元素. “标 ...
- Emacs 之查看帮助
// */ // ]]> Emacs 之查看帮助 Table of Contents 1. Emacs 入门 1.1. 查看简单的帮助 1.2. 执行elisp代码 1 Emacs 入门 ...
- clone github的代码
终端执行:git clone 连接.git #不用sudo
- Android 编程下 DP、SP 以及屏幕像素密度
有时需为视图属性指定大小尺寸值(通常以像素为单位,但有时也用点.毫米或英寸).最常见的属性有: 文字大小(Text Size),指设备上显示的文字像素高度: 边距(Margin),指定视图组件间的距离 ...