[BZOJ4538]网络

本来想用树剖艹,然而并不会卡常数这种神奇的技能,,,于是还是乖乖写正解吧QAQ

我们可以把一个询问转化为二分判定性问题

二分答案$K$,若所有权值大于$K$的路径都经过询问点$x$,则答案比$K$小,否则答案比$K$大

对于多组询问,外层再套一个整体二分就行了

至于判断有几条路径经过点$x$,对于一条路径$(u,v)$我们把$u$和$v$置为$1$,$lca(u,v)$和$lca(u,v)$的父亲置为$-1$,这样经过一个节点$x$的路径条数就是以其为根的子树的标记和,,,

由于子树区间求和有关,于是可以用dfs序维护

然后可以$O(1)$求lca,即通过欧拉回路把lca转化为rmq问题

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define fir first
  4 #define sec second
  5 #define mp make_pair
  6 #define inf 0x3f3f3f3f
  7 #define maxn 100005
  8 #define maxm 200005
  9 pair<int,int>rng[maxn];
 10 struct node{
 11     int op,id,x,ans;
 12     bool operator<(const node &t)const{ return id<t.id; }
 13 }q[maxm],tmp[maxm];
 14 int cnt,v[maxn<<1],next[maxn<<1],first[maxn];
 15 int ss,ST[maxn<<2][20],log_2[maxn<<1],vis[maxn],dep[maxn];
 16 int n,m,A[maxm],B[maxm],C[maxm],dfn,BIT[maxn],fa[maxn];
 17 int read(){
 18     int ttt=0; char ch=0;
 19     while(ch<‘0‘||ch>‘9‘)ch=getchar();
 20     while(ch>=‘0‘&&ch<=‘9‘)ttt=ttt*10+ch-‘0‘,ch=getchar();
 21     return ttt;
 22 }
 23 void add(int st,int end){
 24     v[++cnt]=end;
 25     next[cnt]=first[st];
 26     first[st]=cnt;
 27 }
 28 void dfs(int x){
 29     rng[x].fir=++dfn;
 30     ST[++ss][0]=x;
 31     if(!vis[x])vis[x]=ss;
 32     for(int e=first[x];e;e=next[e])
 33         if(v[e]!=fa[x]){
 34             fa[v[e]]=x,dep[v[e]]=dep[x]+1;
 35             dfs(v[e]);
 36             ST[++ss][0]=x;
 37         }
 38     rng[x].sec=dfn;
 39 }
 40 int Min(int x,int y){
 41     return dep[x]<dep[y]?x:y;
 42 }
 43 void build_ST(){
 44     log_2[1]=0;
 45     for(int i=2;i<=ss;i++)
 46         log_2[i]=log_2[i>>1]+1;
 47     for(int j=1;j<=log_2[ss];j++)
 48         for(int i=1;i<=ss;i++)
 49             ST[i][j]=Min(ST[i][j-1],ST[i+(1<<(j-1))][j-1]);
 50 }
 51 void update(int pos,int x){
 52     for(int i=pos;i<=n;i+=i&-i)
 53         BIT[i]+=x;
 54 }
 55 int query_ST(int x,int y){
 56     x=vis[x],y=vis[y];
 57     if(x>y)swap(x,y);
 58     int len=log_2[y-x+1];
 59     return Min(ST[x][len],ST[y-(1<<len)+1][len]);
 60 }
 61 //update操作传参biubiu
 62 void update_op(int x,int y,int op){
 63     int lca=query_ST(x,y);
 64     update(rng[x].fir,op),update(rng[y].fir,op);
 65     update(rng[lca].fir,-op);
 66     if(fa[lca])update(rng[fa[lca]].fir,-op);//
 67 }
 68 int query(int pos){
 69     int sum=0;
 70     for(int i=pos;i;i-=i&-i)sum+=BIT[i];
 71     return sum;
 72 }
 73 int query_op(int x){
 74     return query(rng[x].sec)-query(rng[x].fir-1);
 75 }
 76 void erfn(int L,int R,int l,int r){
 77     if(L>R)return;//
 78     int mid=(l+r)>>1;
 79     if(l==r){
 80         for(int i=L;i<=R;i++)
 81             if(q[i].op==2)q[i].ans=mid;
 82         return;
 83     }
 84     int qq=L-1,tt=0,num=0;
 85     for(int i=L;i<=R;i++){
 86         if(q[i].op==2){
 87             if(query_op(q[i].x)==num)q[++qq]=q[i];
 88             else tmp[++tt]=q[i];
 89         }
 90         else{
 91             int op=q[i].op?-1:1;
 92             if(C[q[i].x]<=mid)q[++qq]=q[i];
 93             else{
 94                 tmp[++tt]=q[i],num+=op;
 95                 update_op(A[q[i].x],B[q[i].x],op);
 96             }
 97         }
 98     }
 99     for(int i=1;i<=tt;i++)
100         if(tmp[i].op!=2){
101             int op=tmp[i].op?1:-1;
102             update_op(A[tmp[i].x],B[tmp[i].x],op);
103         }
104     for(int i=1;i<=tt;i++)q[qq+i]=tmp[i];
105     erfn(L,qq,l,mid);
106     erfn(qq+1,qq+tt,mid+1,r);
107 }
108 int main(){
109     n=read(),m=read();
110     int a,b;
111     for(int i=1;i<n;i++){
112         a=read(),b=read();
113         add(a,b),add(b,a);
114     }
115     dfs(1);
116     build_ST();
117     int r=0;
118     for(int i=1;i<=m;i++){
119         q[i].op=read();
120         q[i].id=i;
121         if(q[i].op==0){
122             A[i]=read(),B[i]=read(),C[i]=read();
123             q[i].x=i;
124             r=max(r,C[i]);
125         }
126         else q[i].x=read();
127     }
128     erfn(1,m,-1,r);//
129     sort(q+1,q+1+m);
130     for(int i=1;i<=m;i++)
131         if(q[i].op==2)printf("%d\n",q[i].ans);
132     return 0;
133 }

