接水果(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)来说比较复杂,接下来我将讲一下创建的流程以及两者的不同. 代码来自<第一行 ...
随机推荐
- Python学习之购物车
实现功能: 程序启动,提示用户输入用户名和密码,程序读取余额文件last_salary.txt内容(文件不存在则自动创建),若文件内容为空则提示“首次登录,请输入工资”: 用户可以输入商品编号进行购买 ...
- Centos7上搭建activemq集群和zookeeper集群
Zookeeper集群的搭建 1.环境准备 Zookeeper版本:3.4.10. 三台服务器: IP 端口 通信端口 10.233.17.6 2181 2888,3888 10.233.17.7 2 ...
- JZOJ 1738. Heatwave
Description 给你N个点的无向连通图,图中有M条边,第j条边的长度为: d_j. 现在有 K个询问. 每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少? I ...
- POJ:1064-Cable master
Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 58613 Accepted: 12231 Descri ...
- 集合源码分析之 HashSet
一 知识准备 HashSet 是Set接口的实现类,Set存在的最大意义区别于List就是,Set中存放的元素不能够重复,就是不能够有两个相同的元素存放在Set中,那么怎样的两个元素才算是相同的,这里 ...
- P2183 巧克力(二分答案)
P2183 巧克力 题目描述 佳佳邀请了M个同学到家里玩.为了招待客人,她需要将巧克力分给她的好朋友们.她有N(1<=N<=5000)块巧克力,但是大小各不一样,第i块巧克力大小为为1*X ...
- Jenkins拾遗--第一篇(安装Jenkins)
起因 近期由于工作需要做起了起了jenkins的维护.不做不知道,一搞发现里边全是小坑.两个月弄了一身泥.曾经小瞧了它,但是发现其实要弄好它不是那么容易的.有句知名的话"没有总结就没有提高. ...
- javascript将分,秒,毫秒转换为xx天xx小时xx秒(任何语言通用,最通俗易懂)
// 传入参数为总分钟数,如果为秒数,毫秒数,需要对 // 此处得到总秒数 注释部分的代码调整下. function toDateDMS(minutes){ // 将分钟转换为 天,时,分,秒 if( ...
- 程序员必需知道的Windows Shell命令
Windows系统本来就很人性化的操作系统,操作很方便,但是对于开发人员来说,有些时候改变一些电脑配置或者执行某些任务来说,使用GUI操作反而事倍功半,因此建议使用Shell命令来提高一下工作效率. ...
- An internal error occurred during: "Launching on Tomcat 7.x"
1.首先关闭MyEclipse工作空间.2.然后删除工作空间下的文件.“MyEclipse10\workspace.metadata.plugins\org.eclipse.core.runtime. ...