考虑整体二分,假设二分到区间$[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]网络的更多相关文章

  1. loj2049 「HNOI2016」网络

    好像复杂度来说不是正解--不加谜之优化(下叙)能被loj上的加强数据卡 #include <algorithm> #include <iostream> #include &l ...

  2. 并不对劲的bzoj4538:loj2049:p3250:[HNOI2016]网络

    题意 有一棵\(n\)(\(n\leq 10^5\))个点的树,\(m\)(\(m\leq 2\times 10^5\))个操作.操作有三种:1.给出\(u,v,k\),表示加入一条从\(u\)到\( ...

  3. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  4. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  5. 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法

    如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...

  6. Virtual Box配置CentOS7网络(图文教程)

    之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...

  7. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  8. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  9. C# 利用性能计数器监控网络状态

    本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态.并能够直观的展现出来 涉及到的知识点: PerformanceCounter,表示 Windows NT 性能计数器 ...

随机推荐

  1. Linux从头学15:【页目录和页表】-理论 + 实例 + 图文的最完全、最接地气详解

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  2. MySQL初步学习——2021.09.27每日总结,第四周周一

    (1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天学习了SQL语句的分类: SQL语句很多,分为 1.DQL:数据查询语言(凡是带有select关键字的都是查询语句) 2 ...

  3. Java(47)反射

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201675.html 博客主页:https://www.cnblogs.com/testero ...

  4. C++ 类继承 笔记(初步)

    本节内容源于对C++ primer第13章的学习,这本书把C++的原理将得明明白白.网上的博客往往讲得一头雾水.到头来还不如看原书本. 问题 首先给出一题: #include<stdio.h&g ...

  5. 【UE4 C++】 射线检测 LineTrace 及 BoxTrace、SphereTrace、CapsuleTrace API

    World.h 库里的 Trace API Trace模式 TraceSingle 单个结果 TraceMulti 多个结果 Trace 的检测依据 ByChanne ByObjectType ByP ...

  6. 对比7种分布式事务方案,还是偏爱阿里开源的Seata,真香!(原理+实战)

    前言 这是<Spring Cloud 进阶>专栏的第六篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得了? 阿里面 ...

  7. MIPI归纳---为什么阻抗为100欧姆

    根据LVDS(Low Voltage Differential Signaling)电平定义的. LVDS差分信号PN两线最大幅度是350mV,内部一个恒流源电流是3.5mA.于是终端匹配电阻是100 ...

  8. ip_local_port_range 和 ip_local_reserved_ports

    问题:启动应用程序时,发现网络端口被占用,原因是什么?如何避免? 原因:Linux 系统设置了随机使用的端口范围  echo "40000  60000" > /proc/. ...

  9. best-time-to-buy-and-sell-stock-ii leetcode C++

    Say you have an array for which the i th element is the price of a given stock on day i. Design an a ...

  10. JAVA笔记7__接口应用/Object类/简单工厂模式/静态代理模式/适配器模式

    /** * 接口应用 */ public class Main { public static void main(String[] args) { Person p = new Person(&qu ...