考虑整体二分,假设二分到区间$[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. MYSQL小版本升级(5.7.21至5.7.25)

    1.环境确认 [root@mysql ~]# ps -ef |grep -i mysql root 9173 1 0 2020 ? 00:00:00 /bin/sh /mysql/data/mysql ...

  2. 理解hashMap

    首先需要理解几个基本概念: 什么是数据结构?(摘自 java数据结构系列--什么是数据结构 (baidu.com)) 数据结构是计算机组织.存储数据的方式.简单来说就是,数据按指定的规则进行存储,从而 ...

  3. Pandas高级教程之:时间处理

    目录 简介 时间分类 Timestamp DatetimeIndex date_range 和 bdate_range origin 格式化 Period DateOffset 作为index 切片和 ...

  4. SpringIOC 理论推导

    IOC理论实现 UserDao接口 public interface UserDao { void say(); } UserDaoImpl实现类 public class UserDaoImpl i ...

  5. Java JDK的下载与安装!Java基础

    在了解什么是Java.Java 语言的特点以及学习方法之后,本节将介绍如何搭建编写 Java 程序所需要的开发环境--JDK,只有搭建了环境才能敲代码! 学Java的都知道,JDK 是一种用于构建在 ...

  6. LinkedList-常用方法以及双向链表的理解

    链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两 ...

  7. Java(10)认识类和对象

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

  8. Java:并发笔记-04

    Java:并发笔记-04 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 本章内容-3 线程状态转换 活跃性 Lock 3.10 重新理解线程状态转换 假设有线 ...

  9. gson中TypeAdapter实现自定义序列化操作

    最近在项目中遇到这么一个问题,我们后台需要向前端返回一个 json 数据,就是将一个地理位置对象以json的格式返回到前台,但是这个地理位置对象中的经纬度是Double数据类型,项目中规定,如果经纬度 ...

  10. Redis核心原理与实践--Redis启动过程源码分析

    Redis服务器负责接收处理用户请求,为用户提供服务. Redis服务器的启动命令格式如下: redis-server [ configfile ] [ options ] configfile参数指 ...