当前位置: 首页 > 编程日记 > 正文

BZOJ 4009 接水果

Description

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

Input

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

Output

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

Sample Input

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

Sample Output

442139372
333042360
442139372
283254485
283254485
217394434
217394434
217394434
217394434
217394434

Hint

\(N,P,Q \le 40000\)

整体二分。对于区间\(l \sim r\),二分值域\(mid\),将\(\le mid\)的盘子加入,每个水果的\(k\)与其路径上存在的盘子数进行比较,若多了该询问往左区间\(l \sim mid\)递归,否则往右区间\(mid+1 \sim r\)递归。
现在的问题就是如何判定每个水果的\(k\)与其路径上存在的盘子数的大小关系。考虑每个盘子,覆盖的路径为\(a_{i}\)\(b_{i}\)\(dep_{a_{i}} < dep_{b_{i}}\)),那么这个盘子所贡献的水果只有可能两种情况:
\(1.b_{i}\)\(a_{i}\)的子树内,那么水果的两个端点\(u,v\)必须一个\(b_{i}\)的子树内,一个在\(a_{i}\)的子树外(可以包括\(a_{i}\))。
\(2.\)否则,两个点必须一个在\(a_{i}\)的子树内,一个在\(b_{i}\)的子树内。
看到有子树的东西,马上想到dfs序。由于这个dfs序是一段连续的区间,所以我们可以将盘子根据dfs序抽象成为矩形(情况一上两个不相交的矩形,情况二是一个矩形),将水果抽象成为一个点,每次检验即询问点被多少矩形所覆盖。扫描线+树状数组即可解决。
注意:矩形必须保证\(x\)坐标小于\(y\)坐标。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
using namespace std;#define maxn (40010)
int N,P,Q,side[maxn],next[maxn*2],toit[maxn*2],dep[maxn],tree[maxn];
int L[maxn],R[maxn],ans[maxn],f[maxn][20],Ts,cnt,tot,have[maxn],sum[maxn];
struct SCAN
{int X,Y1,Y2,sign,be;friend inline bool operator <(const SCAN &a,const SCAN &b) { return a.X != b.X?a.X < b.X:a.sign<b.sign; }
}bac[8*maxn],save[maxn][4];inline int jump(int a,int step)
{for (int i = 0;step;step >>= 1,++i) if (step&1) a = f[a][i];return a;
}inline int lowbit(int a) { return a&-a; }
inline void modify(int a,int b) { for (;a <= N;a += lowbit(a)) tree[a] += b; }
inline int calc(int a) { int ret = 0; for (;a;a -= lowbit(a)) ret += tree[a]; return ret; }struct NODE
{int a,b,c,id;friend inline bool operator <(const NODE &x,const NODE &y) { return x.c < y.c; }inline void read(int i) { scanf("%d %d %d",&a,&b,&c); id = i; }inline void update() { if (L[a] > L[b]) swap(a,b); }inline void ins1() { bac[++tot] = (SCAN){L[a],L[b],L[b],0,id}; }inline void ins2() { for (int i = 0;i < have[id];++i) bac[++tot] = save[id][i]; }inline void change(){if (L[b] >= L[a]&&L[b] <= R[a]){int son = jump(b,dep[b]-dep[a]-1);if (L[son] > 1){save[id][have[id]++] = (SCAN){1,L[b],R[b],-1,id};save[id][have[id]++] = (SCAN){L[son]-1,L[b],R[b],1,id};}if (R[son] < N){save[id][have[id]++] = (SCAN){L[b],R[son]+1,N,-1,id};save[id][have[id]++] = (SCAN){R[b],R[son]+1,N,1,id};}}else{save[id][have[id]++] = (SCAN){L[a],L[b],R[b],-1,id};save[id][have[id]++] = (SCAN){R[a],L[b],R[b],1,id};}}
}path[maxn],query[maxn],tmp[maxn];inline void add(int a,int b) { next[++cnt] = side[a]; side[a] = cnt; toit[cnt] = b; }
inline void ins(int a,int b) { add(a,b); add(b,a); }inline void dfs(int now)
{L[now] = ++Ts;for (int i = 1;(1 << i) <= dep[now];++i) f[now][i] = f[f[now][i-1]][i-1];for (int i = side[now];i;i = next[i])if (toit[i] != f[now][0])f[toit[i]][0] = now,dep[toit[i]] = dep[now]+1,dfs(toit[i]);R[now] = Ts;
}inline void census(int ql,int qr,int pl,int pr,int &ll,int &rr)
{tot = 0;for (int i = pl;i <= pr;++i) path[i].ins2();for (int i = ql;i <= qr;++i) query[i].ins1();sort(bac+1,bac+tot+1);for (int i = 1;i <= tot;++i){if (!bac[i].sign) sum[bac[i].be] = calc(bac[i].Y1);else modify(bac[i].Y1,-bac[i].sign),modify(bac[i].Y2+1,bac[i].sign);}for (int i = ql;i <= qr;++i){if (sum[query[i].id] >= query[i].c) tmp[++ll] = query[i];else query[i].c -= sum[query[i].id],tmp[--rr] = query[i];sum[query[i].id] = 0;}for (int i = ql;i <= qr;++i) query[i] = tmp[i];for (int i = 1;i <= tot;++i)if (bac[i].sign) modify(bac[i].Y1,bac[i].sign),modify(bac[i].Y2+1,-bac[i].sign);
}inline void work(int ql,int qr,int pl,int pr)
{if (ql > qr) return;if (pl == pr){for (int i = ql;i <= qr;++i) ans[query[i].id] = path[pl].c;return;}int ll = ql-1,rr = qr+1,mid = (pl + pr)>>1;census(ql,qr,pl,mid,ll,rr);work(ql,ll,pl,mid); work(rr,qr,mid+1,pr);
}int main()
{freopen("fruit.in","r",stdin);freopen("fruit.out","w",stdout);scanf("%d %d %d",&N,&P,&Q);for (int i = 1,a,b;i < N;++i) scanf("%d %d",&a,&b),ins(a,b);dfs(1);for (int i = 1;i <= P;++i) path[i].read(i),path[i].update(),path[i].change();sort(path+1,path+P+1);for (int i = 1;i <= Q;++i) query[i].read(i),query[i].update();work(1,Q,1,P);for (int i = 1;i <= Q;++i) printf("%d\n",ans[i]);fclose(stdin); fclose(stdout);return 0;
}

转载于:https://www.cnblogs.com/mmlz/p/4448719.html

相关文章:

GitBook本地的安装与查看

1.安装nodejs 2.cnpm install -g gitbook-cli 查看版本&#xff1a;gitbook -V 3.gitbook init 注意npm加了代理&#xff0c;查看npm代理配置&#xff0c;将其注释即可 执行完后&#xff0c;你会看到多了两个文件 —— README.md 和 SUMMARY.md&#xff0c;它们的作用如下&…

用C++的random_shuffle()函数打乱int数组顺序

程序背景&#xff1a; 开组会&#xff0c;汇报人已确定&#xff0c;出一个随机的汇报顺序。 #include<bits/stdc.h> using namespace std;const int NUM 12;//汇报人数 int main() {string names[] {"SpongeBob","Patrick","Squidward"…

ios 绘制不规则 图形

最近才知道有一个软件 paintcode 它可以根据画出的图形自动的生成对应的 OC 代码 不用UI切图 我们也可以用代码实现自己想要的图形效果 使用教程可以百度&#xff1a;paintcode教程 http://blog.csdn.net/lujunelong/article/details/18899925 下载地址&#xff1a;http://www…

[转]Windows与VC命名规则

转自&#xff1a;http://hi.baidu.com/11158512/blog/item/0fbd5535cbfb5d1c91ef3970.html 匈牙利命名法是一种编程时的命名规范。基本原则是&#xff1a;变量名&#xff1d;属性&#xff0b;类型&#xff0b;对象描述。其中每一对象的名称都要求有明确含义&#xff0c;可以取对…

恢复误删的进程在使用的文件【转】

转自&#xff1a;https://www.cnblogs.com/276815076/p/5473185.html 原理&#xff1a;在Linux系统的/proc 分区下保存着进程的目录和名字&#xff0c;包含fd(文件描述符)和其下的子目录&#xff08;进程打开文件的链接&#xff09;&#xff0c;那么如果删除了一个文件&#xf…

编解码器架构中的桥(bridge)指什么

https://opennmt.net/OpenNMT-py/examples/Summarization.html?highlightbridge​​​​​​对于bridge做出如下解释 bridge: This is an additional layer that uses the final hidden state of the encoder as input and computes an initial hidden state for the decoder.…

