https://www.lydsy.com/JudgeOnline/problem.php?id=4009

https://www.luogu.org/problemnew/show/P3242

https://loj.ac/problem/2113

风见幽香非常喜欢玩一个叫做 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 小的那个盘子,每个盘子可重复使用(没有使用次数的上限:一个盘子接完一个水果后,后面还可继续接其他水果,只要它是水果路径的子路径)。幽香认为这个游戏很难,你能轻松解决给她看吗?

因为预先做过LOJ6276:果树,不难想到对于树上路径的处理方法和它一样。

那么对于每个盘子用dfs序表示的路径点(u,v),分两种情况:

1.u和v有一个不同于二者的lca

显然它能接到的水果的两端一个在u的子树中,一个在v的子树中。

2.v是u的祖先。

显然它能接到的水果的两端一个在u的子树中,一个在v的子树的补集(包括v)中。

那么对于一个水果的路径点,如果在这个矩形当中,就说明这个水果能够被哪些盘子所接。

那么处理完之后,显然不能用主席树来解决第k大(如果能当我没说),于是我们整体二分一下即可。

……这是我最开始做这道题的想法,但是码了4h后对此绝望,对着数据参着题解调到现在才过。

说几个(我)容易错的点:

1.区间第k小,所以不是第k大的做法,注意答案在左区间还是右区间。

2.用扫描线存的时候注意空间开大点,另外上边界不要忘了+1

3.矩形的x和y坐标以及水果的x和y坐标存法(顺序)一定要相同。

