【北京集训D2T3】tvt


\(n,q \le 1e9\)

题目分析:

首先需要对两条路径求交,对给出的四个点的6个lca进行分类讨论。易于发现路径的交就是这六个lca里面最深的两个所形成的链。

然后即可再分两种情况进行讨论。

对于同向的路径,我们可以求出到达交的起点的时间差,然后与链上的最长边进行比较,如果大于说明可行。

对于对向的路径,如果能在时间差内走到交集上,同时不是在一个顶点相遇那么一定就是合法情况,否则就是不合法情况。这部分可以用倍增解决。

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+7;
#define ll long long
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((l+r)>>1)
struct po{
int nxt,to;
ll dis;
}edge[MAXN<<1];
ll head[MAXN],n,m,u1,v1,t1,u2,v2,t2,st[MAXN<<2],size[MAXN],fa[MAXN],dep[MAXN],top[MAXN],id[MAXN],w[MAXN],val[MAXN],wson[MAXN];
ll cnt,num,mx[MAXN<<2];
inline void pushup(int rt){st[rt]=st[ls]+st[rs];mx[rt]=max(mx[ls],mx[rs]);}
inline void dfs1(int u,int f)
{
size[u]=1;fa[u]=f;dep[u]=dep[f]+1;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(v==f) continue;
val[v]=edge[i].dis;
dfs1(v,u);
size[u]+=size[v];
if(size[wson[u]]<size[v]) wson[u]=v;
}
}
inline void dfs2(int u,int tp)
{
id[u]=++cnt;top[u]=tp;w[cnt]=val[u];
if(wson[u]) dfs2(wson[u],tp);
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(v==fa[u]||v==wson[u]) continue;
dfs2(v,v);
}
}
void build(int l,int r,int rt)
{
if(l==r){
st[rt]=mx[rt]=w[l];
return;
}
build(l,mid,ls);build(mid+1,r,rs);
pushup(rt);
return;
}
ll query_max(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) return mx[rt];
ll maxx=0;
if(L<=mid) maxx=max(maxx,query_max(L,R,l,mid,ls));
if(R>mid) maxx=max(maxx,query_max(L,R,mid+1,r,rs));
return maxx;
}
ll query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) return st[rt];
ll sum=0;
if(L<=mid) sum+=query(L,R,l,mid,ls);
if(R>mid) sum+=query(L,R,mid+1,r,rs);
return sum;
}
inline int find(int x,int y)
{
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]) x=fa[top[x]];
else y=fa[top[y]];
}
if(dep[x]>dep[y]) return y;
else return x;
}
inline ll Query_max(int x,int y)
{
ll maxx=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
maxx=max(maxx,query_max(id[top[x]],id[x],1,n,1));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) maxx=max(maxx,query_max(id[x]+1,id[y],1,n,1));
return maxx;
}
inline ll Query(int x,int y)
{
ll ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=query(id[top[x]],id[x],1,n,1);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans+=query(id[x],id[y],1,n,1);
return ans;
}
inline void add_edge(int from,int to,ll dis)
{
edge[++num].nxt=head[from];
edge[num].to=to;
edge[num].dis=dis;
head[from]=num;
}
inline ll read()
{
ll x=0,c=1;
char ch=' ';
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
while(ch=='-')c*=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*c;
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
n=read();m=read();
for(int i=1;i<n;i++){
int x,y,z;
x=read();y=read();z=read();
add_edge(x,y,z);add_edge(y,x,z);
}
dfs1(1,1);dfs2(1,1);
build(1,n,1);
while(m--){
u1=read();v1=read();t1=read();u2=read();v2=read();t2=read();
int lca1=find(u1,v1),lca2=find(u2,v2);
if(dep[lca1]<dep[lca2]){
swap(u1,u2);swap(v1,v2),swap(t1,t2);swap(lca1,lca2);
}
if(find(lca1,u2)!=lca1&&find(lca1,v2)!=lca1){
puts("NO");
continue;
}
int lca3=find(u1,u2),lca4=find(v1,v2);
if(dep[lca1]<dep[lca3]){
ll cnt1=Query(u1,lca3)+t1-val[find(u1,lca3)],cnt2=Query(u2,lca3)-val[find(u2,lca3)]+t2;
if(dep[lca1]>dep[lca4]) lca4=lca1;
int maxx=Query_max(lca3,lca4);
if(abs(cnt1-cnt2)<maxx) puts("YES");
else puts("NO");
continue;
}
if(dep[lca1]<dep[lca4]){
if(dep[lca3]<dep[lca1]) lca3=lca1;
ll cnt1=Query(u1,lca3)-val[find(u1,lca3)]+t1,cnt2=Query(u2,lca3)-val[find(u2,lca3)]+t2;
// cout<<cnt1<<" "<<cnt2<<endl;
int maxx=Query_max(lca3,lca4);
if(abs(cnt1-cnt2)<maxx) puts("YES");
else puts("NO");
continue;
}
int lca5=find(u1,v2),lca6=find(u2,v1);
if(dep[lca5]<dep[lca1]) lca5=lca1;
if(dep[lca6]<dep[lca1]) lca6=lca1;
ll cnt1=Query(u1,lca5)+t1-val[find(u1,lca5)],cnt2=Query(u2,lca6)+t2-val[find(u2,lca6)],cnt3=Query(lca5,lca6)-val[find(lca5,lca6)];
ll cnt4=abs(cnt1-cnt2);
if(cnt4>=cnt3){
puts("NO");
continue;
}else{
ll pass=(cnt3-cnt4)/2;
if(pass!=(cnt3-cnt4)/2.0){
puts("YES");
continue;
}
if(cnt1>cnt2){
ll cnt5=Query(lca5,lca1)-val[lca1];
if(pass==cnt5){
puts("NO");
continue;
}
if(pass>cnt5){
pass+=cnt4;
while(pass-val[lca6]>=0){
pass-=val[lca6];
lca6=fa[lca6];
}
if(pass==0) puts("NO");
else puts("YES");
} else {
while(pass-val[lca5]>=0){
pass-=val[lca5];
lca5=fa[lca5];
}
if(pass==0) puts("NO");
else puts("YES");
}
} else {
ll cnt6=Query(lca6,lca1)-val[lca1];
if(pass==cnt6){
puts("NO");
continue;
}
if(pass>cnt6){
pass+=cnt4;
while(pass-val[lca5]>=0){
pass-=val[lca5];
lca5=fa[lca5];
}
if(pass==0) puts("NO");
else puts("YES");
} else {
while(pass-val[lca6]>=0){
pass-=val[lca6];
lca6=fa[lca6];
}
if(pass==0) puts("NO");
else puts("YES");
}
}
}
}
return 0;
}

