【BZOJ2117】 [2010国家集训队]Crash的旅游计划

Description

眼看着假期就要到了,Crash由于长期切题而感到无聊了,因此他决定利用这个假期和好友陶陶一起出去旅游。 Crash和陶陶所要去的城市里有$N (N > 1) $个景点,Crash用正整数\(1\)到\(N\)给景点标号。这些景点之间通过\(N − 1\)条无向道路相连,每条道路有一个长度,并且保证任意两个景点之间都有且仅有一条路径相连。现在对于一个景点\(s\),Crash和陶陶从\(s\)出发,然后访问一个景点序列\({v0, v1, v2, … , vk}\),其中\(v0\)就是\(s\),且\(vi-1\)和\(vi(0 < i ≤ k)\)之间有道路相连。需要注意的是,陶陶和Crash访问的景点序列中不会只有景点\(s\)。为了使旅程不显得乏味,在一个景点序列里他们不会重复走某条道路。我们定义这个序列的旅游代价为经过道路的长度和。下面问题出现了:陶陶:我们走一条景点数最多的景点序列吧。 Crash:倒,你想把我累死啊。陶陶:谁叫你整天坐在电脑前面,不出来锻炼,这下子傻了吧,哈哈哈哈~~ Crash:不行,如果你非要走景点数最多的我就不陪你走了。陶陶:笑喷油你很跳嘛! Crash:这样吧,我们来写伸展树,如果我写的比你快,你就要听我的。陶陶:这样不公平哎,我们来玩PES吧,当然你要让我选法国队,如果你输了你就要听我的。 Crash:倒,你这是欺负我,T_T~ 陶陶:笑喷油好说话哎。 Crash:囧…… …… 这样搞了半天,最终陶陶和Crash用很多次包剪锤决定出选择旅游代价第K小 的景点序列。不过呢Crash和陶陶还没确定开始旅行的景点s,因此他希望你对于每个景点i,计算从景点i开始的景点序列中旅游代价第\(K\)小的值。

Input

共\(N\)行。
第\(1\)行包含一个字符和两个正整数,字符为ABCD中的一个,用来表示这个测试数据的类型(详见下面的数据规模和约定),另外两个正整数分别表示\(N\)和\(K (K < N)\)。
第\(2\)行至第\(N\)行,每行有三个正整数\(u、v\)和\(w (u, v ≤ N,w ≤ 10000)\)。表示\(u\)号景点和\(v\)号景点之间有一条道路,长度为\(w\)。
输入文件保证符合题目的约定,即任意两个景点之间都有且仅有一条路径相连。

Output

共N行,每行有一个正整数。第i行的正整数表示从\(i\)号景点开始的景点序列中旅游代价第\(K\)小的代价。

Sample Input

A 6 3
1 2 2
1 3 4
1 4 3
3 5 1
3 6 2

Sample Output

4
6
4
7
5
6

有一道题题意一样,数据范围\(N<15000\)。对于那个数据范围小一点的题我们可以用经典的换根操作。换根时我们要支持区间加,全局询问小于某个数\(K\)的数量(因为要二分)。这就是个经典的分块问题

然后看这道数据范围大了很多的题。这种询问全树信息的题大概率是用点分治。我们点分治过后建出了一颗点分树。询问一个点的时候就直接在点分树上暴力跳父亲,然后在每一层的父亲上都查找一次。

不知道为什么,带修改的题容易让我联想到动态点分治,这种不带修的点分树题就容易懵逼...

做这道题让我明白一个残酷的道理:询问全树的路径是不能用线段树合并或者主席树之类的。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 100005using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}int n,k;
struct road {int to,next,w;}s[N<<1];
int h[N],cnt;
void add(int i,int j,int w) {s[++cnt]=(road) {j,h[i],w};h[i]=cnt;}int fa[N][20];
int dep[N];
int dis[N];
void dfs(int v) {for(int i=1;i<=16;i++) fa[v][i]=fa[fa[v][i-1]][i-1];for(int i=h[v];i;i=s[i].next) {int to=s[i].to;if(to==fa[v][0]) continue ;fa[to][0]=v;dep[to]=dep[v]+1;dis[to]=dis[v]+s[i].w;dfs(to);}
}int lca(int a,int b) {if(dep[a]<dep[b]) swap(a,b);for(int i=16;i>=0;i--)if(fa[a][i]&&dep[fa[a][i]]>=dep[b])a=fa[a][i];if(a==b) return a;for(int i=16;i>=0;i--)if(fa[a][i]!=fa[b][i])a=fa[a][i],b=fa[b][i];return fa[a][0];
}
int Get_dis(int a,int b) {return dis[a]+dis[b]-2*dis[lca(a,b)];}
int size[N],mx[N],rt;
int sum;
int pr[N],fr[N];
bool vis[N];void Get_root(int v,int fr) {::fr[v]=fr;size[v]=1;mx[v]=0;for(int i=h[v];i;i=s[i].next) {int to=s[i].to;if(vis[to]||to==fr) continue ;Get_root(to,v);size[v]+=size[to];mx[v]=max(mx[v],size[to]);}mx[v]=max(mx[v],sum-size[v]);if(mx[rt]>mx[v]) rt=v;
}vector<int>my[N],f[N];
void statis(int v,int fr,int dep,int x,int y) {my[x].push_back(dep);f[y].push_back(dep);for(int i=h[v];i;i=s[i].next) {int to=s[i].to;if(to==fr||vis[to]) continue ;statis(to,v,dep+s[i].w,x,y);}
}void solve(int v) {vis[v]=1;if(fr[v]) size[fr[v]]=sum-size[v];my[v].push_back(0);for(int i=h[v];i;i=s[i].next) {int to=s[i].to;if(vis[to]) continue ;sum=size[to];rt=0;Get_root(to,v);pr[rt]=v;statis(to,v,s[i].w,v,rt);solve(rt);}
}int query(int v,int x) {int ans=0;ans=lower_bound(my[v].begin(),my[v].end(),x)-my[v].begin();for(int i=v;pr[i];i=pr[i]) {int d=Get_dis(v,pr[i]);ans+=lower_bound(my[pr[i]].begin(),my[pr[i]].end(),x-d)-my[pr[i]].begin();ans-=lower_bound(f[i].begin(),f[i].end(),x-d)-f[i].begin();}return ans;
}int main() {mx[0]=1e9;n=Get(),k=Get();k++;int a,b,c;for(int i=1;i<n;i++) {a=Get(),b=Get(),c=Get();add(a,b,c),add(b,a,c);}dfs(1);sum=n;Get_root(1,0);solve(rt);for(int i=1;i<=n;i++) {sort(my[i].begin(),my[i].end());sort(f[i].begin(),f[i].end());}for(int i=1;i<=n;i++) {int l=0,r=1e9,mid;while(l<r) {mid=l+r+1>>1;if(query(i,mid)>=k) r=mid-1;else l=mid;}cout<<l<<"\n";}return 0;
}

