[CC-TRIPS]Children Trips

题目大意:

\(n(n\le10^5)\)座城市构成一棵树,且树上的每条边的长度\(l_i\)满足\(1\le l_i\le 2\)。\(m(m\le10^5)\)个询问,每次询问从\(u\)到\(v\),每天最多开\(p\)公里,至少需要多少天可以到达。注意,晚上必须停留在某座城市,而不能将车停在某两座城市之间。

思路:

当\(p\le100\)时,倍增预处理每个点向上跳到哪些位置,否则直接暴力跳。

源代码:

#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
#include<algorithm>
inline int getint() {register char ch;while(!isdigit(ch=getchar()));register int x=ch^'0';while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');return x;
}
const int N=1e5+1,logN=17,M=1e5,B=100;
struct Edge {int to,w;
};
std::vector<Edge> e[N];
inline void add_edge(const int &u,const int &v,const int &w) {e[u].push_back((Edge){v,w});e[v].push_back((Edge){u,w});
}
struct Query {int u,v,p,id;bool operator < (const Query &rhs) const {return p<rhs.p;}
};
Query q[M];
int ans[M];
int dep[N],dis[N],anc[N][logN],top[N][logN];
inline int lg2(const float &x) {return ((unsigned&)x>>23&255)-127;
}
void dfs(const int &x,const int &par) {anc[x][0]=par;dep[x]=dep[par]+1;for(register int i=1;i<=lg2(dep[x]);i++) {anc[x][i]=anc[anc[x][i-1]][i-1];}for(auto &j:e[x]) {const int &y=j.to;if(y==par) continue;dis[y]=dis[x]+j.w;dfs(y,x);}
}
inline int lca(int x,int y) {if(dep[x]<dep[y]) std::swap(x,y);for(register int i=lg2(dep[x]-dep[y]);i>=0;i--) {if(dep[anc[x][i]]>=dep[y]) {x=anc[x][i];}}for(register int i=lg2(dep[x]);i>=0;i--) {if(anc[x][i]!=anc[y][i]) {x=anc[x][i];y=anc[y][i];}}return x==y?x:anc[x][0];
}
inline int dist(const int &x,const int &y) {const int z=lca(x,y);return dis[x]+dis[y]-dis[z]*2;
}
inline int jump(int x,int step) {for(register int i=lg2(dep[x]);i>=0;i--) {if(dis[x]-dis[anc[x][i]]<=step) {step-=dis[x]-dis[anc[x][i]];x=anc[x][i];}}return x;
}
int main() {const int n=getint();for(register int i=1;i<n;i++) {const int u=getint(),v=getint(),w=getint();add_edge(u,v,w);}dfs(1,0);const int m=getint();for(register int i=0;i<m;i++) {q[i].u=getint();q[i].v=getint();q[i].p=getint();q[i].id=i;}std::sort(&q[0],&q[m]);for(register int l=0,r=0;l<m;l=r) {while(r<m&&q[r].p==q[l].p) r++;const int &step=q[l].p;if(step<=B) {memset(top,0,sizeof top);for(register int i=1;i<=n;i++) {top[i][0]=jump(i,step);}for(register int j=1;j<=lg2(n);j++) {for(register int i=1;i<=n;i++) {top[i][j]=top[top[i][j-1]][j-1];}}for(register int i=l;i<r;i++) {int x=q[i].u,y=q[i].v;const int z=lca(x,y);int &ans=::ans[q[i].id];for(register int i=lg2(dep[x]);i>=0;i--) {if(dep[top[x][i]]>dep[z]) {x=top[x][i];ans+=1<<i;}}for(register int i=lg2(dep[y]);i>=0;i--) {if(dep[top[y][i]]>dep[z]) {y=top[y][i];ans+=1<<i;}}if(dist(x,y)>0) ans++;if(dist(x,y)>step) ans++;}} else {for(register int i=l;i<r;i++) {int x=q[i].u,y=q[i].v,t;const int z=lca(x,y);int &ans=::ans[q[i].id];for(t=jump(x,step);dep[t]>dep[z];t=jump(x,step)) {ans++;x=t;}for(t=jump(y,step);dep[t]>dep[z];t=jump(y,step)) {ans++;y=t;}if(dist(x,y)>0) ans++;if(dist(x,y)>step) ans++;}}}for(register int i=0;i<m;i++) {printf("%d\n",ans[i]);}return 0;
}

转载于:https://www.cnblogs.com/skylee03/p/9813100.html

