【北京集训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;
}

转载于:https://www.cnblogs.com/victorique/p/10145051.html

【北京集训D2T3】tvt相关推荐

  1. 北京集训:20180310

    北京集训的第一天,我完美爆零...... 这其中的经历,十分有趣呢. T1: 这题一看就是先猜一个性质然后利用他去求解. 如果我们知道怎么插入,怎么判定的话,可以线段树分治的说. 然后我猜了一个结论: ...

  2. 清北学堂----北京集训

    7月16日 集训第一天,毛晗杨给我们讲的基础算法和数论.基础算法讲了分块和三分等知识点,分块之前接触过,个人认为和莫队有一定的相似之处,都是把整个数组分为一个个大小相等的块,然后对块进行操作,每个块大 ...

  3. (2016北京集训十)【xsy1529】小Q与进位制 - 分治FFT

    题意很简单,就是求这个数... 其实场上我想出了分治fft的正解...然而不会打...然后打了个暴力fft挂了... 没啥好讲的,这题很恶心,卡常卡精度还爆int,要各种优化,有些dalao写的很复杂 ...

  4. 北京集训:20180323

    T1: 这题又是动态题面问题,一开始连求什么都没告诉你...... 当时自然没有看了,现在没人做没人改...... 官方题解: 标程: 1 #include <iostream> 2 #i ...

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

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

  6. 【2018北京集训(六)】Lcm

    Portal --> 出错啦qwq(好吧其实是没有) Description 给定两个正整数\(n,k\),选择一些互不相同的正整数,满足这些数的最小公倍数恰好为\(n\),并且这些数的和为\( ...

  7. (2016北京集训十二)【xsy1542】疯狂求导

    题解: 这题看起来很难...但是实际上并没有想象中的那么难 第一眼看上去不会求导公式怎么办?不要紧,题目背景非常良心的给出了题目中的导数计算公式 求完导合并同类项很恶心怎么办?不要紧,样例解释说明了不 ...

  8. 2016北京集训测试赛(十三) Problem B: 网络战争

    Solution KD tree + 最小割树 转载于:https://www.cnblogs.com/ZeonfaiHo/p/7420354.html

  9. 【2016北京集训测试赛(八)】 直径 (虚树+树的直径)

    Description 注意:时限更改为4s 题解 考虑最原始的直径求法:找到离根节点(或离其他任意一点)最远的节点far1,再从far1出发找到离far1最远的节点far2,far1至far2的距离 ...

  10. 2016北京集训测试赛(九)Problem C: 狂飙突进的幻想乡

    Solution 我们发现, 对于一条路径来说, 花费总时间为\(ap + q\), 其中\(p\)和\(q\)为定值. 对于每个点, 我们有多条路径可以到达, 因此对于每个区间中的\(a\)我们可以 ...

最新文章

  1. 上的介质簇的结构不正确_百面机器学习笔记 | 第八章:采样 | 07 不均衡样本集的重采样...
  2. Node.js 使用webpack-dev-server工具运行项目实现自动打包编译的功能
  3. MVC3 - 控制器
  4. 发力公有云的用友YonSuite,云原生实力到底如何?
  5. IDC商人应不应该给客户提供服务器测试?```
  6. Syntaxhighligher 使用中的一些问题
  7. linux opera java,Ubuntu Linux下的 Opera 安装
  8. Django之Model数据库数据的操作
  9. python文件去重软件_python去重工具
  10. 算法(一)时间复杂度
  11. 从BlueSky.h和BlueSky.cpp到BlueSky.out的那些事儿
  12. 单片机c语言中断意义,51单片机中断系统的重要性
  13. LOL手游登上去服务器维护,lol手游进不去怎么回事?无法登陆解决方法
  14. “逐梦太空,情系北斗” 北斗导航技术与产业应用
  15. sdkman 管理开发中使用的sdk
  16. JAVASE总结回顾(秦疆老师)
  17. Dreamweaver怎么用css设置基本的文字属性
  18. 3D姿态估计(GAST)
  19. 解决X210开发板的软开关按键问题
  20. 小学生C++编程基础 课程7(B)

热门文章

  1. mt7620n华硕固件下载_华硕TUFAX3000最新固件9923刺客模式解锁44 AX5400?
  2. 8.1并发集合(Concurrent Collections)
  3. 3.1等待和通知API(Wait-and-Notify API Tour)
  4. 电子相册系统(八)验证用户是否可用
  5. JavaScript之定义函数的方法
  6. 23种设计模式(六)单一职责之桥模式
  7. Lecture 7:策略梯度
  8. matlab中K=[K,temp]含义
  9. 结合Django+celery二次开发定时周期任务
  10. Hadoop设置任务执行队列及优先级