题目链接:网络管理

  好久没写这种类型的题了……手都生了……

  一句话题意:树上带修改的路径\(k\)大数。这题面怎么有点眼熟

  显然树上的题目我们可以先在序列上考虑一下。区间带修改的区间\(k\)大数有两种做法(我只知道两种):一种是树套树,一种是整体二分。这道题感觉如果是树套树的话加到树上会很麻烦,于是就写了整体二分。(不过感觉好像CDQ分治啊

  序列问题和普通的整体二分没有什么区别,只是要注意一个修改操作需要拆成两个,一个操作是把原来的数删掉,下一个才是改为这个数。这样的话就可以保证一个元素的加入和删除永远会在分治时分进同一边,这样才可以保证正确性。到了树上,我们可以令$a_i$表示点$i$到根的路径上的权值,于是就可以求出$dfs$序后使用树状数组很方便的进行维护了。需要区间修改和单点查询,将原数组查分一下用树状数组维护即可。我会和你们说这道板子题我调了整整一天吗

  原谅我这篇博客不讲整体二分的入门

  入门的话我给附一个神犇lightgod的博客

  下面贴代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 80010
#define maxm 150010 using namespace std;
typedef long long llg; struct data{
int k,a,b,id,g;//-1表示减,0表示加
}s[maxm],zl[maxm],zr[maxm];
int n,m,le[maxn],ri[maxn],ls,d[maxm],ld,a[maxn];
int head[maxn],next[maxn<<1],to[maxn<<1],tt;
int fa[maxn],siz[maxn],top[maxn],son[maxn],dep[maxn];
int c[maxn],ans[maxn]; int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} void link(int x,int y){
to[++tt]=y;next[tt]=head[x];head[x]=tt;
to[++tt]=x;next[tt]=head[y];head[y]=tt;
} void dfs(int u){
siz[u]=1; le[u]=++tt;
for(int i=head[u],v;v=to[i],i;i=next[i])
if(v!=fa[u]){
fa[v]=u; dfs(v); siz[u]+=siz[v];
if(siz[v]>siz[son[u]]) son[u]=v;
}
ri[u]=tt;
} void dfs(int u,int t){
top[u]=t; dep[u]=dep[fa[u]]+1;
if(son[u]) dfs(son[u],t);
for(int i=head[u],v;v=to[i],i;i=next[i])
if(!top[v]) dfs(v,v);
} void add(int x,int y){while(x<=n) c[x]+=y,x+=x&(-x);}
int sum(int x){
int t=0;
while(x) t+=c[x],x-=x&(-x);
return t;
} void solve(int top,int end,int l,int r){
if(l==r){
for(int i=top;i<=end;i++)
if(s[i].id) ans[s[i].id]=d[l];
return;
}
int mid=(l+r+1)>>1,lo(0),ro(0);
bool ll(0),rr(0);
for(int i=top,u,x;i<=end;i++){
if(s[i].k<=0){
if(s[i].b>=d[mid]){
u=s[i].a; zr[++ro]=s[i];
if(!s[i].k) add(le[u],1),add(ri[u]+1,-1);
else add(le[u],-1),add(ri[u]+1,1);
}
else zl[++lo]=s[i];
}
else{
x=sum(le[s[i].a])+sum(le[s[i].b]);
x-=sum(le[s[i].g])+sum(le[fa[s[i].g]]);
if(x>=s[i].k) zr[++ro]=s[i],rr=1;
else s[i].k-=x,zl[++lo]=s[i],ll=1;
}
}
for(int i=top,u;i<=end;i++)
if(s[i].k<=0 && s[i].b>=d[mid]){
u=s[i].a;
if(!s[i].k) add(le[u],-1),add(ri[u]+1,1);
else add(le[u],1),add(ri[u]+1,-1);
}
for(int i=1;i<=lo;i++) s[i+top-1]=zl[i];
for(int i=1;i<=ro;i++) s[i+top+lo-1]=zr[i];
if(ll) solve(top,top+lo-1,l,mid-1);
if(rr) solve(top+lo,end,mid,r);
} int lca(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
u=fa[top[u]];
}
if(dep[u]<dep[v]) swap(u,v);
return v;
} int main(){
File("a");
n=getint(); m=getint(); ls=n;
for(int i=1;i<=n;i++){
s[i].k=0,s[i].a=i,s[i].b=getint();
d[++ld]=a[i]=s[i].b;
}
for(int i=1;i<n;i++) link(getint(),getint());
tt=0; dfs(1); dfs(1,1); tt=0;
for(int i=1;i<=m;i++){
s[++ls].k=getint(); s[ls].a=getint(); s[ls].b=getint();
if(s[ls].k){
s[ls].id=++tt; s[ls].g=lca(s[ls].a,s[ls].b);
if(dep[s[ls].a]+dep[s[ls].b]-2*dep[s[ls].g]+1<s[ls].k)
ans[tt]=-1,s[ls].id=0,ls--;
}
else{
ls++; s[ls]=s[ls-1]; s[ls-1].k=-1;
s[ls-1].b=a[s[ls].a]; a[s[ls].a]=s[ls].b;
d[++ld]=s[ls].b;
}
}
sort(d+1,d+ld+1); ld=unique(d+1,d+ld+1)-d-1;
solve(1,ls,1,ld);
for(int i=1;i<=tt;i++)
if(ans[i]==-1) printf("invalid request!\n");
else printf("%d\n",ans[i]);
return 0;
}

