COJ 0349 WZJ的旅行(五)

WZJ的旅行(五)
难度级别:E; 运行时间限制:3000ms; 运行空间限制:262144KB; 代码长度限制:2000000B

试题描述

WZJ又要去旅行了T^T=0。幻想国由N个城市组成,由于道路翻修,只有N-1条双向道路可以通行,第i条双向道路从ui连接到vi,距离为wi。但这N-1条道路竟然连接了整个国家,每两个城市之间都有一条道路!

设d(a,b)表示a城市到b城市的距离(a<b)。WZJ想知道前k大的d(a,b)的值请你告诉他结果。


输入

第一个为两个正整数N,k。
接下来N-1行每行为三个正整数ui,vi,wi。  

输出

输出前k大的d(a,b)值,每个一行。

输入示例

5 10
1 2 1
1 3 2
2 4 3
2 5 4

输出示例

7
7
6
5
4
4
3
3
2
1

其他说明

1<=N<=50000,1<=k<=Min(300000,N*(N-1)/2)
1<=ui,vi<=N
1<=wi<=1000 

题解:点分治套一个超级钢琴耶,先将一个点能够到的位置用l,r数组记录下来(意会一下“够到”。。。),然后问题变为超级钢琴。。。。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 #define CH for(int d=0;d<2;d++)if(ch[d])
10 #define lson x->ch[0],L,M
11 #define rson x->ch[1],M+1,R
12 using namespace std;
13 const int maxn=500000+10,maxnode=3000000+10,maxm=1000000+10,maxt=maxn*20,inf=-1u>>1;
14 struct ted{int x,y,w;ted*nxt;}adj[maxm],*fch[maxn],*ms=adj;
15 void add(int x,int y,int w){
16     *ms=(ted){x,y,w,fch[x]};fch[x]=ms++;
17     *ms=(ted){y,x,w,fch[y]};fch[y]=ms++;
18     return;
19 }
20 int CG,size,siz[maxn],f[maxn],l[maxt],r[maxt],t[maxt],ln,rn,tot;bool vis[maxn];
21 void findcg(int x,int fa){
22     siz[x]=1;int mxs=0;
23     for(ted*e=fch[x];e;e=e->nxt){
24         int v=e->y;if(v!=fa&&!vis[v]){
25             findcg(v,x);siz[x]+=siz[v];mxs=max(mxs,siz[v]);
26         }
27     }f[x]=max(mxs,size-siz[x]);if(f[x]<f[CG])CG=x;return;
28 }
29 void dfs(int x,int fa,int dis){
30     siz[x]=1;l[++tot]=ln;r[tot]=rn;t[tot]=dis;
31     for(ted*e=fch[x];e;e=e->nxt){
32         int v=e->y;if(v!=fa&&!vis[v])dfs(v,x,dis+e->w),siz[x]+=siz[v];
33     }return;
34 }
35 void solve(int x){
36     vis[x]=true;bool flag=true;
37     for(ted*e=fch[x];e;e=e->nxt){
38         int v=e->y;if(!vis[v]){
39             if(flag)flag=false,ln=rn=++tot;
40             dfs(v,x,e->w);rn=tot;
41         }
42     }
43     for(ted*e=fch[x];e;e=e->nxt){
44         int v=e->y;if(!vis[v]){
45             f[CG=0]=size=siz[v];findcg(v,x);solve(CG);
46         }
47     }return;
48 }
49 struct node{
50     node*ch[2];int p,v;node(){v=-inf;}
51     void update(){v=-inf;CH{if(v<ch[d]->v)p=ch[d]->p,v=ch[d]->v;}return;}
52 }seg[maxnode],*nodecnt=seg,*root;int n,k,ql,qr,_p,_v;
53 void build(node*&x=root,int L=1,int R=tot){
54     x=nodecnt++;int M=L+R>>1;if(L==R)x->p=M,x->v=t[M];
55     else build(lson),build(rson),x->update();return;
56 }
57 void query(node*x=root,int L=1,int R=tot){
58     if(ql<=L&&R<=qr){
59         if(_v<x->v)_v=x->v,_p=x->p;
60     }else{int M=L+R>>1;
61         if(ql<=M)query(lson);if(qr>M)query(rson);
62     }return;
63 }
64 struct info{int x,L,R,t;};
65 bool operator<(const info&a,const info&b){return t[a.t]+t[a.x]<t[b.t]+t[b.x];}
66 priority_queue<info>Q;
67 inline int read(){
68     int x=0,sig=1;char ch=getchar();
69     for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)sig=0;
70     for(;isdigit(ch);ch=getchar())x=10*x+ch-‘0‘;
71     return sig?x:-x;
72 }
73 inline void write(long long x){
74     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
75     int len=0;long long buf[15];while(x)buf[len++]=x%10,x/=10;
76     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
77 }
78 void init(){
79     n=read();k=read();int x,y;
80     for(int i=1;i<n;i++)x=read(),y=read(),add(x,y,read());
81     f[CG=0]=size=n;findcg(1,0);solve(CG);
82     build();
83     for(int i=1;i<=tot;i++)if(l[i]){
84         ql=l[i];qr=r[i];_v=-inf;query();Q.push((info){i,l[i],r[i],_p});
85     }
86     for(int i=1;i<=k;i++){
87         info a=Q.top();Q.pop();write(t[a.x]+t[a.t]);ENT;
88         if(a.L<a.t){ql=a.L;qr=a.t-1;_v=-inf;query();Q.push((info){a.x,a.L,a.t-1,_p});}
89         if(a.t<a.R){ql=a.t+1;qr=a.R;_v=-inf;query();Q.push((info){a.x,a.t+1,a.R,_p});}
90     }
91     return;
92 }
93 void work(){
94     return;
95 }
96 void print(){
97     return;
98 }
99 int main(){init();work();print();return 0;}
时间: 2024-10-29 22:46:26

