[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]网络相关推荐

  1. P3250 [HNOI2016]网络(整体二分)

    P3250 [HNOI2016]网络 给定一棵树,有三种操作: 给定u,v,wu, v, wu,v,w,表示u,vu, vu,v路径上有一个重要度为www的请求, 给定ttt,第ttt个发生的请求结束 ...

  2. P3250 [HNOI2016]网络(利用堆建线段树 + 树剖)

    P3250 [HNOI2016]网络 做法有点神奇!!!利用堆作为节点建立一颗线段树,用堆维护线段树上点的信息. 说说查询操作,我们的目的是要查询,没有经过这个点的事件最大值,考虑如何维护. 我们定义 ...

  3. [HNOI2016]网络(树链剖分+线段树+大根堆)

    [HNOI2016]网络 problem solution 另辟蹊径,不把交互请求赋在新增路径上,反而把交互请求赋在树上除去该请求路径覆盖点的其它点上 显然,路径问题树剖是非常可以的. 那么一个点上的 ...

  4. [HNOI2016]网络 树链剖分,堆

    [HNOI2016]网络 LG传送门 表示乱搞比正解难想. 整体二分很好想吧. 但是为了好写快乐,我们选择三个\(\log\)的乱搞. 先树剖,线段树套堆维护区间最大值.对于一次修改,如果是插入,就把 ...

  5. 4538: [Hnoi2016]网络

    4538: [Hnoi2016]网络 链接 分析: 整体二分. 对于一次操作,可以二分一个答案mid,判断权值大于mid的路径是否全部经过这个点.如果是 ,那么这次询问的答案在[l,mid-1]之间, ...

  6. BZOJ 4538: [Hnoi2016]网络

    这个题目就是特别裸啊,很明显就是先树链剖分,然后在线段树每个节点上维护两个堆,来维护插入和删除,查询的时候就暴力查就好了. 似乎很简单啊,我竟然在luogu上1A了,结果交到bzoj上MLE,看过讨论 ...

  7. 洛咕P3250 [HNOI2016]网络 整体二分

    这题太神仙了必须写博客... 显然可以想到二分答案.二分一个答案mid,如果所有长度\(\geq mid\)的路径都过x,那么答案一定\(<mid\),否则答案\(\geq mid\). 那么就 ...

  8. # HNOI2012 ~ HNOI2018 题解

    HNOI2012 题解 [HNOI2012]永无乡 Tag:线段树合并.启发式合并 联通块合并问题. 属于\(easy\)题,直接线段树合并 或 启发式合并即可. [HNOI2012]排队 Tag:组 ...

  9. linux下sqlserver端口号,登陆sqlserver及修改端口号 (转)

    在一台计算机上面同时安装两个sql server数据库实例,第一次安装默认为机器名,端口号为1433 1.如果不知道服务器名,却想登陆的话可以直接输入127.0.0.1登陆之后,在新建查询中输入:SE ...

  10. 苹果设备iphone,ipad,macbook网络连接慢,开机开什么卡什么,一步解决

    苹果电脑网络连接慢,开机开什么卡什么??? 网络上的方法一种种,没有一个适用的? 如果你的macbook也是打开就没网,但有一些软件也能用,就是浏览器加载跑条儿,不妨试试! 系统偏好设置-网络-高级- ...

最新文章

  1. 浅析:setsockopt()改善程序的健壮性【转】
  2. 【alibaba-cloud】网关整合sentinel实现限流
  3. Ubuntu 下Ape转Mp3[88250原创]
  4. platform_device与platform_driver
  5. JS每日一题:Vue中的diff算法?
  6. Python3 解释执行字符串类型的代码
  7. 32mU盘 Linux x86,我有一个32M的U盘,大家帮我想想这个东西如何利用?
  8. ASP.NET中使用多个runat=server form(转)
  9. C++11 现代C++风格的新元素--简介
  10. SolidWorks 2018 安装教程
  11. mysql msdtc 不支持_MSDTC 服务意外地在 Windows Server 2012 或 Windows Server 2008 R2 SP1 中停止...
  12. Base64编码原理
  13. php 函数 累乘 累加,如何实现EXCEL中的累加计算【累加累乘】
  14. 解决chm文件打开后跳到某一主页方法
  15. keil编译后MCU需要的flash和RAM容量
  16. 为你解说加密Pdf如何导出图片
  17. QQ正式推出“超级QQ秀”布局元宇宙
  18. 桌面文件丢失如何找回?这两个方法值得一试
  19. 追星必备神器 -- 爱豆APP
  20. beyond compare 3中文乱码

热门文章

  1. Python3.x:定义一个类并且调用
  2. markdown语法学习---半小时就能掌握--宋成光
  3. 简单5步,释放Mac磁盘空间
  4. 大家一起写mvc(二)
  5. 用C#实现文件夹拷贝
  6. Kotlin基础-对象声明和表达式
  7. nodejs小问题:express不是内部或外部命令
  8. bzoj1088: [SCOI2005]扫雷Mine
  9. LeetCode() Reorder List
  10. winform 获取当前项目所在的路径