控件包含代码块,因此无法修改控件集合

文章转载至: http://www.olnote.com/itlife/note/100000003.aspx控件包含代码块(即<% ... %>)&#xff0c;因此无法修改控件集合。 说明: 执行当前 Web 请求期间&#xff0c;出现未处理的异常。请检查堆栈跟踪信息&#xff0c;以了解有关该错误以及代码中导致错误的出处…

驰骋工作流引擎JFlow与activiti的对比之4种包含多实例的模式

为什么80%的码农都做不了架构师&#xff1f;>>> 4种包含多实例的模式 无同步的多实例&#xff08;MIwithout&#xff09;在流程中&#xff0c;一个活动可以激活多个实例&#xff0c;每个实例相互独立&#xff0c;并不需要在后面进行同步。 例子&#xff1a;比如用户…

Embarcadero Dev C++ 中文输出乱码

解决方式&#xff1a;保证编译器和文件的编码方式一样。 1. 编译器的编码方式 Embarcadero Dev C 界面 2. cpp文件编码方式 Notepad界面

关于登录记住密码使用cookie的详解

下面是我看的一篇文章引用过来&#xff0c;很易懂 设置cookie每个cookie都是一个名/值对&#xff0c;可以把下面这样一个字符串赋值给document.cookie&#xff1a;document.cookie"userId828";如果要一次存储多个名/值对&#xff0c;可以使用分号加空格&#xff08;;…

Linux服务器---安装tftp-server

安装tftp-server1、安装tftp-server[rootlocalhost weijie]# yum install -y tftp-serverLoaded plugins: fastestmirror, refresh-packagekit, securityRunning TransactionInstalling : tftp-server-0.49-8.el6.i686 1/1 Verifying : tftp…

linux指令 2>1 到底是个啥

训练好深度学习模型之后对其进行测试&#xff0c;测试的脚本如上图。 我对第11行感到不解&#xff0c;经过检索Linux重定向和文件描述符相关知识后&#xff0c;明白了 2代表着标准错误 1代表者标准输出(默认是屏幕) >代表流向 那么第11行代码的含义也就是&#xff0c;将…

新生 语不惊人死不休 —— 《无限恐怖》读后有感

开篇声明&#xff0c;我博客中“小心情”这一系列&#xff0c;全都是日记啊随笔啊什么乱七八糟的。如果一不小心点进来了&#xff0c;不妨直接关掉。我自己曾经写过一段时间的日记&#xff0c;常常翻看&#xff0c;毫无疑问我的文笔是很差的&#xff0c;而且心情也是瞬息万变的…

中国大学MOOC-C程序设计(浙大翁恺)—— 时间换算

时间换算&#xff08;10分&#xff09;题目内容&#xff1a;UTC是世界协调时&#xff0c;BJT是北京时间&#xff0c;UTC时间相当于BJT减去8。现在&#xff0c;你的程序要读入一个整数&#xff0c;表示BJT的时和分。整数的个位和十位表示分&#xff0c;百位和千位表示小时。如果…

作为一个程序员,数学对你到底有多重要(转)

每个计算机系毕业的人&#xff0c;大都学过不少数学课&#xff0c;而且不少学校的计算机系的数学课&#xff0c;通常比一般的其他工科专业的数学要难一些&#xff0c;比如不上高等数学&#xff0c;而是学数学分析&#xff0c;不上线性代数而去上高等代数。但是&#xff0c;大部…

如何在vsc上选择远程miniconda特定的虚拟环境中的Python解释器(4步)

前提&#xff1a; 已经通过remote development插件连上了远程服务器 远程服务器上已经创建了安装了python的虚拟环境 步骤&#xff1a; 点击“查看” 点击“命令面板” 输入/选择 Python:Select Interpreter 然后就能选择远程miniconda中已经创建的虚拟环境了 我的minico…

Java数据类型简单认识

Java是一种强类型编程语言&#xff0c;因而在声明变量的时候必须声明数据类型&#xff0c;java语言有基本数据类型和引用数据类型这两大数据类型&#xff0c;基本数据类型有8种分别是4种整型、2种浮点类型、1种用于Unicode表示字符单元的字符类型和1种表示真值的布尔类型;引用数…

Intel 6系列芯片组设计缺陷 全球出货暂停