时间: 2024-11-02 16:09:51

[BZOJ4538]网络的相关文章

HNOI2016 网络 (BZOJ4538)

HNOI2016 Day1 T2 网络 题意:给定一棵树,然后有若干个操作,可以新添加一条从u到v的权值为w的路径,或者将之前的一条路径删掉,动态询问不经过某个点的路径的最大权值 正解:树链剖分+线段树+堆 考场上面打了一个裸裸的树链剖分,连线段树都没套,复杂度是O(m^2 logn)的.当时真是傻了,只要套一个堆就可以AC了...我真傻,真的 首先考虑先树链剖分,然后看怎么处理这三个操作 显然题目要求我们动态维护不经过一个点的最大路径权值,那么我们就考虑用堆 每个线段树的结点里面存两个堆,都是

BZOJ4538 : [Hnoi2016]网络

求出这棵树的dfs序,对于一条链$u-v$,假设$st[u]\leq st[v]$,那么一条链不经过点$x$当且仅当它满足下面任意一个条件: 1.$st[v]<st[x]$ 2.$st[u]>en[x]$ 3.$st[x]<st[lca(u,v)]\leq en[x]$ 4.$st[u]<st[x],st[v]>en[x]$ 前3种情况可以通过线段树做到$O(\log n)$修改,$O(\log n)$查询. 第4种情况可以通过kd-tree做到$O(\log n)$修改,$

iOS开发——网络编程OC篇&amp;Socket编程

Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要

网络攻防第一次作业(201421450010)

姓名:陈书扬 学号:201421450010 指导教师:高见 1.虚拟机安装与调试 安装windows和linux(kali)两个虚拟机,均采用NAT网络模式,查看主机与两个虚拟机器的IP地址,并确保其连通性.同时为两个虚拟机做一个快照 windows虚拟机 Linux虚拟机 本地主机win10 两台主机都ping通 2.Windows基本命令 dir显示目录   cd 进入目录 Arp -a -d -s arp缓存 net share 查看计算机IPC$共享资源 netstat -ano网络链

10.6 监控io性能 - 10.7 free命令 - 10.8 ps命令 - 10.9 查看网络状态 - 10.10 linux下抓包

- 10.6 监控io性能 - 10.7 free命令 - 10.8 ps命令 - 10.9 查看网络状态 - 10.10 linux下抓包 - 扩展tcp三次握手四次挥手 http://www.doc88.com/p-9913773324388.html  - tshark几个用法:http://www.aminglinux.com/bbs/thread-995-1-1.html  # 10.6 监控io性能 ![mark](http://oqxf7c508.bkt.clouddn.com/b

Kali linux网络配置

Kali linux 安装完成后,需要对其网络进行配置.使用DHCP服务是配置网卡最简单的方法之一,但渗透测试时通常不会这样做,因为系统会被记录在DHCP服务器的数据库中. 1  动态DHCP方式 配置文件地址: /etc/network/interface # 启动系统激活设备 # Loop回环地址 auto lo iface lo inet loopback # 启动系统激活设备 # 网卡eth0设置为DHCP类型 auto eth0 iface eth0 inet dhcp 2  静态St

深度复数网络 Deep Complex Networks

转自:https://www.jiqizhixin.com/articles/7b1646c4-f9ae-4d5f-aa38-a6e5b42ec475  (如有版权问题,请联系本人) 目前绝大多数深度学习模型中的数学都是实数值的,近日,蒙特利尔大学.加拿大国家科学院-能源/材料/通信研究中心(INRS-EMT).微软 Maluuba.Element AI 的多名研究者(其中包括 CIFAR Senior Fellow Yoshua Bengio)在 arXiv 上发布了一篇 NIPS 2017(

C#网络编程技术FastSocket实战项目演练

一.FastSocket课程介绍 .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包.组包.粘包.维护连接列表等,UDP协议需要处理丢包.乱序,而且对于多连接并发,还要自己处理多线程等等.本期分享课程阿笨给大家带来的是来源于github开源Socket通信中间件:FastSocket,目的就是把大家从繁琐的网络编程技术中彻底地解放和释放出来. 阿笨只想安安静静的学习下网络编程技术Socket后,将学习的成果直接灵活的运用到自己的实际项目中去.

Android网络通讯简介

网络通信应该包含三部分的内容:发送方.接收方.协议栈.发送方和接收方是参与通信的主体,协议栈是发送方和接收方进行通信的契约.按照服务类型,网络通信可分为面向连接和无连接的方式.面向连接是在通信前建立通信链路,而通信结束后释放该链路.无连接的方式则不需要在通信前建立通信连接,这种方式不保证传输的质量. Android提供了多种网络通信的方式,如Java中提供的网络编程,在Android中都提供了支持.Android中常用的网络编程方式如下: 针对TCP/IP协议的Socket和ServerSock