正解:整体二分+树状数组

解题报告:

传送门!

亲这里的建议是用整体二分呢

dbq最近看sd淘宝说话体看多了有点脑抽,,,

首先考虑如果是单组询问怎么做昂QAQ

考虑二分答案

对于所有比mid小的操作都不用管

然后对于大于mid的操作,他们都是不应该存在的

怎么样就不会存在呢,那不然就是已经结束了不然就是经过了故障点嘛

所以如果能通过某种方式算出所有麻油结束的经过了故障点的链数就可以判断是否合法了嘛

然后这个其实是个比较典型的dfn序套路题,,,?

就是对每个修改就改链的两端+1(-1),两端的lca-1(+1),lca的父亲-1(+1)

然后查询经过点x的链有几条就相当于是查询x的子树中的权值和

(   然后这个套路我本来还想解释一下的,,,后来发现麻油什么好解释的昂QAQ

就理解成差分就好,然后为什么是lca-1,lca父亲-1,是为了保证lca处答案的正确性

感性理解趴,,,这个我也不能很好的解释,但是画个图还是不难理解的w

显然如果经过x的链的条数=大于mid的链且没有结束的条数说明枚举大了,ans在[l,mid]中

否则ans在[mid+1,r]中

然后看到多组询问什么的可以想到,整体二分

就依然是整体二分的经典套路昂,具体内部实现就和单组询问的思想是一样的

然后放下代码就over辣!

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define gc getchar()
#define ll long long
#define t(i) edge[i].to
#define lowbit(x) (x&(-x))
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i)
#define e(i,x) for(rg ll i=head[x];i;i=edge[i].nxt) const ll N=1e5+,M=2e5+,inf=1e9;
ll n,m,head[N],edge_cnt,dfn[N],dfn_cnt,sz[N],tr[N],as[N],fa[N][],dep[N];
bool output[M];
struct ed{ll to,nxt;}edge[N<<];
struct node{ll op,fr,to,lca1,lca2,val,id;}opr[M],l[M],r[M]; il ll read()
{
rg char ch=gc;rg ll x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ll x,ll y){edge[++edge_cnt]=(ed){x,head[y]};head[y]=edge_cnt;}
il void dfs(ll x,ll fat){dep[x]=dep[fat]+;dfn[x]=++dfn_cnt;sz[x]=;fa[x][]=fat;rp(i,,)fa[x][i]=fa[fa[x][i-]][i-];e(i,x)if(t(i)^fat)dfs(t(i),x),sz[x]+=sz[t(i)];}
il ll lca(ll x,ll y)
{
if(dep[x]<dep[y])swap(x,y);
my(i,,)if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
if(x==y)return x;
my(i,,)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][];
}
il void updat(ll x,ll dat){if(!x)return;while(x<=n)tr[x]+=dat,x+=lowbit(x);}
il ll query(ll x){/*printf("x=%lld ",x);*/ll ret=;while(x)ret+=tr[x],x-=lowbit(x);/*printf("ret=%lld\n",ret);*/return ret;}
il void solv(ll op_l,ll op_r,ll as_l,ll as_r)
{
// printf("op_l=%lld op_r=%lld as_l=%lld as_r=%lld\n",op_l,op_r,as_l,as_r);
if(op_l>op_r)return;if(as_l==as_r){rp(i,op_l,op_r)as[opr[i].id]=as_l;return;}
ll mid=(as_l+as_r)>>,l_cnt=,r_cnt=,bg_cnt=;
rp(i,op_l,op_r)
{
// printf(" i=%lld op=%lld to=%lld\n",i,opr[i].op,opr[i].to); if(opr[i].op==){if(query(dfn[opr[i].to]+sz[opr[i].to]-)-query(dfn[opr[i].to]-)==bg_cnt)l[++l_cnt]=opr[i];else r[++r_cnt]=opr[i];continue;}
if(opr[i].op==)
{
if(opr[i].val<=mid){l[++l_cnt]=opr[i];/*printf("qwq?\n");*/continue;}
else{updat(opr[i].fr,-);updat(opr[i].to,-);updat(opr[i].lca1,);updat(opr[i].lca2,);--bg_cnt;r[++r_cnt]=opr[i];}
// if(!(opr[i].val<=mid))
// printf("QAQ val=%lld mid=%lld\n",opr[i].val,mid);
continue;
}
if(opr[i].val<=mid){l[++l_cnt]=opr[i];/*printf("qwq???\n");*/continue;}
else{updat(opr[i].fr,);updat(opr[i].to,);updat(opr[i].lca1,-);updat(opr[i].lca2,-);++bg_cnt;r[++r_cnt]=opr[i];}
// printf("QAQ val=%lld mid=%lld\n",opr[i].val,mid);
}
rp(i,op_l,op_r)
{
if(opr[i].op== && opr[i].val>mid){updat(opr[i].fr,);updat(opr[i].to,);updat(opr[i].lca1,-);updat(opr[i].lca2,-);}
if(opr[i].op== && opr[i].val>mid){updat(opr[i].fr,-);updat(opr[i].to,-);updat(opr[i].lca1,);updat(opr[i].lca2,);}
}
// printf("QAQ l_cnt=%lld\n",l_cnt);
rp(i,,l_cnt)opr[op_l+i-]=l[i];rp(i,,r_cnt)opr[op_l+l_cnt+i-]=r[i];
solv(op_l,op_l+l_cnt-,as_l,mid);solv(op_l+l_cnt,op_r,mid+,as_r);
} int main()
{
// freopen("wl.in","r",stdin);freopen("wl.out","w",stdout);
n=read();m=read();memset(as,-,sizeof(as));rp(i,,n-){ll x=read(),y=read();ad(x,y);ad(y,x);}dfs(,);
rp(i,,m)
{
// printf("i=%lld\n",i);
ll tmp=read()+;
if(tmp==)
{
ll fr_tmp=read(),to_tmp=read(),lca_tmp=lca(fr_tmp,to_tmp),val_tmp=read();opr[i]=(node){,dfn[fr_tmp],dfn[to_tmp],dfn[lca_tmp],dfn[fa[lca_tmp][]],val_tmp,i};
}
if(tmp==){opr[i]=opr[read()];opr[i].op=;opr[i].id=i;}
if(tmp==){opr[i].op=;opr[i].id=i;opr[i].to=read();output[i]=;}
// printf("i=%lld to=%lld\n",i,opr[i].to);
}
// printf("QAQ?\n");
solv(,m,-,inf);rp(i,,m)if(output[i])printf("%lld\n",as[i]);
return ;
}

