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

解题报告:

传送门!

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

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. Java知多少(22)方法重载

    在Java中,同一个类中的多个方法可以有相同的名字,只要它们的参数列表不同就可以,这被称为方法重载(method overloading). 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺 ...

  2. 【转帖】流程与IT管理部——IT支撑业务变革的必然趋势

    流程与IT管理部——IT支撑业务变革的必然趋势 1前言 伴随着中国企业的信息化进程, IT部门.IT专职人员已经在大部分企业获得了一席之地,电脑.网络.软件的维护都离不开这个部门:不过“一席之地”并不 ...

  3. linux memcached开机启动

    方法一: 在/etc/rc.d/rc.local 加入以下代码 /usr/local/memcached/bin/memcached -u root -d -m -l -P /tmp/memcache ...

  4. Java中创建线程的三种方式以及区别

    在java中如果要创建线程的话,一般有3种方法: 继承Thread类: 实现Runnable接口: 使用Callable和Future创建线程. 1. 继承Thread类 继承Thread类的话,必须 ...

  5. duilib进阶教程 -- TreeView控件(6)

    代码下载:http://download.csdn.net/detail/qq316293804/6483905 上一个教程中,界面已经和迅雷一模一样啦,大小和位置一个像素都不差哟,亏得Alberl调 ...

  6. go如何进行交叉编译

    https://www.jianshu.com/p/4b345a9e768e 如果在powershell环境中, 需要换中设置方式 $env:GOOS="linux" $env:G ...

  7. [PGM] Variable elimination and Belief propagation

    内容范围如题.Lec 08-11的内容:https://www.youtube.com/watch?v=Qa04kw1gKHk&index=36&list=PLQiVpyxVlLkbp ...

  8. c++ typedef和#define的作用范围

    typedef: 如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾: 如果放在某个函数内,定义域就是从定义开始直到该函数结尾: #define: 不管是在某个函数内,还是在所有函数之外,作用 ...

  9. 【消灭代办】第1周 - 敏感词判断、图片206、parseInt

    11.16代办一:[敏感词判断] 代办描述: 一堆字符串组成的数组,给你一个字符串,让你去查找这个字符串是否在这个数组当中? 关键考点: 数组匹配,看一个数组中有没有这个字符串. 解决思路: 遍历数组 ...

  10. mui---自定义页面打开的方向

    在使用MUI做APP的时候,会考虑对页面的打开方向做规定,MUI也给我们提供了很多种页面的打开方式. 具体参考: http://ask.dcloud.net.cn/question/174 MUI做A ...