[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;
}

[CC-TRIPS]Children Trips的更多相关文章

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

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

  2. 【codechef】Children Trips

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

  3. CODECHEF Oct. Challenge 2014 Children Trips

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

  4. 【CODECHEF】Children Trips 倍增

    此题绝了,$O(n^{1.5}\ log\ n)$都可以过掉.... 题目大意:给你一颗$n$个点的树,每条边边权不是2就是$1$,有$m$个询问,每次询问一个人从$x$点走到$y$点,每天可以走的里 ...

  5. 题解 Children Trips

    题目传送门 Description 给出一个大小为 \(n\) 的边权全为 \(1,2\) 的带权树,有 \(q\) 此查询,每次给出 \(u,v,p\) ,问 \(u\to v\) 每次可以最多走边 ...

  6. (转载)构建public APIs与CORS

    from: https://segmentfault.com/a/1190000000709909 理由:在操作层面详细的讲解了跨域的操作.尤其是对于option请求的详解.收藏. 在构建Public ...

  7. easyui扩展-日期范围选择.

    参考: http://www.5imvc.com/Rep https://github.com/dangrossman/bootstrap-daterangepicker * 特性: * (1)基本功 ...

  8. [easyui] datebox源码阅读. 批注

    jquery.datebox.js 文件. (function($){ /** * create date box */ function createBox(target){ var state = ...

  9. easyui源码翻译1.32--TreeGrid(树形表格)

    前言 扩展自$.fn.datagrid.defaults.使用$.fn.treegrid.defaults重写默认值对象.下载该插件翻译源码 树形表格用于显示分层数据表格.它是基于数据表格.组合树控件 ...

随机推荐

  1. Python爬虫-爬取百度贴吧帖子

    这次主要学习了替换各种标签,规范格式的方法.依然参考博主崔庆才的博客. 1.获取url 某一帖子:https://tieba.baidu.com/p/3138733512?see_lz=1&p ...

  2. MCS-51单片机存储地址空间划分

    1.前言 MCS-51的存储器有片内RAM.片外RAM 和 ROM 三个空间. MCS-51单片机在物理结构上有四个存储空间 1.片内程序存储器(片内ROM)2.片外程序存储器(片外ROM)3.片内数 ...

  3. MIPI协议学习总结(一)

    一.MIPI 简介: MIPI(移动行业处理器接口)是Mobile Industry Processor Interface的缩写.MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准. 已经完 ...

  4. windows系统上搭建redis集群哨兵及主从复制

    搭建master 修改redis配置redis.windows.conf: 修改监听端口:  port 26379 修改绑定IP: bind 127.0.0.1 添加redis日志:logfile & ...

  5. sga 操作命令

    用SYS用户以SYSDBA身份登录系统alter system set sga_max_size=2000m scope=spfile;alter system set sga_target=2000 ...

  6. CentOS 6.5环境实现corosync+pacemaker实现DRBD高可用

    DRBD (Distributed Replicated Block Device)分布式复制块设备,它是 Linux 平台上的分散式储存系统,通常用于高可用性(high availability, ...

  7. tomcat6和tomcat7管理用户manager配置

    tomcat用户登录文件配置 如果想要对部署在tomcat上的项目进行管理查看,需要在tomcat安装目录conf文件夹下的tomcat-user.xml里添加用户登录权限.具体添加的内容如下: To ...

  8. Expm 9_2 有向图的强连通分量问题

      [问题描述] 给定一个有向图,设计一个算法,求解并输出该图的各个强连通分量. package org.xiu68.exp.exp9; import java.util.ArrayList; imp ...

  9. LINUX-CUDA版本所对应的NVIDIA驱动版本号,cuda版本报错的朋友参考一下

    CUDA 10.0: 410.48 CUDA .xx CUDA .xx (update) CUDA .xx CUDA .xx (GA2) CUDA .4x CUDA .xx CUDA .xx CUDA ...

  10. 笔记 oracle 创建联合主键

    笔记 alter table tablename add constraint unionkeyname primary key (column1,column2); 上面语句中: tablename ...