[HNOI2015]接水果

时间限制:60s      空间限制:512MB

题目描述

风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果。
由于她已经DT FC 了The big black,  她觉得这个游戏太简单了,于是发明了一个更
加难的版本。首先有一个地图,是一棵由 n 个顶点、n-1 条边组成的树(例如图 1
给出的树包含 8 个顶点、7 条边)。这颗树上有 P 个盘子,每个盘子实际上是一条
路径(例如图 1 中顶点 6 到顶点 8 的路径),并且每个盘子还有一个权值。第 i 个
盘子就是顶点a_i到顶点b_i的路径(由于是树,所以从a_i到b_i的路径是唯一的),
权值为c_i。接下来依次会有Q个水果掉下来,每个水果本质上也是一条路径,第
i 个水果是从顶点 u_i 到顶点v_i 的路径。幽香每次需要选择一个盘子去接当前的水
果:一个盘子能接住一个水果,当且仅当盘子的路径是水果的路径的子路径(例如
图1中从 3到7 的路径是从1到8的路径的子路径)。这里规定:从a 到b的路径与
从b到 a的路径是同一条路径。当然为了提高难度,对于第 i 个水果,你需要选择
能接住它的所有盘子中,权值第 k_i 小的那个盘子,每个盘子可重复使用(没有使用次数
的上限:一个盘子接完一个水果后,后面还可继续接其他水果,只要它是水
果路径的子路径)。幽香认为这个游戏很难,你能轻松解决给她看吗? 

输入格式

第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数。

接下来n-1 行,每行两个数 a、b,表示树上的a和b 之间有一条边。树中顶点
按1到 n标号。 接下来 P 行,每行三个数 a、b、c,表示路径为 a 到 b、权值为 c 的盘子,其
中0≤c≤10^9,a不等于b。 
接下来Q行,每行三个数 u、v、k,表示路径为 u到 v的水果,其中 u不等于v,你需要选择第 k小的盘子,
第k 小一定存在。 

输出格式

对于每个果子,输出一行表示选择的盘子的权值。


样例输入

10 10 10
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
3 2 217394434
10 7 13022269
6 7 283254485
6 8 333042360
4 6 442139372
8 3 225045590
10 4 922205209
10 8 808296330
9 2 486331361
4 9 551176338
1 8 5
3 8 3
3 8 4
1 8 3
4 8 1
2 3 1
2 3 1
2 3 1
2 4 1
1 4 1

样例输出

442139372
333042360
442139372
283254485
283254485
217394434
217394434
217394434
217394434
217394434

提示

N,P,Q<=40000。


题目来源

没有写明来源

类似HNOI2017的影魔,思想是把对象映射到平面上。

代码用时:1.5h。非常裸,整体二分加扫描线,树状数组代替线段树既省时有省力。

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=;
int n,m,q,a,b,c,k,u,cnt,fa[N][],dfn[N],tim,lst[N],v[N],dep[N],ans[N],sum[N],nxt[N],h[N],to[N],tot;
struct P{ int x1,x2,y1,y2,v; }p[N];
struct D{ int x,y1,y2,v,id; }d[N];
struct Q{int x,y,k,id; }pnt[N],t1[N],t2[N];
bool operator <(P a,P b){ return a.v<b.v; }
bool operator <(D a,D b){ return a.x==b.x ? a.id<b.id : a.x<b.x; }
void add(int u,int v){ nxt[++tot]=h[u]; h[u]=tot; to[tot]=v; }
int que(int x){ int res=; for (; x; x-=(x&(-x))) res+=v[x]; return res; } void mdf(int l,int r,int k){
for (int i=l; i<=n; i+=(i&(-i))) v[i]+=k;
for (int i=r+; i<=n; i+=(i&(-i))) v[i]-=k;
} void dfs(int x){
dfn[x]=++tim;
rep(i,,) fa[x][i]=fa[fa[x][i-]][i-];
For(i,x) if ((k=to[i])!=fa[x][]) fa[k][]=x,dep[k]=dep[x]+,dfs(k);
lst[x]=tim;
} int go(int a,int h){ for (int i=; ~i; i--) if (h&(<<i)) a=fa[a][i]; return a; } int lca(int a,int b){
if (dep[a]<dep[b]) swap(a,b);
a=go(a,dep[a]-dep[b]);
if (a==b) return a;
for (int i=; ~i; i--) if (fa[a][i]!=fa[b][i]) a=fa[a][i],b=fa[b][i];
return fa[a][];
} void solve(int l,int r,int st,int ed){
if (st>ed) return;
if (l==r){ rep(i,st,ed) ans[pnt[i].id]=p[l].v; return; }
int mid=(l+r)>>,sz=;
rep(i,l,mid){
d[++sz]=(D){p[i].x1,p[i].y1,p[i].y2,,};
d[++sz]=(D){p[i].x2,p[i].y1,p[i].y2,-,n+};
}
rep(i,st,ed) d[++sz]=(D){pnt[i].x,pnt[i].y,,,i};
sort(d+,d+sz+);
rep(i,,sz)
if (st<=d[i].id && d[i].id<=ed) sum[d[i].id]=que(d[i].y1);
else mdf(d[i].y1,d[i].y2,d[i].v);
int a=,b=;
rep(i,st,ed)
if (sum[i]>=pnt[i].k) t1[++a]=pnt[i];
else t2[++b]=(Q){pnt[i].x,pnt[i].y,pnt[i].k-sum[i],pnt[i].id};
rep(i,st,st+a-) pnt[i]=t1[i-st+];
rep(i,st+a,ed) pnt[i]=t2[i-st-a+];
solve(l,mid,st,st+a-); solve(mid+,r,st+a,ed);
} int main(){
freopen("bzoj4009.in","r",stdin);
freopen("bzoj4009.out","w",stdout);
scanf("%d%d%d",&n,&m,&q);
rep(i,,n-) scanf("%d%d",&a,&b),add(a,b),add(b,a);
dfs();
rep(i,,m){
scanf("%d%d%d",&a,&b,&c); u=lca(a,b);
if (dfn[a]>dfn[b]) swap(a,b);
if (u!=a) p[++cnt]=(P){dfn[a],lst[a],dfn[b],lst[b],c};
else{
int w=go(b,dep[b]-dep[a]-);
p[++cnt]=(P){,dfn[w]-,dfn[b],lst[b],c};
if (lst[w]<n) p[++cnt]=(P){dfn[b],lst[b],lst[w]+,n,c};
}
}
sort(p+,p+cnt+);
rep(i,,q){
scanf("%d%d%d",&a,&b,&k);
if (dfn[a]>dfn[b]) swap(a,b);
pnt[i]=(Q){dfn[a],dfn[b],k,i};
}
solve(,cnt,,q);
rep(i,,q) printf("%d\n",ans[i]);
return ;
}

