bzoj千题计划276:bzoj4515: [Sdoi2016]游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=4515
把lca带进式子,得到新的式子
然后就是 维护树上一次函数取min
一个调了一下午的错误:
当一条线段完全在另一条线段之下时,用下面的完全覆盖上面的
判断条件为 两线段在范围内没有交点
然后若 新的线段的某一个端点<原来线段的对应的一个端点,就覆盖
错误的写法:
判断的时候 把两条线段在端点处相等也加了进去
即判断条件为 两线段在范围内没有交点 或 交点 在线段端点出
那么 若 新的线段的某一个端点<=原来线段的对应的一个端点,就覆盖
不对!!
因为交点在一个端点, 某一个端点<=原来线段的对应的一个端点,这个某一个交点 如果恰好是交点
那么这两条线段谁覆盖谁都有可能
所以应该是 若新线段有一个端点<原线段的对应端点,就覆盖
因为 一直没有找出上面的错误,而且是后10个点WA,所以一气之下把所有的int替换成了long long。。。。
#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 100001 #define min(x,y) ((x)<(y) ? (x) : (y)) typedef long long LL; const LL inf=; long long n,m; long long front[N],nxt[N<<],to[N<<],val[N<<],tot; long long fa[N],siz[N];
LL dep[N]; long long bl[N];
long long id[N],tim,dy[N]; LL mi[N<<];
LL mi_dep[N<<],mx_dep[N<<];
int who[N<<];
LL tagA[N<<],tagB[N<<];
long long L[N<<],R[N<<];
bool have[N<<]; LL A,B; LL ans; bool zero; void read(long long &x)
{
x=; long long f=; char c=getchar();
while(!isdigit(c)){ if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} void add(long long u,long long v,long long w)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; val[tot]=w;
} void init()
{
read(n); read(m);
long long u,v,w;
for(long long i=;i<n;++i)
{
read(u); read(v); read(w);
add(u,v,w);
}
} void dfs1(long long x)
{
siz[x]=;
for(long long i=front[x];i;i=nxt[i])
if(to[i]!=fa[x])
{
fa[to[i]]=x;
dep[to[i]]=dep[x]+val[i];
dfs1(to[i]);
siz[x]+=siz[to[i]];
}
} void dfs2(long long x,long long top)
{
bl[x]=top;
id[x]=++tim;
dy[tim]=x;
long long y=;
for(long long i=front[x];i;i=nxt[i])
if(to[i]!=fa[x] && siz[to[i]]>siz[y]) y=to[i];
if(!y) return;
dfs2(y,top);
for(long long i=front[x];i;i=nxt[i])
if(to[i]!=fa[x] && to[i]!=y) dfs2(to[i],to[i]);
} void build(long long k,long long l,long long r)
{
mi[k]=inf;
L[k]=l;
R[k]=r;
if(l==r)
{
mi_dep[k]=mx_dep[k]=dep[dy[l]];
who[k]=dy[l];
return;
}
long long mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
mi_dep[k]=min(mi_dep[k<<],mi_dep[k<<|]);
mx_dep[k]=max(mx_dep[k<<],mx_dep[k<<|]);
if(mx_dep[k]==mx_dep[k<<]) who[k]=who[k<<];
else who[k]=who[k<<|];
} double get_point(LL k1,LL b1,LL k2,LL b2)
{
if(k1==k2)
{
zero=true;
return ;
}
return 1.0*(b2-b1)/(k1-k2);
} void unionn_tag(long long k,LL tA,LL tB)
{
if(!have[k])
{
LL v;
if(tA>) v=tA*mi_dep[k]+tB;
else v=tA*mx_dep[k]+tB;
int kk=who[k];
if(v<mi[k]) mi[k]=v;
tagA[k]=tA;
tagB[k]=tB;
have[k]=true;
return;
}
if(!(R[k]-L[k]))
{
if(tA>) mi[k]=min(mi[k],tA*mi_dep[k]+tB);
else mi[k]=min(mi[k],tA*mx_dep[k]+tB);
return;
}
zero=false;
double foot=get_point(tA,tB,tagA[k],tagB[k]);
LL v1now=tA*dep[dy[R[k]]]+tB;
LL v2now=tA*dep[dy[L[k]]]+tB;
LL v1pre=tagA[k]*dep[dy[R[k]]]+tagB[k];
LL v2pre=tagA[k]*dep[dy[L[k]]]+tagB[k];
if(zero)
{
if(tB<tagB[k])
{
LL v;
if(tA>) v=tA*mi_dep[k]+tB;
else v=tA*mx_dep[k]+tB;
mi[k]=min(mi[k],v);
tagA[k]=tA;
tagB[k]=tB;
}
return;
}
if(foot<=dep[dy[L[k]]] || foot>=dep[dy[R[k]]])
{
if(v2now<v2pre || v1now<v1pre)
{
tagA[k]=tA;
tagB[k]=tB;
if(v1now>v2now) swap(v1now,v2now);
mi[k]=min(mi[k],v1now);
}
return;
}
long long mid=L[k]+R[k]>>;
if(foot<=dep[dy[mid]])
{
if(v1now<=v1pre)
{
unionn_tag(k<<,tagA[k],tagB[k]);
tagA[k]=tA;
tagB[k]=tB;
if(v1now>v2now) swap(v1now,v2now);
mi[k]=min(mi[k],v1now);
}
else
{
unionn_tag(k<<,tA,tB);
if(v1now>v2now) swap(v1now,v2now);
mi[k]=min(mi[k],v1now);
}
}
else
{
if(v1now<=v1pre)
{
unionn_tag(k<<|,tA,tB);
if(v1now>v2now) swap(v1now,v2now);
mi[k]=min(mi[k],v1now);
}
else
{
unionn_tag(k<<|,tagA[k],tagB[k]);
tagA[k]=tA;
tagB[k]=tB;
if(v1now>v2now) swap(v1now,v2now);
mi[k]=min(mi[k],v1now);
}
}
} void down(long long k)
{
if(!have[k]) return;
unionn_tag(k<<,tagA[k],tagB[k]);
unionn_tag(k<<|,tagA[k],tagB[k]);
tagA[k]=tagB[k]=;
have[k]=false;
} void change(long long k,long long l,long long r,long long opl,long long opr)
{
if(l>=opl && r<=opr)
{
unionn_tag(k,A,B);
return;
}
down(k);
long long mid=l+r>>;
if(opl<=mid) change(k<<,l,mid,opl,opr);
if(opr>mid) change(k<<|,mid+,r,opl,opr);
mi[k]=min(mi[k<<],mi[k<<|]);
} void Change(long long u,long long v)
{
while(bl[u]!=bl[v])
{
if(dep[bl[u]]<dep[bl[v]]) swap(u,v);
change(,,n,id[bl[u]],id[u]);
u=fa[bl[u]];
}
if(dep[u]>dep[v]) swap(u,v);
change(,,n,id[u],id[v]);
} void query(long long k,long long l,long long r,long long opl,long long opr)
{
if(l>=opl && r<=opr)
{
ans=min(ans,mi[k]);
return;
}
down(k);
long long mid=l+r>>;
if(opl<=mid) query(k<<,l,mid,opl,opr);
if(opr>mid) query(k<<|,mid+,r,opl,opr);
} void Query(long long u,long long v)
{
while(bl[u]!=bl[v])
{
if(dep[bl[u]]<dep[bl[v]]) swap(u,v);
query(,,n,id[bl[u]],id[u]);
u=fa[bl[u]];
}
if(dep[u]>dep[v]) swap(u,v);
query(,,n,id[u],id[v]);
} long long get_lca(long long u,long long v)
{
while(bl[u]!=bl[v])
{
if(dep[bl[u]]<dep[bl[v]]) swap(u,v);
u=fa[bl[u]];
}
return dep[u]<dep[v] ? u : v;
} void out(LL x)
{
if(x>=) out(x/);
putchar(x%+'');
} void solve()
{
long long ty,s,t,a,b;
long long lca;
while(m--)
{
read(ty); read(s); read(t);
lca=get_lca(s,t);
if(ty==)
{
ans=inf;
Query(t,s);
if(ans<) putchar('-'),ans=-ans;
out(ans);
putchar('\n');
}
else
{
read(a); read(b);
lca=get_lca(s,t);
A=-a; B=a*dep[s]+b;
// printf("%I64d\n",(dep[s]-dep[7])*a+b);
Change(lca,s);
A=a; B=(dep[s]-*dep[lca])*a+b;
// printf("%I64d\n",(dep[s]+dep[7]-2*dep[lca])*a+b);
Change(lca,t);
}
}
} int main()
{
init();
dfs1();
dfs2(,);
//for(int i=1;i<=n;++i) printf("%d\n",bl[i]);
build(,,n);
solve();
return ;
}
bzoj千题计划276:bzoj4515: [Sdoi2016]游戏的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划202:bzoj3191: [JLOI2013]卡牌游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=3191 每个人获胜的概率只与其在排列中与庄家的相对位置有关 dp[i][j] 还剩i个人时,从庄家数第 ...
- bzoj千题计划116:bzoj1025: [SCOI2009]游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=1025 题目转化: 将n分为任意段,设每段的长度分别为x1,x2,…… 求lcm(xi)的个数 有一个 ...
- bzoj千题计划112:bzoj1022: [SHOI2008]小约翰的游戏John
http://www.lydsy.com/JudgeOnline/problem.php?id=1022 http://www.cnblogs.com/TheRoadToTheGold/p/67448 ...
- bzoj千题计划310:bzoj5285: [Hnoi2018]寻宝游戏(思维题+哈希)
https://www.lydsy.com/JudgeOnline/problem.php?id=5285 |0 和 &1 没有影响 若填‘|’,记为0,若填‘&’,记为1 先只考虑最 ...
- bzoj千题计划283:bzoj4516: [Sdoi2016]生成魔咒(后缀数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=4516 考虑在后面新加一个字母产生的影响 假设是第i个 如果不考虑重复,那么会增加i个不同的字符串 考 ...
- bzoj千题计划282:bzoj4517: [Sdoi2016]排列计数
http://www.lydsy.com/JudgeOnline/problem.php?id=4517 组合数+错排公式 #include<cstdio> #include<ios ...
- bzoj千题计划277:bzoj4513: [Sdoi2016]储能表
http://www.lydsy.com/JudgeOnline/problem.php?id=4513 f[i][0/1][0/1][0/1] 从高到低第i位,是否卡n的上限,是否卡m的上限,是否卡 ...
- bzoj千题计划176:bzoj1199: [HNOI2005]汤姆的游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=1199 求出圆x的范围 把要判断的点按x从小到大排序 枚举图形 二分出x满足这个图形的一段区间 枚举这 ...
随机推荐
- 【BZOJ4653】【NOI2016】区间(线段树)
[BZOJ4653][NOI2016]区间(线段树) 题面 BZOJ 题解 \(NOI\)良心送分题?? 既然是最大长度减去最小长度 莫名想到那道反复减边求最小生成树 从而求出最小的比值 所以这题的套 ...
- [NOI2006]神奇口袋
题面在这里 题意 开始时袋中有\(t\)种小球,第\(i\)种小球有\(t_i\)个,之后每次等概率取出一个球,第\(i\)次取球时观察这个球的颜色\(c_i\)放回并向袋中加入\(d\)个颜色为\( ...
- Spring对IOC的理解
一.IOC控制反转和DI依赖注入 1.控制反转,字面可以理解为:主动权的转移,原来一个应用程序内的对象是类通过new去主动创建并实例化的,对对像创建的主动权在程序代码中.程序不仅要管理业务逻辑也要管理 ...
- NancyFX 第九章 Responses(响应对象)
和内容协商最最为紧密的当属Nancy的Response对象. 在本书的第一张你应该就已经看到过Response对象,之前是使用它的AsFile 方法返回一个简单文件. using Nancy; nam ...
- NancyFX 第三章 Web框架
如果使用Nancy作为一个WEB框架而言,会有什么不同?实际上很多. 在使用Nancy框架为网页添加Rest节点和路由和之前的Rest框架中是相同的,这方面没有什么需要学习的了.Nancy采用一贯的处 ...
- 人生苦短,我用python(目录)
基础 简介 数据类型 文件操作 迭代器和生成器 函数 内置函数 面向对象编程 异常处理 socket网络编程 线程 进程/协程/异步I/O 数据库 Mysql(一) Mysql(二) Mysql(三) ...
- Redis 安装简介
Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Jav ...
- Ubuntu上将终端安装到右键上
Ubuntu上将终端安装到右键上 author:headsen chen 2017-10-12 10:26:12 个人原创,允许转载,请注明作者和出处,否则依法追究法律责任 chen@chen ...
- 二叉搜索树(Java实现)
二叉搜索树基本操作 求树中的结点个数 判断节点是否为空 向树中插入新结点key-value 树中是否存在key 返回树中key对应的value值 先序遍历 中序遍历 后续遍历 层序遍历 求树中key最 ...
- 转:命令passwd报错因inode节点处理记录
命令passwd报错因inode节点处理记录 原文:http://blog.sina.com.cn/s/blog_506ed9e6010106kj.html 故障现象: 1.修改密码时报错 ...