代码138行凑和吧,但是细节真心多。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=4e4+;
const int B=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct path{
int to,nxt;
}e[N*];
struct dish{
int x1,x2,y,c,w;
}d[*N],td1[*N],td2[*N];
struct fruit{
int x,y,k,id;
}f[N],tf1[N],tf2[N];
int m,b[N],ans[N],tr[N],c[N];
int anc[N][B+],dep[N],size[N];
int n,p,q,cnt,head[N],pos[N],tot;
inline bool cmp1(dish a,dish b){
return a.y<b.y;
}
inline bool cmp2(fruit a,fruit b){
return a.y<b.y;
}
inline void add(int u,int v){
e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
void dfs(int u){
pos[u]=++tot;size[u]=;
dep[u]=dep[anc[u][]]+;
for(int i=;i<=B;++i)
anc[u][i]=anc[anc[u][i-]][i-];
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v!=anc[u][]){
anc[v][]=u;
dfs(v);
size[u]+=size[v];
}
}
}
inline int LCA(int i,int j){
if(dep[i]<dep[j])swap(i,j);
for(int k=B;k>=;--k)
if(dep[anc[i][k]]>=dep[j])i=anc[i][k];
if(i==j)return i;
for(int k=B;k>=;--k)
if(anc[i][k]!=anc[j][k])
i=anc[i][k],j=anc[j][k];
return anc[i][];
}
inline int lowbit(int t){return t&(-t);}
inline void ins(int x,int y){
for(int i=x;i<=n;i+=lowbit(i))tr[i]+=y;
}
inline int qry(int x){
int res=;
for(int i=x;i;i-=lowbit(i))res+=tr[i];
return res;
}
inline void mdy(int l,int r,int w){
ins(l,w);ins(r+,-w);
}
void solve(int L,int R,int s,int t,int l,int r){
if(L>R||s>t)return;
if(l==r){
for(int i=L;i<=R;++i)ans[f[i].id]=c[l];
return;
}
int id1=,id2=,if1=,if2=,mid=(l+r)>>,j=s;
for(int i=L;i<=R;++i){
for(;j<=t&&d[j].y<=f[i].y;++j){
if(d[j].c>c[mid])td1[id1++]=d[j];
else mdy(d[j].x1,d[j].x2,d[j].w),td2[id2++]=d[j];
}
int tmp=qry(f[i].x);
if(f[i].k>tmp)f[i].k-=tmp,tf1[if1++]=f[i];
else tf2[if2++]=f[i];
}
for(;j<=t;++j){
if(d[j].c>c[mid])td1[id1++]=d[j];
else mdy(d[j].x1,d[j].x2,d[j].w),td2[id2++]=d[j];
}
int mdst=s+id1,MID=L+if1;
for(int i=s;i<mdst;++i)d[i]=td1[i-s];
for(int i=mdst;i<=t;++i)d[i]=td2[i-mdst];
for(int i=L;i<MID;++i)f[i]=tf1[i-L];
for(int i=MID;i<=R;++i)f[i]=tf2[i-MID];
solve(L,MID-,s,mdst-,mid+,r);solve(MID,R,mdst,t,l,mid);
return;
}
int main(){
n=read(),p=read(),q=read();
for(int i=;i<n;++i){
int u=read(),v=read();
add(u,v);add(v,u);
}
dfs();
for(int i=;i<=p;++i){
int u=read(),v=read();c[i]=read();
if(pos[u]>pos[v])swap(u,v);
int lca=LCA(u,v);
if(lca!=u&&lca!=v){
d[++m]=(dish){pos[u],pos[u]+size[u]-,pos[v],c[i],};
d[++m]=(dish){pos[u],pos[u]+size[u]-,pos[v]+size[v],c[i],-};
}else{
int t=v;
for(int k=B;k>=;--k)
if(dep[anc[t][k]]>=dep[u]+)t=anc[t][k];
d[++m]=(dish){,pos[t]-,pos[v],c[i],};
d[++m]=(dish){,pos[t]-,pos[v]+size[v],c[i],-};
d[++m]=(dish){pos[v],pos[v]+size[v]-,pos[t]+size[t],c[i],};
d[++m]=(dish){pos[v],pos[v]+size[v]-,n+,c[i],-};
}
}
for(int i=;i<=q;++i){
int u=read(),v=read(),k=read();
if(pos[u]>pos[v])swap(u,v);
f[i]=(fruit){pos[u],pos[v],k,i};
}
sort(d+,d+m+,cmp1);
sort(f+,f+q+,cmp2);
sort(c+,c+p+);
int len=unique(c+,c+p+)-c-;
solve(,q,,m,,len);
for(int i=;i<=q;++i)printf("%d\n",ans[i]);
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ4009 & 洛谷3242 & LOJ2113:[HNOI2015]接水果——题解的更多相关文章

  1. 【BZOJ4009_洛谷3242】[HNOI2015] 接水果(整体二分)

    题目: 洛谷 3242 分析: 明确题意:在一棵树上给定若干权值为 \(w\) 的路径 \((u,v)\) (盘子),每次给定 \((a,b)\) (水果),询问所有满足 \((u,v)\) 被 \( ...

  2. 洛谷P1854 花店橱窗布置 分析+题解代码

    洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...

  3. HAOI2006 (洛谷P2341)受欢迎的牛 题解

    HAOI2006 (洛谷P2341)受欢迎的牛 题解 题目描述 友情链接原题 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之 ...

  4. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  5. 洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速$dp\&Floyd$)

    洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速\(dp\&Floyd\)) 标签:题解 阅读体验:https://zybuluo.com/Junl ...

  6. 【洛谷3239_BZOJ4008】[HNOI2015] 亚瑟王(期望 DP)

    题目: 洛谷 3239 分析: 卡牌造成的伤害是互相独立的,所以 \(ans=\sum f_i\cdot d_i\) ,其中 \(f_i\) 表示第 \(i\) 张牌 在整局游戏中 发动技能的概率.那 ...

  7. BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4946 https://www.luogu.org/problemnew/show/P3826 ht ...

  8. 洛谷 P1146 【硬币翻转】题解

    很久很久之前做过的一道题 翻n-1枚硬币,就是有一枚不翻,也可以理解为翻一枚 直接上程序,看程序说话 #include<iostream> using namespace std; ; b ...

  9. 洛谷P1972 [SDOI2009]HH的项链 题解

    [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...

随机推荐

  1. 2019年猪年海报PSD模板-第一部分

    14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/1i7bIzPRTX0OMbHFWnqURWQ                        

  2. hdu2544最短路(floyd基础)

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. OSG-视口&LOD&Imposter

    本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html 作者写的比较好,再次收藏,希望更多的人可以看到这个文章 互联网是是一个相 ...

  4. 适配chrome65最新selenium-chromedriver

    网盘地址:https://pan.baidu.com/s/1BmdwRgD96IL32-3FTFxPSg 密码: 2vg6

  5. 孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9并使用pydocx模块将结果写入word文档

    孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 到今天终于完成了对docx模块针对 ...

  6. (原) MaterialEditor部- UmateriaEditor中 Node编译过程和使用(3)

    @author: 白袍小道 转载说明原处 插件同步在GITHUB: DaoZhang_XDZ         说明 1.本篇是接着-----(原) MaterialEditor部- UmateriaE ...

  7. 第一个线性回归程序(基于Jupyter)

    import pandas as pdimport seaborn as snssns.set(context="notebook", style="whitegrid& ...

  8. LeetCode 145 ——二叉树的后序遍历

    1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 递归得到其左子树的数据向量 temp,将 temp 合并到 data 中去 递归得到 ...

  9. HADOOP (十一).安装hbase

    下载安装包并解压设置hbase环境变量配置hbase-site.xml启动hbase检测hbase启动情况测试hbase shell 下载安装包并解压 https://mirrors.tuna.tsi ...

  10. NFC学习总结二

    移动支付这事情热了总归还是会回归理性,就如同之前的10几年间的几次轮回一样.字面上看,移动支付比支付大也不大可能,有相同,有扩展,有交集有不通才是. NFC这事情也是说了快十年了,真心希望它能回归到其 ...