[loj2049]网络
考虑整体二分,假设二分到区间$[l,r]$,即要对若干个询问,判断这些询问的答案与$mid=\lfloor\frac{l+r}{2}\rfloor$的关系
根据题意,答案$\le mid$等价于重要度$>mid$的请求都经过$x$($x$为询问的节点)
同时,这些询问的答案一定在$[l,r]$中,即重要度$>r$的请求都经过$x$,因此在这里只需要判定$(mid,r]$中的请求是否都经过$x$即可,显然是可以维护的
(关于判定是否都经过$x$,等价于请求总数等于经过$x$的请求数,后者用线段树+差分维护即可)
时间复杂度为$o(n\log^{2}n)$,可以通过


1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 struct edge{
8 int nex,to;
9 }edge[N<<1];
10 struct Data{
11 int p,x,y,z,lca;
12 }q[N<<1];
13 vector<Data>vl,vr;
14 int E,n,m,mq,x,y,head[N],dfn[N],sz[N],dep[N],fa[N][21],ans[N<<1],f[N<<2];
15 void add(int x,int y){
16 edge[E].nex=head[x];
17 edge[E].to=y;
18 head[x]=E++;
19 }
20 int lca(int x,int y){
21 if (dep[x]<dep[y])swap(x,y);
22 for(int i=20;i>=0;i--)
23 if (dep[fa[x][i]]>=dep[y])x=fa[x][i];
24 if (x==y)return x;
25 for(int i=20;i>=0;i--)
26 if (fa[x][i]!=fa[y][i]){
27 x=fa[x][i];
28 y=fa[y][i];
29 }
30 return fa[x][0];
31 }
32 void dfs(int k,int f,int s){
33 dfn[k]=++dfn[0];
34 sz[k]=1;
35 dep[k]=s;
36 fa[k][0]=f;
37 for(int i=1;i<=20;i++)fa[k][i]=fa[fa[k][i-1]][i-1];
38 for(int i=head[k];i!=-1;i=edge[i].nex)
39 if (edge[i].to!=f){
40 dfs(edge[i].to,k,s+1);
41 sz[k]+=sz[edge[i].to];
42 }
43 }
44 void update(int k,int l,int r,int x,int y){
45 f[k]+=y;
46 if (l==r)return;
47 if (x<=mid)update(L,l,mid,x,y);
48 else update(R,mid+1,r,x,y);
49 }
50 int query(int k,int l,int r,int x,int y){
51 if ((l>y)||(x>r))return 0;
52 if ((x<=l)&&(r<=y))return f[k];
53 return query(L,l,mid,x,y)+query(R,mid+1,r,x,y);
54 }
55 void calc(int x,int y,int l,int r){
56 if (x>y)return;
57 if (l==r){
58 for(int i=x;i<=y;i++)
59 if (q[i].p==2)ans[q[i].y]=l;
60 return;
61 }
62 int s=0;
63 vl.clear(),vr.clear();
64 for(int i=x;i<=y;i++){
65 if (q[i].p==2){
66 int ss=query(1,1,n,dfn[q[i].x],dfn[q[i].x]+sz[q[i].x]-1);
67 if (s==ss)vl.push_back(q[i]);
68 else vr.push_back(q[i]);
69 }
70 else{
71 if (q[i].z<=mid){
72 vl.push_back(q[i]);
73 continue;
74 }
75 vr.push_back(q[i]);
76 int ss=1;
77 if (q[i].p)ss=-1;
78 s+=ss;
79 update(1,1,n,dfn[q[i].x],ss);
80 update(1,1,n,dfn[q[i].y],ss);
81 update(1,1,n,dfn[q[i].lca],-ss);
82 if (q[i].lca!=1)update(1,1,n,dfn[fa[q[i].lca][0]],-ss);
83 }
84 }
85 for(int i=0;i<vl.size();i++)q[x+i]=vl[i];
86 for(int i=0;i<vr.size();i++)q[x+vl.size()+i]=vr[i];
87 for(int i=x;i<=y;i++){
88 if ((q[i].p==2)||(q[i].z<=mid))continue;
89 int ss=1;
90 if (q[i].p)ss=-1;
91 update(1,1,n,dfn[q[i].x],-ss);
92 update(1,1,n,dfn[q[i].y],-ss);
93 update(1,1,n,dfn[q[i].lca],ss);
94 if (q[i].lca!=1)update(1,1,n,dfn[fa[q[i].lca][0]],ss);
95 }
96 int xx=x+vl.size();
97 calc(x,xx-1,l,mid);
98 calc(xx,y,mid+1,r);
99 }
100 int main(){
101 scanf("%d%d",&n,&m);
102 memset(head,-1,sizeof(head));
103 for(int i=1;i<n;i++){
104 scanf("%d%d",&x,&y);
105 add(x,y);
106 add(y,x);
107 }
108 dfs(1,1,0);
109 for(int i=1;i<=m;i++){
110 scanf("%d",&q[i].p);
111 if (q[i].p==0){
112 scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].z);
113 q[i].lca=lca(q[i].x,q[i].y);
114 }
115 if (q[i].p==1){
116 scanf("%d",&x);
117 q[i].x=q[x].x,q[i].y=q[x].y,q[i].z=q[x].z,q[i].lca=q[x].lca;
118 }
119 if (q[i].p==2){
120 scanf("%d",&q[i].x);
121 q[i].y=++mq;
122 }
123 }
124 calc(1,m,0,1e9);
125 for(int i=1;i<=mq;i++){
126 if (!ans[i])ans[i]=-1;
127 printf("%d\n",ans[i]);
128 }
129 }
(另外洛谷上的第一篇题解查询复杂度是$o(n\log n)$,但修改似乎是$o(n\log^{2}n)$的)
[loj2049]网络的更多相关文章
- loj2049 「HNOI2016」网络
好像复杂度来说不是正解--不加谜之优化(下叙)能被loj上的加强数据卡 #include <algorithm> #include <iostream> #include &l ...
- 并不对劲的bzoj4538:loj2049:p3250:[HNOI2016]网络
题意 有一棵\(n\)(\(n\leq 10^5\))个点的树,\(m\)(\(m\leq 2\times 10^5\))个操作.操作有三种:1.给出\(u,v,k\),表示加入一条从\(u\)到\( ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法
如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...
- Virtual Box配置CentOS7网络(图文教程)
之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...
- 前端网络、JavaScript优化以及开发小技巧
一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- C# 利用性能计数器监控网络状态
本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态.并能够直观的展现出来 涉及到的知识点: PerformanceCounter,表示 Windows NT 性能计数器 ...
随机推荐
- 从0到1使用Kubernetes系列——Kubernetes入门
基本概念 Docker 是什么 Docker 起初是 dotCloud 公司创始人 Solomon Hykes 在法国的时候发起的一项公司内部项目,Docker 是基于 dotCloud 公司多年云服 ...
- HPE ProLiant 系列服务器Microsoft Windows 2008 R2系统下网卡绑定方法
HPE Network Configuration Utility(以下简称NCU) 网卡绑定工具,用户可以通过该工具很方便的把服务器的多个网卡捆绑到一起以达到容错和增加可用带宽的目的. 1.打开NC ...
- SAE助力南瓜电影7天内全面Severless
作者:李刚(寻如),阿里云解决方案架构师 南瓜电影APP是国内领先的专注于影视精品化运营的垂直类视频产品,在移动互联网.IPTV.OTT等客户端,面向广大中产阶级精英群体,提供有异于院线及其他视频平台 ...
- 题解 「BZOJ3636」教义问答手册
题目传送门 Description 作为泉岭精神的缔造者.信奉者.捍卫者.传承者,Pear决定印制一些教义问答手册,以满足泉岭精神日益增多的信徒.Pear收集了一些有关的诗选.语录,其中部分内容摘录在 ...
- 洛谷4455 [CQOI2018]社交网络 (有向图矩阵树定理)(学习笔记)
sro_ptx_orz qwq算是一个套路的记录 对于一个有向图来说 如果你要求一个外向生成树的话,那么如果存在一个\(u\rightarrow v\)的边 那么\(a[u][v]--,a[v][v] ...
- bzoj2038 小z的袜子 (莫队)
题目大意 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编 ...
- SpringBoot-自动装配2
配置文件到底能写什么?怎么写? SpringBoot官方文档中有大量的配置,直接去记忆的话,好像不是我们程序员的行事风格! 分析自动配置原理 能自动配置的组件一般都有命名为下面规则的两个类: xxxx ...
- 这么多TiDB负载均衡方案总有一款适合你
[是否原创]是 [首发渠道]TiDB 社区 前言 分布式关系型数据库TiDB是一种计算和存储分离的架构,每一层都可以独立地进行水平扩展,这样就可以做到有的放矢,对症下药. 从TiDB整体架构图可以看到 ...
- suricata的模块和插槽
参考资料 suricata官方文档https://suricata.readthedocs.io/en/latest/performance/runmodes.html#different-runmo ...
- 第六次Scrum Metting
日期:2021年5月3日 会议主要内容概述:讨论前后端进度,前端各模块对接以及前后端对接. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 数据模块 ...