COJ 0349 WZJ的旅行(五)的相关文章

COJ 0346 WZJ的旅行(二)

WZJ的旅行(二) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 时隔多日,WZJ又来到了幻想国旅行.幻想国由N个城市组成,由于道路翻修,只有N-1条双向道路可以通行,第i条双向道路从ui连接到vi,距离为wi.但这N-1条道路竟然连接了整个国家,每两个城市之间都有一条道路! WZJ知道这里景点很多,所以他想从城市s出发到城市t,旅游所有沿途的城市.WZJ想起到锻炼作用,但又不想太累,所以城市s到城市t的距离必须在L到R之

COJ 0995 WZJ的数据结构(负五)区间操作

WZJ的数据结构(负五) 难度级别:C: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的整数组A,要求你回答执行M次操作.操作分两种: 操作1:每次操作给你l,r,v三个参数,求Al至Ar中值<=v的个数. 操作2:每次操作给你l,r,v三个参数,将Al至Ar中每个数的值+v. 输入 第一行为一个正整数N.第二行为N个整数Ai.第三行为一个正整数M.接下来M行每行4个正整数t,l,

COJ 0985 WZJ的数据结构(负十五)(限定区域不同数)

传送门:http://oj.cnuschool.org.cn/oj/home/addSolution.htm?problemID=955 试题描述: CHX有一个问题想问问大家.给你一个长度为N的数列A,请你找到两个位置L,R,使得A[L].A[L+1].…….A[R]中没有重复的数,输出R-L+1的最大值. 以上是附中联赛加试的一道题.WZJ觉得这道题太水了,改了改题目: WZJ有一个问题想问问大家.给你一个长度为N的数列A,你要回答M次问题.每次问题给你两个正整数ql,qr.请你找到两个位置

COJ 0970 WZJ的数据结构(负三十)树分治

WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计一个数据结构,回答M次操作. 1 x v:对于树上的每一个节点y,如果将x.y在树上的距离记为d,那么将y节点的权值加上d*v. 2 x:询问节点x的权值. 输入 第一行为一个正整数N.第二行到第N行每行三个正整数ui,vi,wi.表示一条树边从ui到vi,距离为wi.第N+1行为一个正整数M.最后

COJ 0981 WZJ的数据结构(负十九)树综合

WZJ的数据结构(负十九) 难度级别:E: 运行时间限制:15000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 WZJ的数据结构中有很多都是关于树的.这让很多练习模板的同学还要找来找去很不爽,于是WZJ跟小伙伴们一块商量如何将这些题汇拢到一块去: WZJ:为了大家简单,我规定一开始是一棵有根树. LZJ:那我一定得加上换根操作喽. XJR:链信息修改,链信息增加,链信息翻倍,维护链信息的最大,最小,总和肯定很好做. CHX:子树信息修改,子树信息增加,子树

COJ 0979 WZJ的数据结构(负二十一)

WZJ的数据结构(负二十一) 难度级别:C: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你实现一个数据结构,完成这样的功能: 给你一个N个点的图,初始状态无边. 每次加入一条双向边(u,v,w),若加入后没有构成一棵生成树,输出“Not Yet”,否则输出当前最小生成树的权值. 输入 第一行两个正整数N,M.表示有N个点M个操作.接下来M行每行三个正整数u,v,w. 输出 每次加入一条双向边(u,v,w),若加入后没有构成一棵生成

COJ 3016 WZJ的图论问题

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1046 试题描述: WZJ又有一个问题想问问大家.WZJ用数据生成器生成了一个虚拟旅游区.这个旅游区由N个城市构成,标号从1到N,这些城市之间由M条双向道路连接.其中每个城市有一个游乐场,游客可以花costi的钱数去城市i的游乐场玩,并获得happyi的高兴值,但对于一个游乐场,游客只能去玩至多一次.因为虚拟旅游区的内存有限,有时候WZJ被迫在系统中删去一些边,当然WZJ可

COJ 1010 WZJ的数据结构(十) 线段树区间操作

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,高效执行以下过程: #include<iostream>using namespace std;const int maxn=100010;int A[maxn];int tp,ql,qr,v;int

COJ 0999 WZJ的数据结构(负一)

WZJ的数据结构(负一) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 输入N个模板串Pi和文本串T,输出每个模板串Pi在T中出现了多少次. 输入 第一行为一个正整数N.接下来N行为Pi.最后一行为T 输出 输出N行,第i行为模板串Pi在T中出现的次数. 输入示例 5aabbaabaaababababa 输出示例 54445 其他说明 1<=sigma(|Pi|)<=10000001<=|T|<=10000