【北京集训D2T3】tvt的更多相关文章

  1. (2016北京集训十)【xsy1528】azelso - 概率期望dp

    北京集训的题都是好题啊~~(于是我爆0了) 注意到一个重要的性质就是期望是线性的,也就是说每一段的期望步数可以直接加起来,那么dp求出每一段的期望就行了... 设$f_i$表示从$i$出发不回到$i$ ...

  2. 【2017 北京集训 String 改编版】子串

    题意 你有一个字符串,你需要支持两种操作: 1:在字符串的末尾插入一个字符 \(c\) 2:询问当前字符串的 \([l,r]\) 子串中的不同子串个数 为了加大难度,操作会被加密(强制在线). \(n ...

  3. 【2016北京集训测试赛(十)】 Azelso (期望DP)

    Time Limit: 1000 ms   Memory Limit: 256 MB Description 题解 状态表示: 这题的状态表示有点难想...... 设$f_i$表示第$i$个事件经过之 ...

  4. 【2016北京集训测试赛(二)】 thr (树形DP)

    Description 题解 (这可是一道很早就碰到的练习题然后我不会做不想做,没想到在Contest碰到欲哭无泪......) 题目大意是寻找三点对的个数,使得其中的三个点两两距离都为d. 问题在于 ...

  5. 【2016北京集训测试赛(八)】 crash的数列 (思考题)

    Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多 ...

  6. 【2016北京集训测试赛(十六)】 River (最大流)

    Description  Special Judge Hint 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. 题解 题目大意:给定两组点,每组有$n$个点,有若干条跨组 ...

  7. 【2016北京集训测试赛】river

    HINT 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. [吐槽] 嗯..看到这题的想法的话..先想到了每个点的度为2,然后就有点不知所措了 隐隐约约想到了网络流,但并没 ...

  8. 【2016北京集训测试赛】azelso

    [吐槽] 首先当然是要orzyww啦 以及orzyxq奇妙顺推很强qwq 嗯..怎么说呢虽然说之前零零散散做了一些概d的题目但是总感觉好像并没有弄得比较明白啊..(我的妈果然蒟蒻) 这题的话可以说是难 ...

  9. 【2019北京集训测试赛(十三)】数据(sj) 冷静分析

    题目大意:给你一个代表区间$[1,n]$的线段树,问你随机访问区间$[1,n]$中的一个子区间,覆盖到的线段树节点个数的期望(需要乘上$\frac{n(n-1)}{2}$后输出). 数据范围:$n≤1 ...

随机推荐

  1. 《转》Win7 IIS7.5 安装

    一.进入Win7的 控制面板,选择左侧的 打开或关闭Windows功能. 二.现在出现了安装Windows功能的选项菜单,注意选择的项目,我们需要手动选择需要的功能,下面这张图片把需要安装的服务都已经 ...

  2. [Go语言]从Docker源码学习Go——指针和Structs

    这两天在看reflect这个包在Docker中的使用时,遇到了各种问题,最后虽然知道怎么用了. 但是对于这块的原理还不是太懂,于是把"THE WAY TO GO"中关键的几章看了下 ...

  3. WebService之XFire和SOAP实例(基于JAVA)

    开发环境:jdk1.6 + Tomcat7 + MyEclipse10 源码下载地址张贴在文章最后面:首先是使用WSDL协议实现:这里使用XFire XFire一个免费.开源的SOAP框架,它构建了P ...

  4. Web移动端使用localStorage缓存Js和css文件 | 强制不要缓存

    1.尽量不把js放在onload事件中,而是放在由用户主动触发的事件 2.加时间戳,时间不同则会加载js而非使用缓存 强制不要缓存: <meta http-equiv=Cache-Control ...

  5. 巨蟒python全栈开发-第17天 核能来袭-成员

    一.今日主要内容 1.成员 在类中你能写的所有内容都是类的成员 2.变量 (1)实例变量:昨天写的就是实例变量,由对象去访问的变量. (2)类变量(静态变量):此时,这个变量属于类,但是对象也可以访问 ...

  6. form表单学习

    1.http://www.cnblogs.com/fish-li/archive/2011/07/17/2108884.html 2.http://www.cnblogs.com/polk6/arch ...

  7. 踩坑之jinja2注释问题(Flask中)

    报错信息  jinja2.exceptions.TemplateSyntaxError  jinja2.exceptions.TemplateSyntaxError: Expected an expr ...

  8. 【Linux】Ubuntu下录屏&amp;&amp;制作GIF

    在做Android的时候,想制作GIF用来演示效果.一番摸索.找到了一个简单可行的办法: App在模拟器中执行,用录屏软件录制.再将视频转成GIF. 系统: Ubuntu 15.04 录屏软件: Re ...

  9. (4.2)SQL Server 客户端连接的问题

    转自:http://blog.51cto.com/jimshu/1395199 经常遇到 SQL Server 客户端无法连接到SQL Server 实例(服务).现在将这类问题归纳如下: 一.SQL ...

  10. Hadoop的eclipse1.1.2插件的安装和配置

    我的集群使用的hadoop版本是hadoop-1.1.2.对应的eclipse版本也是:hadoop-eclipse-plugin-1.1.2_20131021200005 (1)在eclipse的d ...