luogu3250 网络 (整体二分+树上差分+树状数组)
首先整体二分,问题变成是否存在经过一个点的满足条件的路径
那么我对于每个路径(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 网络 (整体二分+树上差分+树状数组)的更多相关文章
- P3250 [HNOI2016] 网络 (树剖+堆/整体二分+树上差分+树状数组)
解法1: 本题有插入路径和删除路径,在每个节点维护插入堆和删除堆,查询时两者top一样则一直弹出.如果每个节点维护的是经过他的路径,显然有些不好处理,正难则反,每个点维护不经过他的路径,那么x节点出了 ...
- [BZOJ2738]矩阵乘法(整体二分+二维树状数组)
整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...
- 【bzoj2738】矩阵乘法 整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...
- BZOJ2738矩阵乘法——整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...
- BZOJ3881 Coci2015Divljak(AC自动机+树上差分+树状数组)
建出AC自动机及其fail树,每次给新加入的串在AC自动机上经过的点染色,问题即转化为子树颜色数.显然可以用dfs序转成序列问题树状数组套权值线段树解决,显然过不掉.事实上直接树上差分,按dfs序排序 ...
- BZOJ.2738.矩阵乘法(整体二分 二维树状数组)
题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...
- BZOJ 2738 矩阵乘法(整体二分+二维树状数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2738 [题目大意] 给出一个方格图,询问要求求出矩阵内第k小的元素 [题解] 我们对答 ...
- 【清澄A1333】【整体二分+二维树状数组】矩阵乘法(梁盾)
试题来源 2012中国国家集训队命题答辩 问题描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入格式 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共 ...
- [BZOJ2738]矩阵乘法 整体二分+二维树状数组
2738: 矩阵乘法 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1643 Solved: 715[Submit][Status][Discuss ...
随机推荐
- 解决scrapy报错:ModuleNotFoundError: No module named 'win32api'
ModuleNotFoundError: No module named 'win32api' 表示win32api未安装 解决办法: 下载对应python版本的win32api,并安装. 下载地址: ...
- node-sass下载失败 关于webpack
安装node-sass提示没有vendor目录的解决办法在node-sass目录下面新建一个vendor的空目录,然后运行npm/cnpm rebuild node-sass --save-dev即可 ...
- 1065. 我的日程安排表 I
描述 实现MyCalendar类来存储您的活动. 如果新添加的活动没有重复,则可以添加. 你的类将有方法book(int start,int end). 这代表左闭右开的间隔[start,end)有了 ...
- CMake--模块的使用和自定义模块
1.链接外部库 如果程序中使用了外部库,事先并不知道它的头文件和链接库的位置,就要给出头文件和链接库的查找方法,并将他们链接到程序中. FIND_PACKAGE(<name> [major ...
- 设置SQLServer数据库内存
需要设置SQLServer数据库的内存配置.登录数据库,这里使用的是SQLServer2008,右键点击最上方的服务器名,在弹出的菜单中,点击属性] 打开服务器属性窗口.默认显示的是第一项[常规]内容 ...
- 【译】Six Open Source Dashboards to Organize Your Data
作者:Ben Gregory on Jun 29, 2016 译者:carsonzhu 在天文学家看来,我们相信每个组织都可以从数据的正确集中,组织和清理中受益. 我们正在建立一个公司来做到这一点 ...
- Java——scoket通讯
Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket是TCP/IP协议通信的抽象层,所以我们还需要了解TCP协议 传输层协议 TCP: ...
- dede:field name=’position’标签调用 主页改成英文Home和改变符号
在用dede:field name=’position’ 这个标签的时候我们调用的这个就是中文的,出现的是主页>+相应的栏目 ,那么这个问题怎么改成英文的呢?有好多大虾都说找到dede安装目录 ...
- Gitlab中README.MD编写格式模板
README.MD文件 格式: 源码: # Hbase组件 ## Maven依赖 ``` <dependency> <groupId>catf</groupId> ...
- vue2 mint-ui loadmore(下拉刷新)
<template> <div class="page-loadmore"> <h1 class="page-title"> ...