转载于:https://www.cnblogs.com/hchhch233/p/10471621.html

【BZOJ2117】 [2010国家集训队]Crash的旅游计划相关推荐

  1. [2010国家集训队]Crash的旅游计划

    Description 眼看着假期就要到了,Crash由于长期切题而感到无聊了,因此他决定利用这个假期和好友陶陶一起出去旅游. Crash和陶陶所要去的城市里有N (N > 1) 个景点,Cra ...

  2. BZOJ 2154 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演,经典好题)(Luogu P1829)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P1829 [国家集训队]Crash的数字表格 / JZPTAB(反演,经典好题) Problem S ...

  3. P1829 [国家集训队]Crash的数字表格(推了好久的mobius反演)

    P1829 [国家集训队]Crash的数字表格 / JZPTAB 推导过程 ∑i=1n∑j=1mlcm(i,j)\sum_{i = 1} ^{n} \sum_{j = 1} ^{m} lcm(i, j ...

  4. P4827 [国家集训队] Crash 的文明世界

    P4827 [国家集训队] Crash 的文明世界 题目描述 Solution 看到这种kkk次幂的式子,就应该往斯特林数的方面想想. mn=∑i{ni}(ni)i!m^n=\sum_i \left\ ...

  5. P1829 [国家集训队]Crash的数字表格 / JZPTAB

    P1829 [国家集训队]Crash的数字表格 / JZPTAB 题意: 求∑i=1n∑j=1mlcm(i,j)\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)∑i=1n​∑j ...

  6. P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)

    [国家集训队]Crash的数字表格 / JZPTAB 题目描述 今天的数学课上,Crash 小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数 a a a 和 b b ...

  7. BZOJ 2156 「国家集训队」星际探索(最短路)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2156 是 hydro 的 BZOJ ...

  8. 数据结构(莫队算法):国家集训队2010 小Z的袜子

    [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到 ...

  9. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

最新文章

  1. Linux之Vim文本代码编辑神器应用get技巧
  2. 让bind函数支持IE8浏览器的方法
  3. Exchange环境搭建心得
  4. 容器的访问元素的成员函数(front,back,下标和at)返回的都是引用
  5. 代码分析+原理图解——棋盘覆盖问题-分治法
  6. EF Core For MySql查询中使用DateTime.Now作为查询条件的一个小问题
  7. kotlin半生对象_Kotlin程序| 随播对象特征
  8. 【Java】反射、枚举、Lambda表达式
  9. 视频rtmp协议简介
  10. ACCESS数据库C#操作类(SQLHELPER修改版)——转自网上
  11. MATLAB基础数组操作及循环语句语法简介
  12. linux嵌入式聊天室的程序,基于Linux网络聊天室的设计与实现
  13. httprunner 3.x学习10 - parameters 参数化
  14. 视频怎么去水印教程 视频怎么去水印无痕迹
  15. kafka connector使用(Docker一键启动版)
  16. 云计算通俗解释,什么叫云计算
  17. 量子计算时代来临?D-Wave 量子计算机使运算速度提高 1 亿倍!
  18. 秋招面试总结(计算机视觉、3D算法、三维重建、相机标定等岗位)
  19. Android中多行文本末尾添加图片 图标在文字后面 换行
  20. 到哪下c语言编译器,在那里可以下载到C语言的编译器

热门文章

  1. fields在php中,phpmysqli_num_fields函数怎么用
  2. 机器学习(6)--化无限为有限(二)
  3. 新冠轻症也会导致大脑退化,牛津大学最新研究登上Nature
  4. 中国700万程序员不够用怎么办?我们去问了北大谢涛,顶会ASE最有影响力论文奖首批华人得主...
  5. 国产期刊崛起!上海大学、郑州大学主办期刊IF超15,2021版SCI期刊影响因子出炉...
  6. 14.7倍推理加速、18.9倍存储节省!北航、商汤、UCSD提出首个点云二值网络 | ICLR 2021...
  7. Nature最新封面:哺乳动物有「一键返老还童」按钮,复旦校友的这项研究恢复了老年小鼠视力...
  8. openJDK之sun.misc.Unsafe类CAS底层实现
  9. github push时候报错解决方法
  10. CentOS+Nginx+Tomcat+Mysql+PHP 环境搭建及系统部署