考虑整体二分,问题就变成了每个(水果)路径有多少个满足条件(权值)的(盘子)子路径

考虑一个盘子(a,b)表示两端点(不妨设dfn[a]<dfn[b]),那么他能接到的水果(u,v)一定满足(不妨设dfn[u]<dfn[v]):

1.如果a是b的祖先,则u在(a的在(b,a)链上的孩子)这个子树外,v在b子树内

2.否则,u在a的子树内,v在b的子树内

那么把一个水果(a,b)看成是一个二维点(dfn[a],dfn[b]),对于每个盘子,就是做一个二维区间+1

差分以后变成一个二维数点问题,可以先按x排序,y用树状数组来解决

复杂度$O(nlog^2n)$

然而我写的常数过大哪都卡不过去

 #include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
#define MP make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pa;
const int maxn=4e4+,maxp=1e7+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N,P,Q;
int eg[maxn*][],egh[maxn],ect;
int dfn[maxn][],tot;
int rt[maxn],fa[maxn][],dep[maxn];
int tr[maxn]; inline int lowbit(int x){return x&(-x);} inline void add(int x,int d){
for(;x&&x<=N;x+=lowbit(x)) tr[x]+=d;
}
inline int query(int x){
int re=;
for(;x;x-=lowbit(x)) re+=tr[x];
return re;
} inline void adeg(int a,int b){
eg[++ect][]=b,eg[ect][]=egh[a],egh[a]=ect;
} inline void dfs(int x){
for(int i=;fa[x][i]&&fa[fa[x][i]][i];i++){
fa[x][i+]=fa[fa[x][i]][i];
}
dfn[x][]=++tot;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa[x][]) continue;
fa[b][]=x,dep[b]=dep[x]+;
dfs(b);
}dfn[x][]=tot;
} inline int jump(int x,int d){
for(int i=;d;i++,d>>=){
if(d&) x=fa[x][i];
}return x;
} int ans[maxn],nct;
pa val[maxn];
struct Node{
int a,b,d,v,i;
}op[maxn*],tmp[maxn*]; inline void addnode(int x1,int x2,int y1,int y2,int v,int i){
op[++nct]=(Node){x1,y1,,v,i};
if(x2<N&&y2<N) op[++nct]=(Node){x2+,y2+,,v,i};
if(x2<N) op[++nct]=(Node){x2+,y1,-,v,i};
if(y2<N) op[++nct]=(Node){x1,y2+,-,v,i};
} inline void cover(int a,int b,int v,int i){
if(dfn[a][]>dfn[b][]) swap(a,b);
if(dfn[a][]>=dfn[b][]){
int x=jump(b,dep[b]-dep[a]-);
addnode(,dfn[x][]-,dfn[b][],dfn[b][],v,i);
addnode(dfn[b][],dfn[b][],dfn[x][]+,N,v,i);
}else{
addnode(dfn[a][],dfn[a][],dfn[b][],dfn[b][],v,i);
}
} inline void solve(int l,int r,int ql,int qr){
if(l>r||ql>qr) return;
int m=ql+qr>>;
// printf("~%d %d %d %d %d\n",l,r,ql,qr,val[m]);
int p=l-,q=r+;
for(int i=l;i<=r;i++){
if(op[i].d){
if(MP(op[i].v,op[i].i)<=val[m]){
add(op[i].b,op[i].d);
tmp[++p]=op[i];
}else tmp[--q]=op[i];
}else{
int n=query(op[i].b);
if(n>=op[i].v){
ans[op[i].i]=val[m].first;
tmp[++p]=op[i];
}else if(n<op[i].v){
op[i].v-=n;
tmp[--q]=op[i];
}
} }
for(int i=l;i<=r;i++){
if(op[i].d){
if(MP(op[i].v,op[i].i)<=val[m]){
add(op[i].b,-op[i].d);
}
}
}
for(int i=l;i<=p;i++) op[i]=tmp[i];
for(int i=q;i<=r;i++) op[r-i+q]=tmp[i];
solve(l,p,ql,m-),solve(q,r,m+,qr);
} inline bool cmp(Node a,Node b){return a.a==b.a?a.d!=:a.a<b.a;} int main(){
// freopen("fruit1.in","r",stdin);
// freopen("aa.out","w",stdout);
int i,j,k;
N=rd(),P=rd(),Q=rd();
for(i=;i<N;i++){
int a=rd(),b=rd();
adeg(a,b);adeg(b,a);
}
dep[]=;dfs();
for(i=;i<=P;i++){
int a=rd(),b=rd(),c=rd();
val[i]=MP(c,i);
cover(a,b,c,i);
}sort(val+,val+P+);
for(i=;i<=Q;i++){
int a=rd(),b=rd(),c=rd();
if(dfn[a][]>dfn[b][]) swap(a,b);
op[++nct]=(Node){dfn[a][],dfn[b][],,c,i};
}
sort(op+,op+nct+,cmp);
solve(,nct,,P);
for(i=;i<=Q;i++) printf("%d\n",ans[i]);
return ;
}

