首先整体二分,问题变成是否存在经过一个点的满足条件的路径

那么我对于每个路径(a,b,lca),在树状数组的dfn[a]++,dfn[b]++,dfn[lca]--,dfn[fa[lca]--]

然后直接查那个点的子树和就行了

 #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=2e5+,maxm=4e5+; 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,M,eg[maxn*][],egh[maxn],ect;
int dfn[maxn][],tot,fa[maxn][],dep[maxn];
int tr[maxn],ans[maxm],que[maxm]; inline int lowbit(int x){return x&(-x);}
inline void add(int x,int y){
for(;x&&x<=N;x+=lowbit(x)) tr[x]+=y;
}
inline int query(int x){
int re=;for(;x;x-=lowbit(x)) re+=tr[x];return re;
} struct Node{
int d,a,b,v,lca;
Node(int x=,int y=,int z=,int l=,int k=){
d=x,a=y,b=z,v=l,lca=k;
}
inline void cover(int x){
add(dfn[a][],d*x);
add(dfn[b][],d*x);
add(dfn[lca][],-d*x);
add(dfn[fa[lca][]][],-d*x);
}
}op[maxm],tmp[maxm]; 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;
dep[b]=dep[x]+,fa[b][]=x;dfs(b);
}dfn[x][]=tot;
} inline int getlca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=log2(dep[x]-dep[y]);i>=&&dep[x]!=dep[y];i--){
if(dep[fa[x][i]]>=dep[y])
x=fa[x][i];
}
if(x==y) return x;
for(int i=log2(dep[x]);i>=;i--){
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
}return fa[x][];
} inline void solve(int l,int r,int vl,int vr){
if(l>r||vl>vr) return;
int a=l-,b=r+,mid=vl+vr>>;
int cnt=; for(int i=l;i<=r;i++){
if(op[i].d){
if(op[i].v>=mid) tmp[--b]=op[i],op[i].cover(),cnt+=op[i].d;
else tmp[++a]=op[i];
}else{
int re=query(dfn[op[i].a][])-query(dfn[op[i].a][]-);
if(cnt-re>=) tmp[--b]=op[i],ans[op[i].b]=mid;
else tmp[++a]=op[i];
}
} for(int i=l;i<=r;i++){
if(op[i].d&&op[i].v>=mid) op[i].cover(-);
} for(int i=l;i<=a;i++) op[i]=tmp[i];
for(int i=r;i>=b;i--) op[i]=tmp[r-i+b];
solve(l,a,vl,mid-);solve(b,r,mid+,vr);
} int main(){
// freopen("network4.in","r",stdin);
int i,j,k;
N=rd(),M=rd();
for(i=;i<N;i++){
int a=rd(),b=rd();
adeg(a,b);adeg(b,a);
}
dep[]=;dfs();
for(i=,j=;i<=M;i++){
int o=rd();
if(o==){
int a=rd(),b=rd(),c=rd();
op[i]=Node(,a,b,c,getlca(a,b));
}else if(o==){
int t=rd();
op[i]=Node(-,op[t].a,op[t].b,op[t].v,op[t].lca);
}else{
op[i]=Node(,rd(),i,,);
que[++j]=i;
}
}
CLR(ans,-);
solve(,M,,1e9);
for(i=;i<=j;i++){
printf("%d\n",ans[que[i]]);
}
return ;
}

luogu3250 网络 (整体二分+树上差分+树状数组)的更多相关文章

  1. P3250 [HNOI2016] 网络 (树剖+堆/整体二分+树上差分+树状数组)

    解法1: 本题有插入路径和删除路径,在每个节点维护插入堆和删除堆,查询时两者top一样则一直弹出.如果每个节点维护的是经过他的路径,显然有些不好处理,正难则反,每个点维护不经过他的路径,那么x节点出了 ...

  2. [BZOJ2738]矩阵乘法(整体二分+二维树状数组)

    整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...

  3. 【bzoj2738】矩阵乘法 整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...

  4. BZOJ2738矩阵乘法——整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入   第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...

  5. BZOJ3881 Coci2015Divljak(AC自动机+树上差分+树状数组)

    建出AC自动机及其fail树,每次给新加入的串在AC自动机上经过的点染色,问题即转化为子树颜色数.显然可以用dfs序转成序列问题树状数组套权值线段树解决,显然过不掉.事实上直接树上差分,按dfs序排序 ...

  6. BZOJ.2738.矩阵乘法(整体二分 二维树状数组)

    题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...

  7. BZOJ 2738 矩阵乘法(整体二分+二维树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2738 [题目大意] 给出一个方格图,询问要求求出矩阵内第k小的元素 [题解] 我们对答 ...

  8. 【清澄A1333】【整体二分+二维树状数组】矩阵乘法(梁盾)

    试题来源 2012中国国家集训队命题答辩 问题描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入格式 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共 ...

  9. [BZOJ2738]矩阵乘法 整体二分+二维树状数组

    2738: 矩阵乘法 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1643  Solved: 715[Submit][Status][Discuss ...

随机推荐

  1. semantic-ui 输入框

    1.标准输入框 semantic-ui中定义输入框需要将input标签包含于另外一个标签内,外层标签的class为ui input,注意外层标签可以是div,span.p.i. <div cla ...

  2. Win1064位下mysql插入百万行数据耗时问题

    performance - Inserting 1 Million records is taking too much time MYSQL - Stack Overflowhttps://stac ...

  3. AJAX返回值问题

    ajax同步方式获取返回值,必须以同步请求的的方式获取. //主函数部分 function confirm(id,...)//省略部分参数 { //...省略部分代码 //任务涉及专业 var Maj ...

  4. Setting property 'source' to 'org.eclipse.jst.jee.server:hczm' did not find a matching property

  5. Git发生SSL certificate problem: certificate ha错误的解决方法

    这两天,不知道为什么,用Git提交代码到服务器时,总出现SSL certificate problem: unable to get local issuer certificate while ac ...

  6. elasticsearch概念及倒排索引简单介绍

    一.概念 集群:一个或者多个节点组织在一起 节点:一个节点是集群中的一个服务器,由一个名字来标识,默认是一个随机的漫威角色名字. 分片:将索引划分为多份的能力,允许水平分割和扩展容量,多个分片相应请求 ...

  7. saltstack一

    Saltstack概述 Salt一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. salt底层采用动态的连接总线, 使其可以 ...

  8. peewee 事物 回滚

    peewee 事物 回滚 #!/usr/bin/env python # coding=utf-8 from peewee import * db = MySQLDatabase(host='123. ...

  9. wget 下载网页

    如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ wget --http-user=username --http-passwd=password http:/w ...

  10. css元素选择器

    css的元素选择器就是html的标签名: