BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. 时间复杂度O(N*log^3(N))

----------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<cctype>
#include<iostream>
#include<algorithm>
using namespace std;
#define h(v) (lower_bound(H, H + n, v) - H + 1)
const int maxn = 80009;
inline int read() {
char c = getchar();
for(; !isdigit(c); c = getchar());
int ret = 0;
for(; isdigit(c); c = getchar())
ret = ret * 10 + c - '0';
return ret;
}
int N, Q, w[maxn], seq[maxn], H[maxn << 1], n;
int top[maxn], fa[maxn], sz[maxn], ch[maxn], dep[maxn], Top;
int Id[maxn], Idn;
struct edge {
int to;
edge* next;
} E[maxn << 1], *Pt = E, *head[maxn];
inline void AddEdge(int u, int v) {
Pt->to = v;
Pt->next = head[u];
head[u] = Pt++;
}
struct O {
int t, a, b;
inline void Read() {
t = read(), a = read() - 1, b = read();
if(t) b--;
}
} o[maxn];
void Init() {
N = read(), Q = read();
for(n = 0; n < N; n++)
H[n] = w[n] = read();
for(int i = 1; i < N; i++) {
int u = read() - 1, v = read() - 1;
AddEdge(u, v);
AddEdge(v, u);
}
for(int i = 0; i < Q; i++) {
o[i].Read();
if(!o[i].t)
H[n++] = o[i].b;
}
sort(H, H + n);
n = unique(H, H + n) - H;
}
struct Node {
Node *lc, *rc;
int v;
Node() : v(0) {
}
} pool[5000000], *pt, *Null, *Root[maxn], *V[maxn];
void Init_sgt() {
pt = pool;
Null = pt++;
Null->lc = Null->rc = Null;
Null->v = 0;
}
int Pos, Val;
Node* Modify(Node* t, int l, int r) {
if(t->v + Val == 0)
return Null;
if(t->v == Val) { 
if(l == r) return t;
int m = (l + r) >> 1;
if(Pos <= m) {
t->lc = Modify(t->lc, l, m);
t->rc = Null;
} else {
t->lc = Null;
t->rc = Modify(t->rc, m + 1, r);
}
return t;
} else {
Node* o = pt++;
o->v = t->v + Val;
int m = (l + r) >> 1;
if(Pos <= m) {
o->lc = Modify(t->lc, l, m);
o->rc = t->rc;
} else {
o->lc = t->lc;
o->rc = Modify(t->rc, m + 1, r);
}
return o;
}
}
Node* Add(Node* t, int l, int r) {
Node* o = pt++;
o->v = t->v + Val;
if(l != r) {
int m = (l + r) >> 1;
if(Pos <= m) {
o->lc = Add(t->lc, l, m);
o->rc = t->rc;
} else {
o->lc = t->lc;
o->rc = Add(t->rc, m + 1, r);
}
}
return o;
}
void DFS(int x) {
sz[x] = 1;
ch[x] = -1;
for(edge* e = head[x]; e; e = e->next) if(e->to != fa[x]) {
dep[e->to] = dep[x] + 1;
fa[e->to] = x;
DFS(e->to);
sz[x] += sz[e->to];
if(ch[x] == -1 || sz[ch[x]] < sz[e->to])
ch[x] = e->to;
}
}
void dfs(int x) {
seq[Id[x] = ++Idn] = x;
top[x] = Top;
if(~ch[x]) dfs(ch[x]);
for(edge* e = head[x]; e; e = e->next)
if(e->to != fa[x] && e->to != ch[x]) dfs(Top = e->to);
}
void Init_slpf() {
fa[0] = -1;
dep[0] = 0;
DFS(0);
Idn = 0;
dfs(0);
}
void Build() {
Init_sgt();
Root[0] = V[0] = Null;
Val = 1;
for(int i = 1; i <= N; i++) {
Pos = h(w[seq[i]]);
Root[i] = Add(Root[i - 1], 1, n);
V[i] = Null;
}
}
Node *L[500], *R[500];
void Work() {
int Ln, Rn;
for(int i = 0; i < Q; i++) {
if(o[i].t) {
int x = o[i].a, y = o[i].b, size = 0;
Ln = Rn = 0;
for(; top[x] != top[y]; x = fa[top[x]]) {
if(dep[top[x]] < dep[top[y]]) swap(x, y);
size += dep[x] - dep[top[x]] + 1;
L[Ln++] = Root[Id[top[x]] - 1];
R[Rn++] = Root[Id[x]];
for(int l = Id[top[x]] - 1; l; l -= l & -l)
L[Ln++] = V[l];
for(int r = Id[x]; r; r -= r & -r)
R[Rn++] = V[r];
}
if(dep[x] > dep[y]) swap(x, y);
size += dep[y] - dep[x] + 1;
L[Ln++] = Root[Id[x] - 1];
R[Rn++] = Root[Id[y]];
for(int l = Id[x] - 1; l; l -= l & -l)
L[Ln++] = V[l];
for(int r = Id[y]; r; r -= r & -r)
R[Rn++] = V[r];
if(size < o[i].t) {
puts("invalid request!");
continue;
} else 
o[i].t = size - o[i].t + 1;
int l = 1, r = n;
while(l < r) {
int m = (l + r) >> 1, cnt = 0;
for(int j = 0; j < Ln; j++)
cnt -= L[j]->lc->v;
for(int j = 0; j < Rn; j++)
cnt += R[j]->lc->v;
if(cnt >= o[i].t) {
for(int j = 0; j < Ln; j++)
L[j] = L[j]->lc;
for(int j = 0; j < Rn; j++)
R[j] = R[j]->lc;
r = m;
} else {
o[i].t -= cnt;
for(int j = 0; j < Ln; j++)
L[j] = L[j]->rc;
for(int j = 0; j < Rn; j++)
R[j] = R[j]->rc;
l = m + 1;
}
}
printf("%d\n", H[l - 1]);
} else {
Pos = h(w[seq[Id[o[i].a]]]), Val = -1;
for(int x = Id[o[i].a]; x <= N; x += x & -x)
V[x] = Add(V[x], 1, n);
Pos = h(w[seq[Id[o[i].a]]] = o[i].b), Val = 1;
for(int x = Id[o[i].a]; x <= N; x += x & -x)
V[x] = Add(V[x], 1, n);
}
}
}
int main() {
Init();
Init_slpf();
Build();
Work();
return 0;
}

 

----------------------------------------------------------------------------

1146: [CTSC2008]网络管理Network

Time Limit: 50 Sec  Memory Limit: 162 MB
Submit: 2943  Solved: 859
[Submit][Status][Discuss]

Description

M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门。为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络。该网络的结构由N个路由器和N-1条高速光缆组成。每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信子网与其他部门进行通信联络。该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路径以进行通信。 高速光缆的数据传输速度非常快,以至于利用光缆传输的延迟时间可以忽略。但是由于路由器老化,在这些路由器上进行数据交换会带来很大的延迟。而两个路由器之间的通信延迟时间则与这两个路由器通信路径上所有路由器中最大的交换延迟时间有关。作为M公司网络部门的一名实习员工,现在要求你编写一个简单的程序来监视公司的网络状况。该程序能够随时更新网络状况的变化信息(路由器数据交换延迟时间的变化),并且根据询问给出两个路由器通信路径上延迟第k大的路由器的延迟时间。【任务】 你的程序从输入文件中读入N个路由器和N-1条光缆的连接信息,每个路由器初始的数据交换延迟时间Ti,以及Q条询问(或状态改变)的信息。并依次处理这Q条询问信息,它们可能是: 1. 由于更新了设备,或者设备出现新的故障,使得某个路由器的数据交换延迟时间发生了变化。 2. 查询某两个路由器a和b之间的路径上延迟第k大的路由器的延迟时间。

Input

第一行为两个整数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,此时路径上只有一个路由器。

Output

对于每一个第二种询问(k>0),输出一行。包含一个整数为相应的延迟时间。如果路径上的路由器不足k个,则输出信息“invalid request!”(全部小写不包含引号,两个单词之间有一个空格)。

Sample Input

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

Sample Output

3
2
2
invalid request!

HINT

10% 测试数据满足N<=8000,Q<=3000,

40% 测试数据满足所有询问中1<=K<=5 。即路由器的延迟时间不会发生变化。

100% 测试数据满足N,Q<=80000,任意一个路由器在任何时刻都满足延迟时间小于10^8。对于所有询问满足0<=K<=N 。

Source

 

转载于:https://www.cnblogs.com/JSZX11556/p/5128213.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

标准RTSP 消息的错误代码

From: http://blog.csdn.net/ameyume/article/details/7441060 标准RTSP消息的错误代码–在应答消息的第一行表示 ”100” ; Continue (all 100 range) “110”; Connect Timeout “200” ; OK ”201” ; Created ”250” ; Low on Storage Space ”300” ; Multiple Choic…

[react-router] React-Router怎么设置重定向?

[react-router] React-Router怎么设置重定向&#xff1f; 采用 Redirect 进行重定向 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

struts2遍历select

2019独角兽企业重金招聘Python工程师标准>>> <s:bean name"org.apache.struts2.util.Counter" id"counter"> <s:param name"first" value"1" /> <s:param name"last" value"pageCount"…

[建议]我对软工有话说(上)

我对软工有话说 经历了一学期的软件工程课程实践&#xff0c;先给个自己在这门课中学到的东西打个分&#xff1a; 编码能力&#xff1a;★★★代码质量&#xff1a;★★★★团队管理&#xff1a;★★★★★风险控制&#xff1a;★★★★解决问题的能力&#xff1a;★★★★★下…

[react-router] React-Router的路由有几种模式?

[react-router] React-Router的路由有几种模式&#xff1f; 1、BrowserRouter&#xff1a;浏览器的路由方式&#xff0c;也就是在开发中最常使用的路由方式 2、HashRouter&#xff1a;在路径前加入#号成为一个哈希值&#xff0c;Hash模式的好处是&#xff0c;再也不会因为我们…

Spring MVC X-Frame-Options

