CODEVS1490 [CTSC2008]网络管理
M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门。为了让分布在世界各地的N个部门之间 协同工作,公司搭建了一个连接整个公司的通信网络。该网络的结构由N个路由器和N-1条高速光缆组成。每个部门都有一个专属的路由器,部门局域网内的所有 机器都联向这个路由器,然后再通过这个通信子网与其他部门进行通信联络。该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路径以进行通信。
高速光缆的数据传输速度非常快,以至于利用光缆传输的延迟时间可以忽略。但是由于路由器老化,在这些路由器上进行数据交换会带来很大的延迟。而两 个路由器之间的通信延迟时间则与这两个路由器通信路径上所有路由器中最大的交换延迟时间有关。作为M公司网络部门的一名实习员工,现在要求你编写一个简单 的程序来监视公司的网络状况。该程序能够随时更新网络状况的变化信息(路由器数据交换延迟时间的变化),并且根据询问给出两个路由器通信路径上延迟第k大 的路由器的延迟时间。
你的程序从输入文件中读入N个路由器和N-1条光缆的连接信息,每个路由器初始的数据交换延迟时间Ti,以及Q条询问(或状态改变)的信息。并依次处理这Q条询问信息,它们可能是:
1. 由于更新了设备,或者设备出现新的故障,使得某个路由器的数据交换延迟时间发生了变化。
2. 查询某两个路由器a和b之间的路径上延迟第k大的路由器的延迟时间。
输入文件network.in中的第一行为两个整数N和Q,分别表示路由器总数和询问的总数。
第二行有N个整数,第i个数表示编号为i的路由器初始的数据延迟时间Ti。
紧接着N-1行,每行包含两个整数x和y。表示有一条光缆连接路由器x和路由器y。
紧接着是Q行,每行三个整数k、a、b。如果k=0,则表示路由器a的状态发生了变化,它的数据交换延迟时间由Ta变为b。如果k>0,则表示询问a到b的路径上所经过的所有路由器(包括a和b)中延迟第k大的路由器的延迟时间。注意a可以等于b,此时路径上只有一个路由器。
输出文件为network.out。对于每一个第二种询问(k>0),输出一行。包含一个整数为相应的延迟时间。如果路径上的路由器不足k个,则输出信息“invalid request!”(全部小写不包含引号,两个单词之间有一个空格)。
5 5
5 1 2 3 4
3 1
2 1
4 3
5 3
2 4 5
0 1 2
2 2 3
2 1 4
3 3 5
3
2
2
invalid request!
100% 测试数据满足 n<=80000,q<=30000 。任意一个路由器在任何时刻都满足延迟时间小于108。对于所有询问满足 。
40% 测试数据满足所有询问中1<=k<=5 ,且路由器的延迟时间不会发生变化。
10% 测试数据满足n,q<=8000 。
正解:带修改主席树
解题报告:谁能知道二分写多了,写线段树左儿子(l,mid-1)右儿子(mid+1,r)的痛。。。就是带修改主席树的板子,直接查询即可
1 #include <iostream> 2 #include <iomanip> 3 #include <algorithm> 4 #include <string> 5 #include <cstdlib> 6 #include <cstdio> 7 #include <cstring> 8 #include <cmath> 9 #include <vector> 10 #include <map> 11 #define MIN(a,b) a<b?a:b 12 #define RG register 13 const int N = 200000; 14 const int M = 15000000; 15 16 using namespace std; 17 18 map<int,int>Map; 19 20 int gi(){ 21 char ch=getchar();int x=0; 22 while(ch<'0' || ch>'9') ch=getchar(); 23 while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar(); 24 return x; 25 } 26 27 struct date{ 28 int i,t; 29 }t[N]; 30 31 int cnt,n,q,id[N],dis[N],son[N],top[N],fa[N],siz[N]; 32 int rt[N],ll[M],rr[M],tr[M],nn[N][2],head[N]; 33 int u[N],o; 34 vector<int>ls,lr; 35 36 void dfs1(int xh,int ff){ 37 fa[xh]=ff,dis[xh]=dis[ff]+1; 38 for (RG int i=head[xh]; i; i=nn[i][0]){ 39 if (nn[i][1]==ff) continue; 40 dfs1(nn[i][1],xh); 41 siz[xh]+=siz[nn[i][1]]; 42 if (siz[son[xh]]<siz[nn[i][1]]) 43 son[xh]=nn[i][1]; 44 } 45 siz[xh]=1; 46 return; 47 } 48 49 void dfs2(int xh,int tp){ 50 id[xh]=++cnt,top[xh]=tp; 51 if (son[xh]) dfs2(son[xh],tp); 52 for (RG int i=head[xh]; i; i=nn[i][0]){ 53 if (nn[i][1]==son[xh] || nn[i][1]==fa[xh]) continue; 54 dfs2(nn[i][1],nn[i][1]); 55 } 56 return; 57 } 58 59 int cmp(date a,date b){ 60 return a.i<b.i; 61 } 62 63 void down(int &xh,int w,int x,int l,int r){ 64 if (xh==0) xh=++cnt; 65 tr[xh]+=x; 66 if (l==r) return; 67 int mid=(l+r)>>1; 68 if (w<=mid) down(ll[xh],w,x,l,mid); 69 else down(rr[xh],w,x,mid+1,r); 70 return; 71 } 72 73 void update(int xh,int val,int x){ 74 while(xh<=n){ 75 down(rt[xh],val,x,1,o); 76 xh+=(xh&(-xh)); 77 } 78 return; 79 } 80 81 struct dete{ 82 int k,a,b; 83 }d[N]; 84 85 void push(int xh,int x){ 86 while(xh){ 87 if (x) lr.push_back(rt[xh]); 88 else ls.push_back(rt[xh]); 89 xh-=xh&(-xh); 90 } 91 return; 92 } 93 94 void lca(int l,int r){ 95 while(top[l]!=top[r]) 96 if (dis[top[l]]>dis[top[r]]){ 97 push(id[l],1),push(id[top[l]]-1,0); 98 l=fa[top[l]]; 99 } 100 else{ 101 push(id[r],1),push(id[top[r]]-1,0); 102 r=fa[top[r]]; 103 } 104 if (dis[l]<dis[r]) push(id[r],1),push(id[l]-1,0); 105 else push(id[l],1),push(id[r]-1,0); 106 return; 107 } 108 109 int query(int l,int r,int k){ 110 ls.clear(),lr.clear(); 111 lca(l,r); 112 int z=1,y=o,ans=1,la=ls.size(),lb=lr.size(); 113 int sa=0,sb=0,mid; 114 for (RG int i=0; i<la; ++i) sa+=tr[ls[i]]; 115 for (RG int i=0; i<lb; ++i) sb+=tr[lr[i]]; 116 if (sb-sa<k) return -1; 117 while(z<y){ 118 sa=0,sb=0,mid=(z+y)>>1; 119 for (RG int i=0; i<la; ++i) sa+=tr[rr[ls[i]]]; 120 for (RG int i=0; i<lb; ++i) sb+=tr[rr[lr[i]]]; 121 if (sb-sa>=k){ 122 z=mid+1;ans=mid+1; 123 for (RG int i=0; i<la; ++i) ls[i]=rr[ls[i]]; 124 for (RG int i=0; i<lb; ++i) lr[i]=rr[lr[i]]; 125 } 126 else{ 127 y=mid;k-=(sb-sa); 128 for (RG int i=0; i<la; ++i) ls[i]=ll[ls[i]]; 129 for (RG int i=0; i<lb; ++i) lr[i]=ll[lr[i]]; 130 } 131 } 132 ans=MIN(ans,o); 133 return ans; 134 } 135 136 int main(){ 137 n=gi(),q=gi(); 138 for (RG int i=1; i<=n; ++i) t[i]=(date){i,gi()},u[++o]=t[i].t; 139 for (RG int i=1; i<n ; ++i){ 140 RG int l=gi(),r=gi(); 141 nn[++cnt][1]=l,nn[cnt][0]=head[r],head[r]=cnt; 142 nn[++cnt][1]=r,nn[cnt][0]=head[l],head[l]=cnt; 143 } 144 cnt=0; 145 dfs1(1,0),dfs2(1,1); 146 for (RG int i=1; i<=q; ++i){ 147 d[i]=(dete){gi(),gi(),gi()}; 148 if (d[i].k==0) u[++o]=d[i].b; 149 } 150 sort(u+1,u+o+1); 151 int hh=unique(u+1,u+o+1)-u-1; 152 for (RG int i=1; i<=hh; ++i) Map[u[i]]=i; 153 for (RG int i=1; i<=n; ++i) t[i].i=id[t[i].i]; 154 cnt=0; 155 for (RG int i=1; i<=n; ++i){ 156 int uu=Map[t[i].t]; 157 update(t[i].i,uu,1); 158 } 159 for (RG int i=1; i<=q; ++i) 160 if (d[i].k){ 161 int ans=query(d[i].a,d[i].b,d[i].k); 162 if (ans<0) printf("invalid request!\n"); 163 else printf("%d\n",u[ans]); 164 } 165 else{ 166 int ss=Map[t[d[i].a].t],gg=Map[d[i].b]; 167 update(id[d[i].a],ss,-1); 168 update(id[d[i].a],gg,1); 169 t[d[i].a].t=d[i].b; 170 } 171 return 0; 172 }
转载于:https://www.cnblogs.com/cjk2001/p/6445284.html
CODEVS1490 [CTSC2008]网络管理相关推荐
- P4175 [CTSC2008]网络管理(整体二分)
P4175 [CTSC2008]网络管理 给定一棵有nnn个节点的树,点有点权,有两种操作:① 修改某个点的点权,② 查询两点路径间的点权第kkk大. 给定u,vu, vu,v,选定111号节点为根节 ...
- BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )
树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...
- 【bzoj1146】 [CTSC2008]网络管理Network【树链剖分+树套树+二分 线段树套Treap】
1146: [CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公 ...
- P4175 [CTSC2008]网络管理 (动态树上第k大)
题目链接: P4175 [CTSC2008]网络管理 大致题意 给定一棵有nnn个节点的树, 节点上有权值wiw_iwi. 有mmm次操作. 0 a b 表示把节点aaa的权值修改为bbb. 即: ...
- 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理
令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...
- bzoj 1146 [CTSC2008]网络管理Network
很久之前写过 count on the tree. 然后一直不懂树状数组是怎么套上这个主席树的. 看了两小时发现它套的就是个权值线段树, 看不出来可持久化在哪里. 因为动态开点所以空间nlog2n. ...
- BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...
- BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组
欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链 ...
- [CTSC2008]网络管理Network
传送门 Descroption 带修改求树上路径第k大 Solution 方法一:树状数组套主席树 出题人总是比较喜欢把序列的东西搬到树上去 但这并不影响我们做题,因为我们可以用一个log的时间将它变 ...
最新文章
- 搜索引擎学习资源收集
- Java面试题整理,连续四年百度Java岗必问面试题
- python for循环语句的用法
- linux 内核 ntfs,Linux大脑 内核 内核编译(NTFS)
- 使用SPEncode.HtmlEncodePreserverSpace保存输入
- EL调用java方法
- python xlutils教程_Python基于xlutils修改表格内容过程解析
- Javaweb maven项目tomcat报错: javax.naming.NamingException: 无法创建资源实例
- Ioc容器Autofac介绍
- 泛海精灵软件预发布统计报告 反馈
- java 空文件夹删除_java创建文件文件夹,删除空文件夹,删除文件夹以及所有文件...
- jmeter导入已有的脚本_jmeter 开发导入excel脚本
- matlab求均值和方差偏度峰度,均值、标准差、偏度、峰度的绘制
- mac电脑投屏到小米盒子_电脑投屏到小米盒子
- vue模板引擎_Vue.js模板引擎理解
- 关于破解邮箱的一点心得
- Android 图文数据JSON解析,金山词霸每日一句API的调用
- python实现C4.5
- 九州海上牧云记,电视剧节奏太慢?教你如何看全集
- 企业申请E-mark认证要检测些什么?
热门文章
- ionic 获取input的值
- str 类常用的函数
- 挑战 10 个最难回答的 Java 问题(附答案)
- 别吵吵,分布式锁也是锁
- 一文读懂什么是Java中的自动拆装箱
- 不是技术也能看懂容器技术与容器平台
- Android --- 动态获取定位权限时: Fragment 中 onRequestPermissionsResult 方法不执行
- 第十届蓝桥杯java B组—试题D 数的分解
- Java 中类的比较与排序方法(应用Comparable接口与Comparator接口)通俗易懂
- python中color的用法_python - 如何为热图(使用plt.pcolor创建)中的NaN单元分配特定的颜色或图案,并使其显示在颜色栏中(图colorbar) - 堆栈内存溢出...