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

时间:2023-01-12 22:36:58

【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 100005 using 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;
}

【BZOJ2117】 [2010国家集训队]Crash的旅游计划的更多相关文章

  1. BZOJ4317Atm的树&amp&semi;BZOJ2051A Problem For Fun&amp&semi;BZOJ2117&lbrack;2010国家集训队&rsqb;Crash的旅游计划——二分答案&plus;动态点分治&lpar;点分树套线段树&sol;点分树&plus;vector&rpar;

    题目描述 Atm有一段时间在虐qtree的题目,于是,他满脑子都是tree,tree,tree…… 于是,一天晚上他梦到自己被关在了一个有根树中,每条路径都有边权,一个神秘的声音告诉他,每个点到其他的 ...

  2. BZOJ2117&colon; &lbrack;2010国家集训队&rsqb;Crash的旅游计划

    裸点分,点分树每层维护有序表,查询二分,复杂度$O(nlog^3n)$. #include<bits/stdc++.h> #define M (u+v>>1) #define ...

  3. &lbrack;2010国家集训队&rsqb;Crash的旅游计划

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

  4. BZOJ 2117&colon; &lbrack;2010国家集训队&rsqb;Crash的旅游计划 动态点分治&plus;二分

    感觉现在写点分治可快了~ 二分答案,就可以将求第 $k$ 大转换成一个判断问题,直接拿点分树判断一下就行了. #include <cstdio> #include <vector&g ...

  5. &lbrack;BZOJ2051&rsqb;A Problem For Fun&sol;&lbrack;BZOJ2117&rsqb;Crash的旅游计划&sol;&lbrack;BZOJ4317&rsqb;Atm的树

    [BZOJ2051]A Problem For Fun/[BZOJ2117]Crash的旅游计划/[BZOJ4317]Atm的树 题目大意: 给出一个\(n(n\le10^5)\)个结点的树,每条边有 ...

  6. &lbrack;国家集训队&rsqb; Crash 的文明世界&lpar;第二类斯特林数&rpar;

    题目 [国家集训队] Crash 的文明世界 前置 斯特林数\(\Longrightarrow\)斯特林数及反演总结 做法 \[\begin{aligned} ans_x&=\sum\limi ...

  7. 洛谷 P1829 &lbrack;国家集训队&rsqb;Crash的数字表格 &sol; JZPTAB 解题报告

    [国家集训队]Crash的数字表格 / JZPTAB 题意 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\le 10^7\) 鉴于 ...

  8. &lbrack;Luogu P1829&rsqb; &lbrack;国家集训队&rsqb;Crash的数字表格 &sol; JZPTAB &lpar;莫比乌斯反演&rpar;

    题面 传送门:洛咕 Solution 调到自闭,我好菜啊 为了方便讨论,以下式子\(m>=n\) 为了方便书写,以下式子中的除号均为向下取整 我们来颓柿子吧qwq 显然,题目让我们求: \(\l ...

  9. 题解-&lbrack;国家集训队&rsqb;Crash的数字表格 &sol; JZPTAB

    题解-[国家集训队]Crash的数字表格 / JZPTAB 前置知识: 莫比乌斯反演 </> [国家集训队]Crash的数字表格 / JZPTAB 单组测试数据,给定 \(n,m\) ,求 ...

随机推荐

  1. jQuery&period;grep&lpar;&rpar;

    什么是jQuery.grep()? jQuery.grep()是一个查找满足过滤函数的数组元素的函数.原始数组不受影响,返回值为数组. 用法介绍: 写法: jQuery.grep( array, fu ...

  2. Spring 学习笔记 7&period; 尚硅谷&lowbar;佟刚&lowbar;Spring&lowbar;Bean 的作用域

    1,理论 •在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域. •默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创 ...

  3. JS运动学习笔记 -- 任意值的运动框架(高&sol;宽度,背景颜色,文本内容,透明度等)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Hibernate逍遥游记-第13章 映射实体关联关系-002用主键映射一对一&lpar;&lt&semi;one-to-one constrained&equals;&quot&semi;true&quot&semi;&gt&semi;、&lt&semi;generator class&equals;&quot&semi;foreign&quot&semi;&gt&semi;&rpar;

    1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...

  5. Ubuntu 14&period;04 SSH &plus; 远程登录xrdp

    1. 安装ssh 打开"终端窗口",输入"sudo apt-get install openssh-server"-->回车-->输入"y ...

  6. Android多媒体开发-- OpenMax IL简介

    1.openmax 简介 http://www.khronos.org/openmax/ OpenMax是一个多媒体应用程序的框架标准,由NVIDIA公司和Khronos在2006年推出. OpenM ...

  7. zoj3822 期望dp

    每天在一个n*m的棋盘上放棋子,问使得每一行,每一列都有棋子的期望天数 dp[n][m][k] 表示用k个棋子占据了n行,m列,距离目标状态还需要的期望天数 那么dp[n][m][k] = p1 * ...

  8. 一个优秀团队leader应该具备的几点素质

    首先,技术要过硬.毕竟一个团队是在靠技术为别人创造价值的,一定程度上,团队leader的技术能力决定了整个团队的技术上限.leader对技术的坚持和追求很可能会影响团队成员对技术的坚持和追求,至少le ...

  9. ArcGis Python脚本——遍历输出面或折线要素的折点坐标

    有示例要素类如下 经过下面代码处理 #遍历输出面或折线要素的折点坐标 #infc:输入要素类 # code source: https://www.cnblogs.com/yzhyingcool/# ...

  10. 网络篇:linux下select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪 ...