[bzoj1146]网络管理
发现是链上的问题,所以树链剖分
发现要查询第k大,因为第k大不支持合并,所以要二分答案
二分答案后相当于询问一些区间内大于某数的数个数,直接线段树套平衡树即可
时间复杂度$o(nlog^{4}_n)$(跟$o(n^{2})$有什么区别)可以卡过
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 #define s(p) ch[k][p]
8 struct ji{
9 int nex,to;
10 }edge[N<<1];
11 int E,n,m,p,x,y,head[N],a[N],fa[N],sh[N],top[N],ma[N],id[N];
12 int V,ro[N<<2],sz[N*50],sum[N*50],ra[N*50],v[N*50],ch[N*50][2];
13 void add_edge(int x,int y){
14 edge[E].nex=head[x];
15 edge[E].to=y;
16 head[x]=E++;
17 }
18 void up(int k){
19 sz[k]=sz[s(0)]+sz[s(1)]+sum[k];
20 }
21 void rotate(int &k,int x,int p){
22 s(p)=ch[x][p^1];
23 ch[x][p^1]=k;
24 up(k);
25 up(k=x);
26 }
27 void add(int &k,int x){
28 if (!k){
29 v[k=++V]=x;
30 ra[k]=rand();
31 sz[k]=0;
32 }
33 sz[k]++;
34 if (v[k]==x){
35 sum[k]++;
36 return;
37 }
38 bool p=(v[k]<x);
39 add(s(p),x);
40 if (ra[k]>ra[s(p)])rotate(k,s(p),p);
41 }
42 void del(int &k,int x){
43 sz[k]--;
44 if (v[k]==x){
45 if (--sum[k])return;
46 sum[k]++;
47 if (s(0)*s(1)==0)k=s(0)+s(1);
48 else{
49 bool p=(ra[s(0)]>ra[s(1)]);
50 rotate(k,s(p),p);
51 del(k,x);
52 }
53 return;
54 }
55 del(s(v[k]<x),x);
56 }
57 int query(int k,int x){
58 if (!k)return 0;
59 if (v[k]==x)return sum[k]+sz[s(1)];
60 bool p=(v[k]<x);
61 return query(s(p),x)+(p^1)*(sum[k]+sz[s(1)]);
62 }
63 void update(int k,int l,int r,int x,int y,int z){
64 if (y!=-1)del(ro[k],y);
65 add(ro[k],z);
66 if (l==r)return;
67 if (x<=mid)update(L,l,mid,x,y,z);
68 else update(R,mid+1,r,x,y,z);
69 }
70 int query(int k,int l,int r,int x,int y,int z){
71 if ((l>y)||(x>r))return 0;
72 if ((x<=l)&&(r<=y))return query(ro[k],z);
73 return query(L,l,mid,x,y,z)+query(R,mid+1,r,x,y,z);
74 }
75 void dfs(int k,int f,int s){
76 fa[k]=f;
77 sh[k]=s;
78 sz[k]=1;
79 for(int i=head[k];i!=-1;i=edge[i].nex)
80 if (edge[i].to!=f){
81 dfs(edge[i].to,k,s+1);
82 sz[k]+=sz[edge[i].to];
83 if (sz[ma[k]]<sz[edge[i].to])ma[k]=edge[i].to;
84 }
85 }
86 void dfs2(int k,int t){
87 top[k]=t;
88 id[k]=++x;
89 update(1,1,n,x,-1,a[k]);
90 if (ma[k])dfs2(ma[k],t);
91 for(int i=head[k];i!=-1;i=edge[i].nex)
92 if ((edge[i].to!=fa[k])&&(edge[i].to!=ma[k]))dfs2(edge[i].to,edge[i].to);
93 }
94 int query(int x,int y,int z){
95 int ans=0;
96 while (top[x]!=top[y]){
97 if (sh[top[x]]<sh[top[y]])swap(x,y);
98 ans+=query(1,1,n,id[top[x]],id[x],z);
99 x=fa[top[x]];
100 }
101 if (id[x]>id[y])swap(x,y);
102 return ans+query(1,1,n,id[x],id[y],z);
103 }
104 int find(){
105 int l=0,r=100000000;
106 while (l<r){
107 int m=(l+r+1>>1);
108 if (query(x,y,m)>=p)l=m;
109 else r=m-1;
110 }
111 return l;
112 }
113 int main(){
114 srand(time(0));
115 scanf("%d%d",&n,&m);
116 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
117 memset(head,-1,sizeof(head));
118 for(int i=1;i<n;i++){
119 scanf("%d%d",&x,&y);
120 add_edge(x,y);
121 add_edge(y,x);
122 }
123 dfs(1,0,0);
124 x=0;
125 dfs2(1,1);
126 for(int i=1;i<=m;i++){
127 scanf("%d%d%d",&p,&x,&y);
128 if (!p){
129 update(1,1,n,id[x],a[x],y);
130 a[x]=y;
131 continue;
132 }
133 if (query(x,y,0)<p)printf("invalid request!\n");
134 else printf("%d\n",find());
135 }
136 }
[bzoj1146]网络管理的更多相关文章
- [BZOJ1146][CTSC2008]网络管理Network
[BZOJ1146][CTSC2008]网络管理Network 试题描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建 ...
- 【BZOJ1146】网络管理(整体二分)
[BZOJ1146]网络管理(整体二分) 题面 良心洛谷,有BZOJ权限题 题解 要看树套树的戳这里 毕竟是:智商不够数据结构来补 所以, 我们来当一回智商够的选手 听说主席树的题目大部分都可以整体二 ...
- 【BZOJ1146】网络管理(主席树,树状数组)
[BZOJ1146]网络管理(主席树,树状数组) 题面 BZOJ权限题,洛谷题面 题解 树上带修改主席树 貌似和\(Count\ On\ A\ Tree\)那题很相似呀 只需要套上一个树状数组来维护修 ...
- 【BZOJ1146】[CTSC2008]网络管理Network 树状数组+DFS序+主席树
[BZOJ1146][CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工 ...
- 【BZOJ-1146】网络管理Network DFS序 + 带修主席树
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3495 Solved: 1032[Submi ...
- BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链 ...
- 【BZOJ1146】【CTSC2008】网络管理 [整体二分]
网络管理 Time Limit: 50 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description M公司是一个非常庞大的跨国公司,在 ...
- [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)
题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...
- BZOJ1146——[CTSC2008]网络管理Network
1.题目大意:就是在动态的树上路径权值第k大. 2.分析:这个就是树链剖分+树套树 #include <cstdio> #include <cstdlib> #include ...
随机推荐
- 视频需求超平常数 10 倍,却节省了 60% 的 IT 成本投入是一种什么样的体验?
作者 | 山猎 近年来,Serverless 一直在高速发展,并呈现出越来越大的影响力.主流的云服务商也在不断地丰富云产品体系,提供更好的开发工具,更高效的应用交付流水线,更好的可观测性,更细腻的产品 ...
- 霍尔效应实验 execl数据处理
execl 函数 =POWER() /*幂次*/ =ROUND() /*保留小数点后几位*/ =SQRT() /*开平方根*/ =POWER( x, 1/3 ) /*开立方根*/ =COUNTA() ...
- 使用YApi搭建API接口管理工具(docker安装)
使用YApi搭建API接口管理工具(docker安装) 工具描述 YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布 ...
- Unity 3D手游对不同分辨率屏幕的UI自适应
目前安卓手机的屏幕大小各异,没有统一的标准,因此用Unity 3D制作的手游需要做好对不同分辨率屏幕的UI自适应,否则就会出现UI大小不一和位置错位等问题. 我们的项目在开发时的参照分辨率(Refer ...
- BUAA 2020 软件工程 个人博客作业
BUAA 2020 软件工程 个人博客作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 ...
- 洛谷 P2252 [SHOI2002]取石子游戏|【模板】威佐夫博弈
链接: P2252 [SHOI2002]取石子游戏|[模板]威佐夫博弈 前言: 第一眼大水题,第二眼努力思考,第 N 眼我是大水逼. 题意: 不看题目标题都应该能看出来是取石子类的博弈论. 有两堆石子 ...
- CentOS8 部署 MySQL8
前言 有来项目的数据库在此之前使用的是 Docker 部署的,具体可见文章 Docker 安装 MySQL8 ,服务器是阿里云 2C2G 的ECS轻量服务器,可能是配置问题有时不论查什么都要等很长很长 ...
- 链表中倒数第K个结点 牛客网 剑指Offer
链表中倒数第K个结点 牛客网 剑指Offer 题目描述 输入一个链表,输出该链表中倒数第k个结点. # class ListNode: # def __init__(self, x): # self. ...
- WPF进阶技巧和实战03-控件(3-文本控件及列表控件)
系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实 ...
- 一、安装zabbix监控(源码编方式)
首先介绍一下zabbix的运行原理和运行条件. Zabbix监控原理 Zabbix 通过C/S 模式采集数据,通过B/S模式在web 端展示和配置. 被监控端:主机通过安装agent 方式采集数据, ...