[BZOJ4009][HNOI2015]接水果(整体二分)的更多相关文章

  1. [bzoj4009] [HNOI2015]接水果 整体二分+扫描线+dfs序+树状数组

    Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更 加 ...

  2. bzoj4009 [HNOI2015]接水果 整体二分+扫描线+树状数组+dfs序

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4009 题解 考虑怎样的情况就会有一个链覆盖另一个链. 设被覆盖的链为 \(a - b\),覆盖 ...

  3. BZOJ4009:[HNOI2015]接水果(整体二分版)

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...

  4. BZOJ.4009.[HNOI2015]接水果(整体二分 扫描线)

    LOJ BZOJ 洛谷 又是一个三OJ rank1!=w= \(Description\) (还是感觉,为啥非要出那种题目背景啊=-=直接说不好么) 给定一棵树和一个路径集合(每条路径有一个权值).\ ...

  5. BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)

    整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...

  6. [HNOI2015]接水果[整体二分]

    [HNOI2015]接水果 给出一个树上路径集合\(S\) 多次询问\(x,y\)中的\(k\)小值 如果你问我数列上那么我会 树上的话 树上差分了吧直接?- 令 \(st_x<st_y\) 1 ...

  7. 2018.10.02 bzoj4009: [HNOI2015]接水果(整体二分)

    传送门 整体二分好题. 考虑水果被盘子接住的条件. 不妨设水果表示的路径为(x1,y1)(x_1,y_1)(x1​,y1​),盘子表示的为(x2,y2)(x_2,y_2)(x2​,y2​) 不妨设df ...

  8. [HNOI2015][bzoj4009] 接水果 [整体二分+扫描线]

    题面 传送门 思路 本题其实有在线做法......但是太难写了,退而求其次写了离线 基本思路就是,考虑一个盘子以及它能接到的所有水果 可以发现,这个水果的端点一定在这个盘子两端的"子树&qu ...

  9. bzoj4009: [HNOI2015]接水果(整体二分)

    题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更加难的版本. 首先有 ...

随机推荐

  1. HDU 5995 Kblack loves flag (模拟)

    题目链接 Problem Description Kblack loves flags, so he has infinite flags in his pocket. One day, Kblack ...

  2. 在浏览器中输入www.baidu.com后执行的全过程

    链接 http 请求过程——当我们在浏览器输入 www.baidu.com,然后回车之后的详解. 1)域名解析(域名 www.baidu.com变为 ip 地址). 1.浏览器搜索自己的DNS缓存(维 ...

  3. [How to] 使用HBase协处理器---Endpoint服务端的实现

    1.简介 前篇文章[How to] 使用HBase协处理器---基本概念和regionObserver的简单实现中提到了两种不同的协处理器,并且实现了regionObserver. 本文将介绍如何使用 ...

  4. uWSGI+Nginx+Flask在Linux下的部署

    搞了一天多,终于搞通了uWSGI的部署原理,下面总结一下遇到的一些坑,希望给读者能够少走弯路.        简单来说,uWSGI是一个web服务器,Nginx进行反向代理的其实跟这些服务器可以说没有 ...

  5. java基础16 捕获、抛出以、自定义异常和 finally 块(以及关键字:throw 、throws)

    1.异常的体系 /* ------|Throwable:所有异常和错误的超类 ----------|Error(错误):错误一般用于jvm或者硬件引发的问题,所以我们一般不会通过代码去处理错误的 -- ...

  6. java并发编程实战笔记---(第二章)线程安全:正确性

    ThreadA__________     同步 ______________ 异步 ___________     异步 ThreadB__________         ____________ ...

  7. go的匿名组合

    golang也提供了继承机制,但采用组合的文法,因此称为匿名组合.与其他语言不同, golang很清晰地展示出类的内存布局是怎样的. 一  非指针方式的组合 1)基本语法 type base stru ...

  8. git的一些配置

    git使用socks代理加速 原来git可以配置socks代理的,真好,从github上clone了opencv的代码,基本上是满速了. 首先需要配置shadowsocks,然后通过GUI客户端(或命 ...

  9. Python使用opencv

    Python配置opencv 原理 Python调用opencv的原理是:opencv编译出共享库文件,python把这个共享库文件作为一个模块加载并使用. 通俗点就是,编译opencv的时候开启py ...

  10. 纯js的N级联动列表框 —— 基于jQuery

    多个列表框联动,不算是啥大问题,但是却挺麻烦,那么怎么才能够尽量方便一点呢?网上搜了一下,没发现太好用的,于是就自己写了一个.基于jQuery,无限级联动,支持下拉列表框和列表框. 先说一下步骤和使用 ...