[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 性能计数器 ...
随机推荐
- Cobar提出的一种在分库场景下对Order By / Limit 的优化
搜索关注微信公众号"捉虫大师",后端技术分享,架构设计.性能优化.源码阅读.问题排查.踩坑实践. 本文已收录 https://github.com/lkxiaolou/lkxiao ...
- 2020.12.14--Codeforces Round #104 (Div.2)补题
C - Lucky Conversion CodeForces - 146C Petya loves lucky numbers very much. Everybody knows that luc ...
- 微信小程序中路由跳转
一.是什么 微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能 在微信小程序中,每个页面可以看成是一个pageMo ...
- 什么,你还使用 webpack?别人都在用 vite 搭建项目了
一.vite 到底是干嘛的? vite 实际上就是一个面向现代浏览器,基于 ES module 实现了一个更轻快的项目构建打包工具. vite 是法语中轻快的意思. vite 的特点: 1.轻快的冷服 ...
- Java:泛型小记
Java:泛型小记 对 Java 中的 泛型类,做一个微不足道的小小小小记 泛型实现 概述 开篇: List<String> l1 = new ArrayList<String> ...
- 字符串与模式匹配算法(一):BF算法
一.BF算法的基本思想 BF(Brute Force)算法是模式匹配中最简单.最直观的算法.该算法最基本的思想是从主串的第 start 个字符起和模式P(要检索的子串)的第1个字符比较,如果相等,则逐 ...
- 到底能不能用 join
互联网上一直流传着各大公司的 MySQL 军规,其中关于 join 的描述,有些公司不推荐使用 join,而有些公司则规定有条件的使用 join, 它们都是教条式的规定,也没有详细说其中的原因,这就很 ...
- 看动画学算法之:双向队列dequeue
目录 简介 双向队列的实现 双向队列的数组实现 双向队列的动态数组实现 双向队列的链表实现 双向链表的时间复杂度 简介 dequeue指的是双向队列,可以分别从队列的头部插入和获取数据,也可以从队列的 ...
- K8S_Kubernetes
Google创造, K8S,是基于容器的集群管理平台, K8S集群 应用场景 微服务 这个集群主要包括两个部分 一个Master节点(主节点) 一群Node节点(计算节点) Master节 ...
- Luogu P2467 [SDOI2010]地精部落 | 神奇的dp
题目链接 DP 题目大意:给定一个数n,求1~n这n个整数的所有排列中有多少个波动数列,将这个数量%p后输出. 什么是波动数列呢?顾名思义,就是一个大.一个小.一个大.一个小--或者是一个小.一个大. ...