luogu3242 接水果 (整体二分+树状数组)的更多相关文章

  1. 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组

    题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...

  2. 【BZOJ-2527】Meteors 整体二分 + 树状数组

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Stat ...

  3. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  4. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

  5. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

  6. 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组

    题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...

  7. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  8. 【ZOJ2112】【整体二分+树状数组】带修改区间第k大

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

  9. BZOJ2527[Poi2011]Meteors——整体二分+树状数组

    题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...

随机推荐

  1. 【学习总结】【Java】Git学习-上传本地已有代码到GitHub

    < Git学成归来后的第一次实战 > 上传本地已有代码到GitHub 以之前学了一小半的Java基础教程代码为例 <深坑预警:在GitHub新建仓库那一步,不要勾选readme,不然 ...

  2. Druid Monitor开启登录界面

    <!-- druid --> <filter> <filter-name>druidWebStatFilter</filter-name> <fi ...

  3. [转帖]linux下的CPU、内存、IO、网络的压力测试

    linux下的CPU.内存.IO.网络的压力测试 https://www.cnblogs.com/zhuochong/p/10185881.html 一.对CPU进行简单测试: 1.通过bc命令计算特 ...

  4. Oracle 条件判断函数decode和case when then案例

    --decode条件判断函数 ,,,,,) from dual --需求:不通过连表查询,显示业主类型名称列的值 ,,,'商业','其他') from t_owners --case when the ...

  5. UTF-8编码与GBK编码下的字符长度

    源码: package lsh.java.charset; import java.nio.charset.Charset; public class LengthOfUTF_8 { public s ...

  6. 如何在MAC上运行exe程序

    1. 首先下载并运行CrossOver 运行CrossOver需要收费,试用期为14天,运行CrossOver 2. 选择exe应用程序,新建容器,安装exe程序 3.安装成功后,运行exe应用程序启 ...

  7. vs code的快捷方式

    https://blog.csdn.net/qq_41308027/article/details/83178526

  8. LODOP打印控件进行批量打印

    Lodop打印控件批量打印的方式:1.批量打印每页内容相同的:(1)批量打印相同内容的很多纸张,可以设置打印份数,把该内容打印出多份.2.批量打印每页不同内容的:(1)通过在一个任务中分页,循环添加页 ...

  9. ES 6 系列 - Module 的语法

    es 6 大幅度优化了模块化编程的规范. 写在前面:在 es6 之前,说起 js 的模块化,一般都避不开 CommonJs 和 AMD 两种方案.这两种方案,前者应用于服务器,后者应用于浏览器.而 e ...

  10. js函数使用prototype和不适用prototype的区别

    js中类定义函数时用prototype与不用的区别 原创 2017年06月05日 12:25:41 标签: 函数 / prototype / class   首先来看一个实例: function Li ...