[CC-TRIPS]Children Trips相关推荐

  1. [CodeChef Trips]Children Trips

    Children Trips 题解 关于这种跳跃的**题,当它PPP值很大时几次就可以跳到目标节点了,而较小时却会跳很久,所以我们很快就可以想到对询问分类处理. 对于P>nP>\sqrt{ ...

  2. Codechef TRIPS Children Trips (分块、倍增)

    题目链接: https://www.codechef.com/problems/TRIPS 感觉CC有点毒瘤啊.. 题解: 首先有一个性质可能是因为太傻所以网上没人解释,然而我看了半天: 就是正序和倒 ...

  3. 一二三系列之CodeChef分块——Chef and Churu,Chef and Problems,Children Trips

    文章目录 Chef and Churu source solution code Chef and Problems source solution code Children Trips sourc ...

  4. 【codechef】Children Trips

    Portal -->CC_Children Trips Solution (英文题解看得真爽qwq不过写的好详细啊ovo) 首先这题有一个很重要的条件就是边权是\(1\)或者\(2\),所以虽然 ...

  5. CODECHEF Oct. Challenge 2014 Children Trips

    @(XSY)[分塊, 倍增] Description There's a new trend among Bytelandian schools. The "Byteland Tourist ...

  6. 【CODECHEF】Children Trips(分块)

    主要的操作是:每一天走到最远能够走到的休息区 确实一开始没有想到是分块,只是觉得1<=d<=21<=d<=21<=d<=2有点东西,但是没有搞出来. 其实也可以说是 ...

  7. Codechef :Children Trips/TRIPS(树分块)

    传送门 题解: 设一个阀值 k k k,小于 k k k的倍增,大于 k k k的暴力跳,这样的复杂度是 O ( n m k + n k ) O(\frac{nm}{k}+nk) O(knm​+nk) ...

  8. cc.node场景树

    cc.node场景树 概述 常用属性 cc.Component 代码组件 cc Node场景树相关方法 概述 creator是由一个一个的游戏场景组成,通过代码逻辑来控制场景跳转; creator场景 ...

  9. 我也来说一下SilverLight3的ChildWindow--带Logo的标题

    今天我谈的是SilverLight3的ChildWindow的标题问题,我想在ChildWindow标题前面加上一个图片,比如logo,如下图的效果,标题前面有一个图标. 要实现以上的效果,有两种方法 ...

最新文章

  1. 关于IBM 随机启动选项
  2. BZOJ1076 [SCOI2008] 奖励关
  3. 日期减三个月oracle_ORACLE 日期加减操作
  4. 简单的学习心得:网易云课堂Android开发第六章SQLite与ContentProvider
  5. jQuery教程06-基本筛选选择器
  6. IOProcess基础知识
  7. DIY电脑配置选择的常见误区有哪些?
  8. 等重构完这系统,我就辞职!
  9. 武汉大学计算机学院创业老师,胡瑞敏 - 教师简历 CV- 武汉大学计算机学院
  10. java怎么对用户做自定义模版打印_Printing tools 自定义模板打印的实现
  11. pcl小知识(十二)—— 斯坦福兔子和其他图形学模型数据下载
  12. 高数篇:05柯西定理和泰勒公式
  13. 一致性检验评价方法kappa
  14. petalinux(3)——创建APP
  15. Gartner年度趋势预测汇总整理(2006年-2023年)
  16. 将一个类中的字段赋值到另一个类同名同类型字段
  17. javase(13)_网络编程
  18. SitePoint Podcast#32:云中的一切
  19. 又一家大数据软件公司上市:把亚马逊和微软当对手
  20. 华为云号码隐私保护AXB AXYB模式代码二次封装

热门文章

  1. 路由器测试的性能测试
  2. 10min快速了解k8s基础
  3. effective morden c++4
  4. OPC:客户端开发——应用WTclient.dll使用手册部分中文版
  5. 这份 Alibaba 内部疯传《Java 权威面试指南(阿里版)》堪称精品,面试助你一臂之力,事半功倍
  6. 转自Master HaKu 的C#调用C++写的Dll时的运行时错误解决
  7. 新形黑猩猩脸部辨识系统 帮助保护朕亨公益组织及时发现网络非法交易
  8. LeetCode 825 friends-of-appropriate-ages
  9. python中给变量赋值时、既确定了变量的值_Python 中的变量赋值不需要类型声明,可以直接赋值,通过值来决定变量的类型。_学小易找答案...
  10. java拼图游戏设计文档_基于JAVA的拼图游戏的设计与实现(含录像)