https://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html#headers-frame-options 转载于:https://www.cnblogs.com/heshuai/p/5132141.html

[react] react组件间的通信有哪些?

[react] react组件间的通信有哪些&#xff1f; PropsContextref&#xff1a;通过Ref获取组建的实例&#xff0c;在通过实例拿到组件的属性值或者方法的回调 第三方的&#xff0c;Redux是基于Conext基础上的库&#xff0c;Mobx这是依赖收集&#xff0c;EventBus是发布订阅模式&…

Fedora开机自动登录指定用户(root或普通用户)

From: http://www.360doc.com/content/12/0709/11/6828497_223143657.shtml 2010-07-19 12:53:04| 分类&#xff1a;Linux学习 | 标签&#xff1a;|字号大中小 订阅 自从Fedora 10开始&#xff0c;以后版本默认均无法在GUI下界面以root账号登录。其实这个设计是比较好的&…

android中心类库

android开发过程中总会用到各种各样的类库&#xff0c;也即jar包&#xff0c;以下地址可以满足您的需求 地址&#xff1a;http://search.maven.org/转载于:https://www.cnblogs.com/kangweifeng/p/5133233.html

[react-router] 在history模式中push和replace有什么区别?

[react-router] 在history模式中push和replace有什么区别&#xff1f; push()&#xff1a;添加一个新的记录到历史堆栈, history.length1。&#xff08;一般会用来跳转到一个新页面, 用户点击浏览器的回退按钮可以回到之前的路径。&#xff09; replace()&#xff1a;替换掉当…

Web安全开发注意事项

1.sql注入&#xff1a;这个很常规了&#xff0c;不要拼字符串以及过滤关键字都可以防住&#xff0c;需要注意的是&#xff0c;Cookie提交的参数也是可以导致注入漏洞的。 2.旁注&#xff1a;就是说在保证自己的程序没问题的同时&#xff0c;也要保证同台服务器的其他站点没问题…

[react-router] React-Router 4怎样在路由变化时重新渲染同一个组件?

[react-router] React-Router 4怎样在路由变化时重新渲染同一个组件&#xff1f; 1.在同一个组件添加不同的key,以下重新封装了组件&#xff1a; export default function (props) {return (<组件 {...props} key{search参数} />) }2.但是不知道在路由跳转的地方加入ke…

Oracle 彻底 kill session

为什么80%的码农都做不了架构师&#xff1f;>>> --*************************** -- Oracle 彻底 kill session --*************************** kill session 是DBA经常碰到的事情之一。如果kill 掉了不该kill 的session&#xff0c;则具有破坏性&#xff0c;因此尽…

消灭编译警告(Warning)

From: http://blog.csdn.net/liuysheng/article/details/7165143 如何看待编译警告 当编译程序发现程序中某个地方有疑问&#xff0c;可能有问题时就会给出一个警告信息。警告信息可能意味着程序中隐含的大错误&#xff0c;也可能确实没有问题。对于警告的正确处理方式应该…

[react-router] React-Router 3和React-Router 4有什么变化?添加了什么好的特性?

[react] React-Router 3和React-Router 4有什么变化&#xff1f;添加了什么好的特性&#xff1f; React-Router 4 从设计思想上进行改变&#xff0c;引入动态路由&#xff0c;将路由进行了拆分&#xff0c;将其放到了各自的模块中&#xff0c;不再有单独的 router 模块&#x…

WebService学习总结——调用第三方提供的webService服务

互联网上面有很多的免费webService服务&#xff0c;我们可以调用这些免费的WebService服务&#xff0c;将一些其他网站的内容信息集成到我们的Web应用中显示&#xff0c;下面就以获取天气预报数据。气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server)…

【017】◀▶ C#学习(九) - ADO.NET

《C#入门经典&#xff08;中文第四版&#xff09;》在程序中访问数据库学习笔记 --------------------------------------------------------------------------------------------------------- ●● 目录&#xff1a; A0 ………… System.Data.SqlClient 命名空间 A1 ……………

[react] 浏览器为什么无法直接JSX?怎么解决呢?

[react] 浏览器为什么无法直接JSX&#xff1f;怎么解决呢&#xff1f; 因为浏览器只能解决原生的JS代码&#xff0c;jsx不属于原生的js&#xff0c;它是类似于html的语法&#xff0c;然后转化成一个js对象。 这个转化的过程就是通过Babel的babel/plugin-transform-react-jsx插…

vim 基础学习之文件跳转

1. -当前文件上次跳转之前的位置2. .-当前文件上次修改的位置,只要是发生了可能导致变化的命令操作就会被标记&#xff0c;哪怕实际结果没有变化3. ^-当前文件上次插入的位置,只要是发生了插入操作命令就会被标记&#xff0c;哪怕实际结果没有变化4. [-当前文件上次修改或者复制…

[react] react声明组件有哪几种方法,各有什么不同?

[react] react声明组件有哪几种方法&#xff0c;各有什么不同&#xff1f; 1、无状态组件 2、有状态组件 3、高阶组件 4、容器组件 5、回调组件 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目…