codevs 1490 【CTSC2008】 网络管理的更多相关文章

  1. BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3522  Solved: 1041[Submi ...

  2. [BZOJ1146][CTSC2008]网络管理Network

    [BZOJ1146][CTSC2008]网络管理Network 试题描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建 ...

  3. BZOJ 1146: [CTSC2008]网络管理Network 树链剖分+线段树+平衡树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 870  Solved: 299[Submit] ...

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

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

  5. Luogu4175:[CTSC2008]网络管理Network

    题面 Luogu4175:[CTSC2008]网络管理Network Sol 路径第\(k\)大 无解直接判断就好了 然后整体二分,加上树链剖分+树状数组统计 # include <bits/s ...

  6. BZOJ_1146_[CTSC2008]网络管理Network_主席树+树状数组

    BZOJ_1146_[CTSC2008]网络管理Network_主席树 Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门 ...

  7. 【LG4175】[CTSC2008]网络管理

    [LG4175][CTSC2008]网络管理 题面 洛谷 题解 感觉就和普通的整体二分差不太多啊... 树上修改就按时间添加,用树状数组维护一下即可 代码 #include<iostream&g ...

  8. 洛谷 P4175 [CTSC2008]网络管理 解题报告

    P4175 [CTSC2008]网络管理 题目描述 带修改树上链的第\(k\)大 输入输出格式 输入格式: 第一行为两个整数\(N\)和\(Q\),分别表示路由器总数和询问的总数. 第二行有\(N\) ...

  9. 【BZOJ1146】[CTSC2008]网络管理Network 树状数组+DFS序+主席树

    [BZOJ1146][CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工 ...

  10. 洛谷P4175 - [CTSC2008]网络管理

    Portal Description 给出一棵\(n(n\leq8\times10^4)\)个点的带点权的树,进行\(m(m\leq8\times10^4)\)次操作,操作有两种: 修改一个点的点权. ...

随机推荐

  1. Python爬虫小白入门(一)写在前面

    一.前言 你是不是在为想收集数据而不知道如何收集而着急? 你是不是在为想学习爬虫而找不到一个专门为小白写的教程而烦恼? Bingo! 你没有看错,这就是专门面向小白学习爬虫而写的!我会采用实例的方式, ...

  2. 自己手写的自动完成js类

    在web开发中,为了提高用户体验,会经常用到输入框的自动完成功能,不仅帮助用户进行快速输入,最重要的是帮助那些“记不全要输入什么”的用户进行选择.这个功能有很多插件已经实现了,为了适应项目的特殊需求, ...

  3. Oracle 中的操作符

    1.union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序: SELECT * FROM emp WHERE sal < UNION SELECT * FROM emp WH ...

  4. javascript性能优化:创建javascript无阻塞脚本

    javaScript 在浏览器中的运行性能,在web2.0时代显得尤为重要,成千上万行javaScript代码无疑会成为性能杀手, 在较低版本的浏览器执行JavaScript代码的时候,由于浏览器只使 ...

  5. C++ STL简述

    前言 最近要找工作,免不得要有一番笔试,今年好像突然就都流行在线笔试了,真是搞的我一塌糊涂.有的公司呢,不支持Python,Java我也不会,C有些数据结构又有些复杂,所以是时候把STL再看一遍了-不 ...

  6. java web学习总结(二十三) -------------------编写自己的JDBC框架

    一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...

  7. GJM : Unity3D HIAR -【 快速入门 】 八、开发云识别应用

    开发云识别应用 为了解决识别图片数量限制,以及上线应用不能动态修改识别图片和 AR 内容的问题,我们在 HiAR SDK for Unity 新版本(v1.1.x 及后续版本)中集成了云识别功能.本文 ...

  8. 4.6 .net core依赖注入的封装

    现在流行的系统一般都采用依赖注入的实现方式,利用DI容器来直接获取所用到的类/接口的实例..net core也一样采用DI的方式,提供了DI容器的接口IServiceCollection,并提供了基于 ...

  9. 16款最佳的 jQuery Time Picker 时间选择插件

    jQuery 插件可以为你做许多事情,你可以很容易地把这些插件集成到您的网站.网络上的 jQuery 日期选择器和日历插件很多,但找不到很满意的时间选择器插件. 在这里,我们收集了最好的一组 jQue ...

  10. 利用CSS背景颜色属性使父级div背景透明同时避免子级标签透明。

    实现背景色透明效果的代码 实现各个浏览器中具备良好的透明特性的效果,IE中使用私有滤镜filter,高端浏览器使用CSS3中的rgba属性. 输入十六进制的颜色值以及透明度,自动在IE的过渡滤镜以及C ...