接水果(fruit)
接水果(fruit)
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#define maxn 320005
using namespace std;
int n,P,Q,head[maxn],tot,sc,dft[maxn],dfn[maxn];
int deep[maxn],f[maxn][],top,Max,q[maxn],ans[maxn];
int tr[maxn],tx[maxn],tp,cnt,dy[maxn];
map<int,int>ls;
struct node{
int v,nex;
}e[maxn*];
struct sq{
int fl,pl,a,b,v,val;
}a[maxn],b[maxn];
void lj(int t1,int t2){
e[++tot].v=t2;e[tot].nex=head[t1];head[t1]=tot;
}
void dfs(int k,int fa){
dft[k]=++sc;deep[k]=deep[fa]+;f[k][]=fa;
for(int i=head[k];i;i=e[i].nex){
if(e[i].v!=fa)dfs(e[i].v,k);
}
dfn[k]=sc;
}
int Lca(int u,int v){
if(deep[u]<deep[v])swap(u,v);
for(int x=;x>=;x--)if(deep[f[u][x]]>=deep[v])u=f[u][x];
for(int x=;x>=;x--)if(f[u][x]!=f[u][x])u=f[u][x],v=f[v][x];
return u==v?u:f[u][];
}
bool cmp(sq a,sq b){
return a.pl<b.pl||(a.pl==b.pl&&a.fl<b.fl);
}
void add(int i,int v){
for(;i<=n;i+=i&-i)tr[i]+=v;
}
int ask(int i){
int sum=;
for(;i;i-=i&-i)sum+=tr[i];
return sum;
}
void add(int xa,int xb,int ya,int yb,int w){
if(xa>xb||ya>yb||ya<||xa<)return;
a[++top]=(sq){,xa,ya,yb,w,};
a[++top]=(sq){,xb+,ya,yb,w,-};
}
void lsh(){
sort(tx+,tx+tp+);
cnt=;
for(int i=;i<=tp;i++)
if(!ls[tx[i]])ls[tx[i]]=++cnt,dy[cnt]=tx[i];
}
void solve(int l,int r,int ql,int qr){
if(ql>qr)return;
if(l==r){
for(int i=ql;i<=qr;i++){
if(a[i].fl>)ans[a[i].fl]=l;
}
return;
}
int mid=l+r>>;
for(int i=ql;i<=qr;i++){
if(a[i].fl>){
q[i]=ask(a[i].a);
}
else {
if(a[i].v<=mid){
add(a[i].a,a[i].val);add(a[i].b+,-a[i].val);
}
}
}
for(int i=ql;i<=qr;i++){
if(a[i].fl==){
if(a[i].v<=mid){
add(a[i].a,-a[i].val);add(a[i].b+,a[i].val);
}
}
}
int t=ql-;
for(int i=ql;i<=qr;i++){
if(a[i].fl>){
if(q[i]>=a[i].v)b[++t]=a[i];
}
else {
if(a[i].v<=mid)b[++t]=a[i];
}
}
int ff=t;
for(int i=ql;i<=qr;i++){
if(a[i].fl>){
if(q[i]<a[i].v){
a[i].v-=q[i];
b[++t]=a[i];
}
}
else {
if(a[i].v>mid)b[++t]=a[i];
}
}
for(int i=ql;i<=qr;i++)a[i]=b[i];
solve(l,mid,ql,ff);solve(mid+,r,ff+,qr);
}
int main()
{
cin>>n>>P>>Q;
for(int i=,t1,t2;i<n;i++){
scanf("%d%d",&t1,&t2);
lj(t1,t2);lj(t2,t1);
}
dfs(,);
for(int j=;j<=;j++)
for(int i=;i<=n;i++)f[i][j]=f[f[i][j-]][j-];
for(int i=,u,v,w;i<=P;i++){
scanf("%d%d%d",&u,&v,&w);
tx[++tp]=w;
if(deep[u]<deep[v])swap(u,v);
int lca=Lca(u,v);
if(lca==v){
int dep=deep[u]-deep[v]-;
int t=u;
for(int x=;x>=;x--){
if((<<x)<=dep){
t=f[t][x];dep-=(<<x);
}
}
add(dft[u],dfn[u],,dft[t]-,w);
add(,dft[t]-,dft[u],dfn[u],w); add(dft[u],dfn[u],dfn[t]+,n,w);
add(dfn[t]+,dft[u],dfn[u],n,w);
}
else {
add(dft[u],dfn[u],dft[v],dfn[v],w);
add(dft[v],dfn[v],dft[u],dfn[u],w);
}
}
lsh();
for(int i=,t1,t2,t3;i<=Q;i++){
scanf("%d%d%d",&t1,&t2,&t3);
a[++top].fl=i;
a[top].pl=dft[t2];a[top].a=dft[t1];a[top].v=t3;
}
sort(a+,a+top+,cmp);
for(int i=;i<=top;i++){
if(!a[i].fl)a[i].v=ls[a[i].v];
}
solve(,cnt,,top);
for(int i=;i<=Q;i++){
printf("%d\n",dy[ans[i]]);
}
return ;
}
接水果(fruit)的更多相关文章
- 接水果(fruit)——整体二分+扫描线
题目 [题目描述] 风见幽香非常喜欢玩一个叫做 osu! 的游戏,其中她最喜欢玩的模式就是接水果.由于她已经 DT FC 了 The big black,她觉得这个游戏太简单了,于是发明了一个更加难的 ...
- JavaEE基础(二十七)/反射、JDK新特性
1.反射(类的加载概述和加载时机) A:类的加载概述 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载 就是指将class文件读入 ...
- 并发队列之:BlockingQueue和ConcurrentLinkedQueue
一.并行和并发区别: 并行:是指两者同时执行一件事.比如赛跑,两个人都在不停的往前跑: 并发:是指资源有限的情况下,两者交替轮流使用资源.比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给 ...
- python 语句:条件、循环、break、continue...
1. 条件语句 执行条件:判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范围. [Python程序语言指定任何非0和非空(null)值为true,0 或 ...
- Python基本语法--语句
# -*- coding: utf-8 -*- #条件语句 ''' if 判断条件: 执行语句…… else: 执行语句…… ''' flag = False name = 'python' if n ...
- JavaScript对象创建的几种方式
1 工厂模式 1.1 创建 function createFruit(name,colors) { var o = new Object(); o.name = name; o.colors = co ...
- 【Java入门提高篇】Day15 Java泛型再探——泛型通配符及上下边界
上篇文章中介绍了泛型是什么,为什么要使用泛型以及如何使用泛型,相信大家对泛型有了一个基本的了解,本篇将继续讲解泛型的使用,让你对泛型有一个更好的掌握和更深入的认识. 上篇中介绍完泛型之后,是不是觉得泛 ...
- 循环结构for
教程:高能:语句结构都是由关键字开头,用冒号结束! 一:语句结构 for <variable> in <sequence>: <statements>else ...
- [安卓]ListView 与 RecyclerView的比较
ListView与RecyclerView在在app应用非常广泛,相对于其他的view(button textview)来说比较复杂,接下来我将讲一下创建的流程以及两者的不同. 代码来自<第一行 ...
随机推荐
- Windows平台下源码分析工具
最近这段时间在阅读 RTKLIB的源代码,目前是将 pntpos.c文件的部分看完了,准备写一份文档记录下这些代码的用处.处理过程.理论公式来源.注意事项,自己还没有弄明白的地方.目前的想法是把每一个 ...
- PHP 输出控制
一.前言 说到PHP输出控制, 在很多框架里面,比如说TP,Yii和Laraval的模版引擎里面都有输出控制函数的阴影,输出控制也叫输出缓冲,说到它的作用有以下几点. 二.内容 1. 输出模版 $va ...
- python之微信好友统计信息
需要安装库:wxpy 代码如下: from wxpy import Bot,Tuling,embed,ensure_one bot = Bot(cache_path=True) #获取好友信息 bot ...
- 学习Pytbon第十天 函数2 内置方法和匿名函数
print( all([1,-5,3]) )#如果可迭代对象里所有元素都为真则返回真.0不为真print( any([1,2]) )#如果数据里面任意一个数据为真返回则为真a= ascii([1,2, ...
- 一、MySQL数据库之简介和安装
一.基础部分 1.数据库是简介 之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序 ...
- WPF图片预览之移动、旋转、缩放
原文:WPF图片预览之移动.旋转.缩放 RT,这个功能比较常见,但凡涉及到图片预览的都跑不了,在说自己的实现方式前,介绍一个好用的控件:Extended.Toolkit中的Zoombox,感兴趣的同学 ...
- 6 URL 实习文章链接跳转
需要解决的三个问题? . 1.不够多的URL (1)正则表达式 (2)\d 数字 /detail/123 /detail/(\d){3} #限定3个数字 /detail/(\d+) #限定多个数字 ( ...
- VS Extension+NVelocity系列(二)——让VS支持 NVelocity的智能提示(上)
一.基础概念 应该庆幸的是,VS的插件是靠着MEF实现而不是MAF,这让你所做的工作减轻了许多.如果在这之前,您已经了解了MEF的原理,我想对于VS插件的编写,您应该是很容易就能理解的.看看几个VS2 ...
- CSS3 3D圆形设计教程
http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201502061338.html
- javascript 数组的常用方法总结
前言 主要讨论一下数组的方法, 1.splice和slice的区别 2.pop和push 3.shift和unshift 4.join 5.forEach(es ...