[CodeChef Trips]Children Trips
Children Trips
题解
关于这种跳跃的**题,当它PPP值很大时几次就可以跳到目标节点了,而较小时却会跳很久,所以我们很快就可以想到对询问分类处理。
对于P>nP>\sqrt{n}P>n的询问,它跳到终点的次数大概是n\sqrt{n}n级别的,我们可以直接用它暴力跳,用倍增维护它下一个可以跳到的节点。
很明显,这样单次询问的时间复杂度是O(nlogn)O\left(\sqrt{n}log\,n\right)O(nlogn)。
而对于P⩽nP\leqslant \sqrt{n}P⩽n询问,因为这样的PPP的数量很小,我们不妨考虑预处理出这些PPP的倍增数组,即它跳2k2^k2k步可以跳到哪里,询问时就直接倍增找答案。
很明显,这样的预处理时间复杂度是O(nnlogn)O\left(n\sqrt{n}log\,n\right)O(nnlogn)的,单次询问时间复杂度为O(logn)O\left(log\,n\right)O(logn)。
虽然对于第二类的询问我们只能从两端开始跳,而从上往下跳与从下往上跳两种方法的到的答案不一定相同,但由于它的边权最大是222,所以我们整个过程中浪费也只会浪费111的跳跃。
可以发现,这并不影响我们得到正确答案。
时间复杂度很明显是O((n+q)nlogn)O\left((n+q)\sqrt{n}log\,n\right)O((n+q)nlogn)。
源码
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 100005
#define lowbit(x) (x&-x)
#define reg register
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
#define lson (rt<<1)
#define rson (rt<<1|1)
typedef long long LL;
typedef unsigned long long uLL;
const LL INF=1000000000000000000LL;
const int mo=1e9+7;
const int n1=300;
const int inv2=499122177;
const int jzm=2333;
const int orG=3,invG=332748118;
const double Pi=acos(-1.0);
const double eps=1e-7;
typedef pair<int,int> pii;
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
void print(_T x){if(x<0){x=(~x)+1;putchar('-');}if(x>9)print(x/10);putchar(x%10+'0');}
LL gcd(LL a,LL b){return !b?a:gcd(b,a%b);}
int add(int x,int y,int p){return x+y<p?x+y:x+y-p;}
void Add(int &x,int y,int p){x=add(x,y,p);}
int qkpow(int a,int s,int p){int t=1;while(s){if(s&1LL)t=1ll*a*t%p;a=1ll*a*a%p;s>>=1LL;}return t;}
int n,m,head[MAXN],tot,dep[MAXN],dis[MAXN],f[MAXN][20],fw[MAXN][20];
int ord[MAXN],idx,totmin,totmax,ans[MAXN];
struct edge{int to,nxt,paid;}e[MAXN<<1];
struct ming{int u,v,p,id;}smin[MAXN],smax[MAXN];
vector<int>vec[305];
void addEdge(int u,int v,int w){e[++tot]=(edge){v,head[u],w};head[u]=tot;}
void dosaka(int u,int fa){dep[u]=dep[fa]+1;f[u][0]=fa;ord[++idx]=u;for(int i=1;i<=18;i++)f[u][i]=f[f[u][i-1]][i-1];for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==fa)continue;dis[v]=dis[u]+e[i].paid;dosaka(v,u);}
}
int lca(int a,int b){if(dep[a]>dep[b])swap(a,b);for(int i=18;i>=0;i--)if(dep[f[b][i]]>=dep[a])b=f[b][i];if(a==b)return a;for(int i=18;i>=0;i--)if(f[a][i]!=f[b][i])a=f[a][i],b=f[b][i];return f[a][0];
}
signed main(){read(n);for(int i=1;i<n;i++){int u,v,w;read(u);read(v);read(w);addEdge(u,v,w);addEdge(v,u,w);}dosaka(1,0);read(m);for(int i=1;i<=m;i++){int s,f,p;read(s);read(f);read(p);if(p<=n1)smin[++totmin]=(ming){s,f,p,i};else smax[++totmax]=(ming){s,f,p,i};}for(int i=1;i<=totmin;i++)vec[smin[i].p].push_back(i);for(int i=2;i<=n1;i++){if(vec[i].empty())continue;for(int j=1;j<=n;j++){int x=ord[j],now=x;for(int k=18;k>=0;k--)if(dis[x]-dis[f[now][k]]<=i)now=f[now][k];fw[x][0]=now;for(int k=1;k<=18;k++)fw[x][k]=fw[fw[x][k-1]][k-1];}for(int j=0;j<vec[i].size();j++){int t=vec[i][j],u=smin[t].u,v=smin[t].v,u_v=lca(u,v),x=v;for(int k=18;k>=0;k--)if(dep[fw[u][k]]>dep[u_v])u=fw[u][k],ans[smin[t].id]+=(1<<k);for(int k=18;k>=0;k--)if(dep[fw[v][k]]>dep[u_v])v=fw[v][k],ans[smin[t].id]+=(1<<k);ans[smin[t].id]+=(dis[u]+dis[v]-2*dis[u_v]+i-1)/i;} }for(int i=1;i<=totmax;i++){int u=smax[i].u,v=smax[i].v,u_v=lca(u,v),w=smax[i].p,x=v; if(u==v)continue;while(dis[u]-dis[u_v]>w){int y=u;for(int j=18;j>=0;j--)if(dis[u]-dis[f[y][j]]<=w&&dep[f[y][j]]>dep[u_v])y=f[y][j];ans[smax[i].id]++;u=y;}while(dis[v]-dis[u_v]>w){int y=v;for(int j=18;j>=0;j--)if(dis[v]-dis[f[y][j]]<=w&&dep[f[y][j]]>dep[u_v])y=f[y][j];ans[smax[i].id]++;v=y;}ans[smax[i].id]+=(dis[u]+dis[v]-2*dis[u_v]+w-1)/w;}for(int i=1;i<=m;i++)printf("%d\n",ans[i]);return 0;
}
[CodeChef Trips]Children Trips相关推荐
- Codechef TRIPS Children Trips (分块、倍增)
题目链接: https://www.codechef.com/problems/TRIPS 感觉CC有点毒瘤啊.. 题解: 首先有一个性质可能是因为太傻所以网上没人解释,然而我看了半天: 就是正序和倒 ...
- 【codechef】Children Trips
Portal -->CC_Children Trips Solution (英文题解看得真爽qwq不过写的好详细啊ovo) 首先这题有一个很重要的条件就是边权是\(1\)或者\(2\),所以虽然 ...
- 【CODECHEF】Children Trips(分块)
主要的操作是:每一天走到最远能够走到的休息区 确实一开始没有想到是分块,只是觉得1<=d<=21<=d<=21<=d<=2有点东西,但是没有搞出来. 其实也可以说是 ...
- 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) ...
- 一二三系列之CodeChef分块——Chef and Churu,Chef and Problems,Children Trips
文章目录 Chef and Churu source solution code Chef and Problems source solution code Children Trips sourc ...
- [CC-TRIPS]Children Trips
[CC-TRIPS]Children Trips 题目大意: \(n(n\le10^5)\)座城市构成一棵树,且树上的每条边的长度\(l_i\)满足\(1\le l_i\le 2\).\(m(m\le ...
- CODECHEF Oct. Challenge 2014 Children Trips
@(XSY)[分塊, 倍增] Description There's a new trend among Bytelandian schools. The "Byteland Tourist ...
- Go 语言编程 — 编码规范指南
目录 文章目录 目录 参考 工程化要求 编码规范 大小约定 缩进.括号和空格约定 命名规范 包.目录命名规范 文件命名规范 标识符命名规范 变量.常量名 函数.方法名 结构体.接口名 空行.注释.文档 ...
- (转载)构建public APIs与CORS
from: https://segmentfault.com/a/1190000000709909 理由:在操作层面详细的讲解了跨域的操作.尤其是对于option请求的详解.收藏. 在构建Public ...
最新文章
- Java学习笔记二:数据类型
- SAP Hybris WCMS cockpit 的登录 url
- java设计模式之状态模式_Java中的状态设计模式
- 实践:使用了CompletableFuture之后,程序性能提升了三倍
- prim算法_数据结构 7.4.1 最小生成树 Prim
- C#txt文本分割器
- 读懂LaTeX中cls文件
- 2021,你值得看的华为/字节/腾讯/京东/网易/滴滴面经分享
- 说明书丨Epigentek EpiNext 高灵敏免疫共沉淀测序试剂盒
- HTTP 错误 404.0 - Not Found
- Mac下安装Maven
- Python 读取excel指定的列
- C语言学习开篇 对C语言和编程的认识
- Ollydbg使用技巧
- 2015阿里校园招聘测试开发面试经验(广州站)
- Ubuntu 安装Jdk1.8
- idea最常用的快捷键,写代码快到飞起
- TokuDB 引擎安装
- 数据解析(Data Parsing)有什么作用?
- Gutenberg 11.8.0 有哪些新变化?
热门文章
- u盘无法格式化不在计算机中,U盘无法格式化,里面的文件也无法删除?
- 体验搜狐PaaS平台搜狐云景-自动调度(Autoscale)
- 全球与中国微型翘板开关市场现状及未来发展趋势
- 乐乐音乐H5网页版-支持krc歌词(动感歌词、翻译和音译歌词)
- 【论文阅读】Paraformer工业级非自回归端到端语音识别模型
- 购物栏置底 - uni-ui组件uni-goods-nav放在屏幕下方的办法
- html css基础笔记,学习html/css基础的重点笔记
- 微信授权文件放到域名根目录
- 记一次线上启动war包 StackOverflowError
- a.gray.Bulimia.a病毒