接水果(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)来说比较复杂,接下来我将讲一下创建的流程以及两者的不同. 代码来自<第一行 ...
随机推荐
- PHP siege 压测 QPS大小
1.使用 PHP-FPM SOCKET的形式通讯 2.配置 PHP-FPM配置 [root@bogon php-fpm.d]# ls -al 总用量 drwxr-xr-x. root root 8月 ...
- ethereum(以太坊)(一)
从这周开始,开始学习以太坊开发--solidity,开始决定往区块链方向发展,毕竟区块链技术应用广泛.一开始接触solidity开发语言不太习惯,毕竟一直在学习python语法,有很多都不能接受.有难 ...
- php扩展开发-MINFO
我们在用PHPinfo函数或命令行的php -i命令查看php环境相关的信息,当我们开发完成一个自己的扩展,除非这个扩展就是你自己所使用,否则你就需要对扩展进行相关的介绍,或者显示扩展用到的ini配置 ...
- JZOJ| 5910. DuLiu
Description LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃圾题目者也,教人半懂不懂的.因为他姓李,别人便从QQ群上的“毒瘤李F ...
- tomcat 无论如何都无法创建新的Servers
1.退出eclipse 2.到[工程目录下 workspace ]/.metadata/.plugins/org.eclipse.core.runtime 3.把org.eclipse.wst.ser ...
- C语言字符篇(二)字符串处理函数
字符串处理函数 1. 拷贝 strcpy 2. 追加 strcat #include <string.h> char *strcpy(char *dest, const char ...
- c++ function和bind
bind 定义在头文件 functional 里 template<typename _Func, typename... _BoundArgs> inline typename _Bin ...
- python Re库的介绍
re库的贪婪匹配和最小匹配 后面跟着?变为最小匹配
- python Beautiful Soup库入门
bs4库的HTML内容遍历方法 基于bs4库的HTML格式输出 显示:友好的显示 <tag>.prettify() 编码:bs4库将任何HTML输入都变成utf-8编码(python 3. ...
- 1079: [SCOI2008]着色方案
链接 思路 首先是dp,如果直接用每个种颜色的剩余个数做状态的话,复杂度为5^15. 由于c<=5,所以用剩余数量的颜色的种类数做状态:f[a][b][c][d][e][last]表示剩余数量为 ...