[HNOI2016]网络
[HNOI2016]网络
未影响的最大值??
最值不能差分之类,难处理
二分答案!看是否覆盖所有大于mid路径!可以计数!树状数组维护dfn序,树上差分
多组询问?整体二分!
#include<bits/stdc++.h> #define reg register int #define il inline #define fi first #define se second #define mk(a,b) make_pair(a,b) #define numb (ch^'0') using namespace std; typedef long long ll; template<class T>il void rd(T &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x); } template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');} template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');} template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}namespace Miracle{ const int N=1e5+5; const int M=2e5+5; const int inf=1e9; int n,m; struct node{int nxt,to; }e[2*N]; int hd[N],cnt; void add(int x,int y){e[++cnt].nxt=hd[x];e[cnt].to=y;hd[x]=cnt; } int dep[N],fa[N][18]; int dfn[N],dfn2[N],fdfn[N]; int df; void dfs(int x,int d){dep[x]=d;dfn[x]=++df;fdfn[df]=x;for(reg i=hd[x];i;i=e[i].nxt){int y=e[i].to;if(y==fa[x][0]) continue;fa[y][0]=x;dfs(y,d+1);}dfn2[x]=df; } int lca(int x,int y){if(dep[x]<dep[y]) swap(x,y);for(reg j=17;j>=0;--j){if(dep[fa[x][j]]>=dep[y]) x=fa[x][j];}if(x==y) return x;for(reg j=17;j>=0;--j){if(fa[x][j]!=fa[y][j]) x=fa[x][j],y=fa[y][j];}return fa[x][0]; } struct po{int x,y,anc,val; }p[M]; struct event{//typ=1:add -1:dele 2:queryint typ;int id,pos; }q[M],le[M],ri[M]; int tot; int ans[N]; int f[N]; void upda(int x,int c){if(!x) return;for(;x<=n;x+=x&(-x)) f[x]+=c; } int query(int x){int ret=0;for(;x;x-=x&(-x)) ret+=f[x];return ret; } void divi(int l,int r,int L,int R){ // cout<<" divi "<<l<<" and "<<r<<" : "<<L<<" && "<<R<<endl;if(l>r) return;if(L==R){for(reg i=l;i<=r;++i){if(q[i].typ==2){if(L==0) ans[q[i].id]=-1;else ans[q[i].id]=L;}}return ;}int mid=(L+R)>>1;int pl=0,pr=0;int cnt=0;for(reg i=l;i<=r;++i){ // cout<<" i "<<i<<" typ "<<q[i].typ<<endl;if(q[i].typ==2){//queryint now=query(dfn2[q[i].pos])-query(dfn[q[i].pos]-1);if(now<cnt){ri[++pr]=q[i];}else le[++pl]=q[i];}else{if(p[q[i].id].val>mid){int lp=q[i].typ;cnt+=lp;upda(dfn[p[q[i].id].x],lp);upda(dfn[p[q[i].id].y],lp);upda(dfn[p[q[i].id].anc],-lp);upda(dfn[fa[p[q[i].id].anc][0]],-lp);ri[++pr]=q[i];}else{le[++pl]=q[i];}}}for(reg i=l;i<=r;++i){if(q[i].typ==2){//querycontinue;}else{if(p[q[i].id].val>mid){int lp=q[i].typ;upda(dfn[p[q[i].id].x],-lp);upda(dfn[p[q[i].id].y],-lp);upda(dfn[p[q[i].id].anc],lp);upda(dfn[fa[p[q[i].id].anc][0]],lp);}}}for(reg i=1;i<=pl;++i){q[i+l-1]=le[i];}for(reg i=1;i<=pr;++i){q[l+pl-1+i]=ri[i];}divi(l,l+pl-1,L,mid);divi(l+pl,r,mid+1,R); } int main(){rd(n);rd(m);int x,y;for(reg i=1;i<n;++i) {rd(x);rd(y);add(x,y);add(y,x);}dfs(1,1);for(reg j=1;j<=17;++j){for(reg i=1;i<=n;++i){fa[i][j]=fa[fa[i][j-1]][j-1];}}for(reg i=1;i<=m;++i){rd(q[i].typ);if(q[i].typ==0){q[i].typ=1;rd(p[i].x);rd(p[i].y);rd(p[i].val);p[i].anc=lca(p[i].x,p[i].y);q[i].id=i;} else if(q[i].typ==1){q[i].typ=-1;rd(x);q[i].id=x;}else{++tot;q[i].id=tot;rd(q[i].pos);}}divi(1,m,0,inf);for(reg i=1;i<=tot;++i){printf("%d\n",ans[i]);}return 0; }} signed main(){Miracle::main();return 0; }/*Author: *Miracle*Date: 2019/3/22 17:15:06 */
最优化有时难以直接考虑,二分是一个不错的转化为判定问题,有时还可以转化为计数。
转载于:https://www.cnblogs.com/Miracevin/p/10580390.html
[HNOI2016]网络相关推荐
- P3250 [HNOI2016]网络(整体二分)
P3250 [HNOI2016]网络 给定一棵树,有三种操作: 给定u,v,wu, v, wu,v,w,表示u,vu, vu,v路径上有一个重要度为www的请求, 给定ttt,第ttt个发生的请求结束 ...
- P3250 [HNOI2016]网络(利用堆建线段树 + 树剖)
P3250 [HNOI2016]网络 做法有点神奇!!!利用堆作为节点建立一颗线段树,用堆维护线段树上点的信息. 说说查询操作,我们的目的是要查询,没有经过这个点的事件最大值,考虑如何维护. 我们定义 ...
- [HNOI2016]网络(树链剖分+线段树+大根堆)
[HNOI2016]网络 problem solution 另辟蹊径,不把交互请求赋在新增路径上,反而把交互请求赋在树上除去该请求路径覆盖点的其它点上 显然,路径问题树剖是非常可以的. 那么一个点上的 ...
- [HNOI2016]网络 树链剖分,堆
[HNOI2016]网络 LG传送门 表示乱搞比正解难想. 整体二分很好想吧. 但是为了好写快乐,我们选择三个\(\log\)的乱搞. 先树剖,线段树套堆维护区间最大值.对于一次修改,如果是插入,就把 ...
- 4538: [Hnoi2016]网络
4538: [Hnoi2016]网络 链接 分析: 整体二分. 对于一次操作,可以二分一个答案mid,判断权值大于mid的路径是否全部经过这个点.如果是 ,那么这次询问的答案在[l,mid-1]之间, ...
- BZOJ 4538: [Hnoi2016]网络
这个题目就是特别裸啊,很明显就是先树链剖分,然后在线段树每个节点上维护两个堆,来维护插入和删除,查询的时候就暴力查就好了. 似乎很简单啊,我竟然在luogu上1A了,结果交到bzoj上MLE,看过讨论 ...
- 洛咕P3250 [HNOI2016]网络 整体二分
这题太神仙了必须写博客... 显然可以想到二分答案.二分一个答案mid,如果所有长度\(\geq mid\)的路径都过x,那么答案一定\(<mid\),否则答案\(\geq mid\). 那么就 ...
- # HNOI2012 ~ HNOI2018 题解
HNOI2012 题解 [HNOI2012]永无乡 Tag:线段树合并.启发式合并 联通块合并问题. 属于\(easy\)题,直接线段树合并 或 启发式合并即可. [HNOI2012]排队 Tag:组 ...
- linux下sqlserver端口号,登陆sqlserver及修改端口号 (转)
在一台计算机上面同时安装两个sql server数据库实例,第一次安装默认为机器名,端口号为1433 1.如果不知道服务器名,却想登陆的话可以直接输入127.0.0.1登陆之后,在新建查询中输入:SE ...
- 苹果设备iphone,ipad,macbook网络连接慢,开机开什么卡什么,一步解决
苹果电脑网络连接慢,开机开什么卡什么??? 网络上的方法一种种,没有一个适用的? 如果你的macbook也是打开就没网,但有一些软件也能用,就是浏览器加载跑条儿,不妨试试! 系统偏好设置-网络-高级- ...
最新文章
- 浅析:setsockopt()改善程序的健壮性【转】
- 【alibaba-cloud】网关整合sentinel实现限流
- Ubuntu 下Ape转Mp3[88250原创]
- platform_device与platform_driver
- JS每日一题:Vue中的diff算法?
- Python3 解释执行字符串类型的代码
- 32mU盘 Linux x86,我有一个32M的U盘,大家帮我想想这个东西如何利用?
- ASP.NET中使用多个runat=server form(转)
- C++11 现代C++风格的新元素--简介
- SolidWorks 2018 安装教程
- mysql msdtc 不支持_MSDTC 服务意外地在 Windows Server 2012 或 Windows Server 2008 R2 SP1 中停止...
- Base64编码原理
- php 函数 累乘 累加,如何实现EXCEL中的累加计算【累加累乘】
- 解决chm文件打开后跳到某一主页方法
- keil编译后MCU需要的flash和RAM容量
- 为你解说加密Pdf如何导出图片
- QQ正式推出“超级QQ秀”布局元宇宙
- 桌面文件丢失如何找回?这两个方法值得一试
- 追星必备神器 -- 爱豆APP
- beyond compare 3中文乱码