好久麻油打整体二分我开始差点忘记树状数组要清零了1551

洛谷P3250 网络 [HNOI2016] 整体二分的更多相关文章

  1. 洛谷P3527 MET-Meteors [POI2011] 整体二分

    正解:整体二分 解题报告: 传送门! 还有个双倍经验!(明明是一样的题目为什么你们一个紫一个黑啊喂! 这题首先要想到可以二分嘛,然后看到多组询问肯定就整体二分鸭 那就是基本套路啊,发现是区间修改单点查 ...

  2. 洛谷P3527 [POI2011]MET-Meteors [整体二分]

    题目传送门 Meteors 格式难调,题面就不妨放了. 分析: 一道整体二分的练手题. 就是一般的整体二分的套路,但是要注意,将修改和询问加入队列的时候要先加修改再加询问.另外,博主代码打得太丑,常数 ...

  3. 洛谷$P2617\ Dynamic\ Rankings$ 整体二分

    正解:整体二分 解题报告: 传送门$w$ 阿查询带修区间第$k$小不显然整体二分板子呗,,, 就考虑先按时间戳排序(,,,其实并不需要读入的时候就按着时间戳排的鸭$QwQ$ 每次二分出$mid$先把所 ...

  4. 洛谷P3250 [HNOI2016]网络(整体二分+树状数组+树剖)

    传送门 据说正解是树剖套堆???然而代码看着稍微有那么一点点长…… 考虑一下整体二分,设当前二分到的答案为$mid$,如果所有大于$mid$的边都经过当前点$x$,那么此时$x$的答案必定小于等于$m ...

  5. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

  6. 洛谷 P1083 借教室【二分+差分/线段树】

    二分mid,然后用1~mid的操作在差分序列上加减,最后把差分序列前缀和起来,看是否有有超过初始r值的 #include<iostream> #include<cstdio> ...

  7. 洛谷P1462-通往奥格瑞玛的道路-二分+最短路

    洛谷P1462-通往奥格瑞玛的道路 题目描述 在艾泽拉斯,有\(n\)个城市.编号为\(1,2,3,...,n\). 城市之间有\(m\)条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联 ...

  8. LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)

    LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \ ...

  9. [洛谷P3250][HNOI2016]网络

    题目大意:给定一棵树.有三种操作: $0\;u\;v\;t:$在$u$到$v$的链上进行重要度为$t$的数据传输. $1\;x:$结束第$x$个数据传输. $2\;x:$询问不经过点$x$的数据传输中 ...

随机推荐

  1. AI金融知识自学偏量化方向-前提1

    前提: 统计学习(统计分析)和机器学习之间的区别 金融公司采用机器学习技术及招募相关人才要求 第一个问题:  机器学习和统计学都是数据科学的一部分.机器学习中的学习一词表示算法依赖于一些数据(被用作训 ...

  2. Bitmap用来做大数据处理

    MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)" Bit-map空间压缩和快速排序去 ...

  3. opencv 无法使用 dll 动态链接库 UnsatisfiedLinkError java.library.path Can't find dependent libraries

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME) 使用如上方法加载本地 dll文件. 一般会出现两种错误: 1. UnsatisfiedLinkError ja ...

  4. java.lang.NoSuchFieldError: No static field abc_ic_ab_back_mtrl_am_alpha of type I in class Landroid/support/v7/appcompat/R$drawable

    出现java.lang.NoSuchFieldError: No static field abc_ic_ab_back_mtrl_am_alpha of type I in class Landro ...

  5. mariadb 10.1.26 二进制包安装笔记

    报错链接:http://php.upupw.net/ank2discuss/40/6841-e.html mariadb 10.1.26 二进制版本 全名称: mariadb-10.1.26-linu ...

  6. Windows server 2008 R2 多用户远程桌面

    1.  创建三个本地管理员测试用户 user01  user02  user03并设置密码 2.  开启远程桌面连接 3.新建规则放行远程桌面端口3389 (或者关闭防火墙) 4.安装远程桌面服务 5 ...

  7. laravel 5 : Class 'input' not found

     在配置文件中:config\app.php 加上 'Input' => Illuminate\Support\Facades\Input::class, 或者 引用 :use Illumina ...

  8. Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面

    目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...

  9. ImageMagick、imagick和ghostscript三者的关联

    http://467754239.blog.51cto.com/4878013/1602518/ 一.功能概述 ImageMagick是第三方的图片处理软件,功能要比GD强大.建议两者都安装,并不冲突 ...

  10. SQL Server 端口号的使用

    SQL Server 端口号的使用 服务器地址  逗号 端口号 服务器地址,端口号 xxx.xxx.xxx.xxx,0000 www.xxx.com,1533  (1533是SQL Server 的端 ...