[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 性能计数器 ...
随机推荐
- RAC使用auto rolling的方式打补丁
11.2.0.4 RAC 某系统主库使用auto rolling的方式打补丁在一节点执行1-5,结束后然后在二节点执行1-5,结束后最后再在某个节点执行6. 1.backup GI_HOME& ...
- 从零入门 Serverless | 一文详解 Serverless 技术选型
作者 | 李国强 阿里云资深产品专家 今天来讲,在 Serverless 这个大领域中,不只有函数计算这一种产品形态和应用类型,而是面向不同的用户群体和使用习惯,都有其各自适用的 Serverless ...
- 题解「BZOJ4310」跳蚤
题目传送门 Description 现在有一个长度为 \(n\) 的字符串,将其划分为 \(k\) 段,使得这 \(k\) 段每一段的字典序最大子串中字典序最大的字符串字典序尽量小.求出这个字符串. ...
- Less-(38~41) 堆叠注入
首先申明,Less-(38~41)可以采取和Less-(1~4)相同的解法:(一一对应) 然而,他们的漏洞其实更大,我们可以做更多具有破坏性的事情. 代码审计: Less-(38~41): 41的$s ...
- Noip模拟54 2021.9.16
T1 选择 现在发现好多题目都是隐含的状压,不明面给到数据范围里,之凭借一句话 比如这道题就是按照题目里边给的儿子数量不超过$10$做状压,非常邪门 由于数据范围比较小,怎么暴力就怎么来 从叶子节点向 ...
- JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池
/** * 多线程共享数据 * 线程同步:多个线程在同一个时间段只能有一个线程执行其指定代码,其他线程要等待此线程完成之后才可以继续执行. * 多线程共享数据的安全问题,使用同步解决. * 线程同步两 ...
- axios & fetch 异步请求
// 一.创建实例 const request = axios.create({ baseURL: "http://kg.zhaodashen.cn/v2", headers: { ...
- 从0到1搭建自己的组件(vue-code-view)库(上)
0x00 前言 本文将从结构.功能等方面讲解下项目 vue-code-view 的搭建过程,您可以了解以下内容: 使用 vue cli 4从0搭建一个组件库及细致配置信息. 项目的多环境构建配置. 项 ...
- Appium 介绍与环境搭建
目录 Appium 介绍 APP 自动化测试介绍 什么是 Appium ? Appium 优势 Appium 架构 Appium 生态 Appium 组件 UiAutomator API Bootst ...
- (四)php连接apache ,使用php-fpm方式
上面各篇记录了编译安装lamp的各个部分,下面主要解决php和apache的连接问题.通过 php-fpm 连接. 连接前环境检查: php -v PHP 5.6.30 (cli) (built: O ...