美国当地时间周一&#xff0c;Intel公司官方宣布&#xff0c;今年1月初刚刚伴随Sandy Bridge系列“第二代Core架构处理器”推出的6系列芯片组&#xff08;代号Cougar Point&#xff09;发现了设计方面的问题。虽然目前Intel已经对该设计在芯片级别进行了修正&#xff0c;但在新…

PrestaShop 网站漏洞修复如何修复

2019独角兽企业重金招聘Python工程师标准>>> PrestaShop网站的漏洞越来越多&#xff0c;该网站系统是很多外贸网站在使用的一个开源系统&#xff0c;从之前的1.0初始版本到现在的1.7版本&#xff0c;经历了多次的升级&#xff0c;系统使用的人也越来越多&#xff0c…

shell脚本中的case语句使用要点

1.双分号(;;) 用于case语句中一个分支的结束。 可类比C里面switch...case语句&#xff0c;在case语句之后&#xff0c;若所有语句都输完&#xff0c;后面跟着的"break;"。 2.星号加右小括号*) 可类比C里面switch...case语句中的"default:"。 3.结束符…

Netty - ByteBuf

2019独角兽企业重金招聘Python工程师标准>>> 1.ByteBuf类 - Netty的数据容器 ByteBuf维护了两个不同的索引&#xff1a; readerIndex&#xff1a;用于读取writerIndex&#xff1a;用于写入起始位置都从0开始&#xff1a; 名称以read或者write开头的方法会更新ByteBu…

不要做浮躁的嵌入式系统工程师

每天读一遍&#xff0c;思考一下&#xff1a;我是否浮躁&#xff1f; 1、不要看到别人的回复&#xff0c;第一句话就说&#xff1a;给个代码吧&#xff01;你应该想想为什么。当你自己想出来再参考别人的提示&#xff0c;就会知道自己和别人思路的差异。 2、初学者请不要看…

Codeforces Round #300 A. Cutting Banner 水题

A. Cutting Banner Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/538/problem/ADescription A large banner with word CODEFORCES was ordered for the 1000-th onsite round of Codeforcesω that takes place on the Miami beach. Unfo…

ImportError:cannot import name ‘display‘ File “XX“, line 5, in <module> from IPython import display

导入错误问题的一个解决思路是&#xff0c;推断这是模块间版本不兼容带来的问题&#xff0c;先把模块卸载掉&#xff0c;再用conda install安装上。也就是让conda去协调模块间兼容性。

[高级]android应用开发之intent的妙用二

相信做android应用开发的朋友对intent组件都已经是相当熟悉了&#xff0c;这里鄙人总结一下intent的妙用&#xff0c;希望对大家有帮助。 intent妙用之列出所有已安装的应用程序列表 装载&#xff1a;http://blog.csdn.net/android_tutor/article/details/5724634 这篇文章写的…

windows 自动化目录大纲(各企业架构不一样,按需选择)

有需要做自动化的联系979122932,一起交流学习转载于:https://blog.51cto.com/7763608/2338668

Java设计模式之虚拟代理模式

描述&#xff1a;虚拟代理模式(Virtual Proxy)是一种节省内存的技术&#xff0c;它建议创建那些占用大量内存或处理复杂的对象时&#xff0c;把创建这类对象推迟到使用它的时候。在特定的应用中&#xff0c;不同部分的功能由不同的对象组成&#xff0c;应用启动的时候&#xff…

(已解决)ImportError attempted relative import with no known parent package

想要调用同一目录下的另一个py文件中的类&#xff0c;以下或许是可行的解决方案。 需要做到两点 1. 将主调文件的名称改为__init__.py 2. from 被调文件的文件名称(删去末尾.py) import 类名 不要在被调文件的文件名称前面加点&#xff01; 我的目录结构 我的调用方式 fro…

小红点功能控件

写在前面 本意是想把做过的东西沉淀一下&#xff0c;防止重复造轮子。后来想想自己在实现这个的过程中还是走了一点弯路的。虽然网上找的轮子很多&#xff0c;其实大多都华而不实或者功能太多&#xff0c;工作中实现的东西最重要的不是功能炫&#xff0c;而是稳定&#xff0c;一…

根据条件查找数组中的一条数据并放入缓存

protected MemberInfo GetCacheMemberInfo(string userName) { MemberInfo minfo new MemberInfo();//实体 minfo System.Web.HttpRuntime.Cache.Get("HotPP_" userName) as MemberInfo;//读缓存 if (minfo null) { M…