2215. [HNOI2016]网络

★★★☆   输入文件:network_tenderRun.in   输出文件:network_tenderRun.out   简单对比
时间限制:2 s   内存限制:128 MB

【题目描述】

【输入格式】

【输出格式】

【样例输入1】

13 23

1 2

1 3

2 4

2 5

3 6

3 7

4 8

4 9

6 10

6 11

7 12

7 13

2 1

0 8 13 3

0 9 12 5

2 9

2 8

2 2

0 10 12 1

2 2

1 3

2 7

2 1

0 9 5 6

2 4

2 5

1 7

0 9 12 4

0 10 5 7

2 1

2 4

2 12

1 2

2 5

2 3

【样例输出1】

-1

3

5

-1

1

-1

1

1

3

6

7

7

4

6

【提示】

  这道题是水题。

 #include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn=;
int n,Q,cnt,fir[maxn],nxt[maxn<<],to[maxn<<];
void addedge(int a,int b){
nxt[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;
} struct Data{
int ID,val;
Data(int id=,int V=){
ID=id;val=V;
}
bool operator <(const Data &a)const{
return val<a.val;
}
}; priority_queue<Data>Mx[maxn<<]; int dep[maxn],fa[maxn],sz[maxn],son[maxn];
bool del[maxn]; void DFS(int x){
sz[x]=;
for(int i=fir[x];i;i=nxt[i])
if(to[i]!=fa[x]){
fa[to[i]]=x;
dep[to[i]]=dep[x]+;
DFS(to[i]);
sz[x]+=sz[to[i]];
if(sz[son[x]]<sz[to[i]])
son[x]=to[i];
}
} int tot,ID[maxn],top[maxn]; void DFS(int x,int tp){
ID[x]=++tot;top[x]=tp;
if(son[x])DFS(son[x],tp);
for(int i=fir[x];i;i=nxt[i])
if(to[i]!=fa[x]&&to[i]!=son[x])
DFS(to[i],to[i]);
} void Build(int x,int l,int r){
Mx[x].push(Data(,-));
if(l==r)return;
int mid=(l+r)>>;
Build(x<<,l,mid);
Build(x<<|,mid+,r);
} int Query(int x,int l,int r,int g){
while(del[Mx[x].top().ID])
Mx[x].pop();
if(l==r)
return Mx[x].top().val;
int mid=(l+r)>>;
if(mid>=g)return max(Mx[x].top().val,Query(x<<,l,mid,g));
else return max(Mx[x].top().val,Query(x<<|,mid+,r,g));
} struct Node{
int l,r;
Node(int L=,int R=){
l=L;r=R;
}
bool operator <(const Node &a)const{
return l<a.l;
}
}st[maxn]; void Update(int x,int l,int r,int a,int b,int id,int val){
if(l>=a&&r<=b){
Mx[x].push(Data(id,val));
return;
}
int mid=(l+r)>>;
if(mid>=a)Update(x<<,l,mid,a,b,id,val);
if(mid<b)Update(x<<|,mid+,r,a,b,id,val);
return;
} void Solve(int x,int y,int id,int val){
int tp=;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])
swap(x,y); st[++tp]=Node(ID[top[x]],ID[x]);
x=fa[top[x]];
} if(dep[x]<dep[y])swap(x,y);
st[++tp]=Node(ID[y],ID[x]); sort(st+,st+tp+); int L=;
for(int i=;i<=tp;i++){
if(L<=st[i].l-)
Update(,,n,L,st[i].l-,id,val);
L=st[i].r+;
} if(L<=n)
Update(,,n,L,n,id,val); return;
} int main(){
#ifndef ONLINE_JUDGE
freopen("network_tenderRun.in","r",stdin);
freopen("network_tenderRun.out","w",stdout);
#endif
scanf("%d%d",&n,&Q);
for(int i=,a,b;i<n;i++){
scanf("%d%d",&a,&b);
addedge(a,b);
addedge(b,a);
} DFS();
DFS(,);
Build(,,n); for(int t=,type,a,b,v;t<=Q;t++){
scanf("%d",&type);
if(type==){
scanf("%d%d%d",&a,&b,&v);
Solve(a,b,t,v);
}
else if(type==){
scanf("%d",&a);
del[a]=true;
}
else if(type==){
scanf("%d",&a);
printf("%d\n",Query(,,n,ID[a]));
}
}
return ;
}

  5月20日BZOJ加了一组数据,上面的程序MLE了,只能使用手写栈。

 #include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn=;
int n,Q,cnt,fir[maxn],nxt[maxn<<],to[maxn<<];
void addedge(int a,int b){
nxt[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;
}
priority_queue<int>Mx[maxn<<],del[maxn<<]; int dep[maxn],fa[maxn],sz[maxn],son[maxn],vis[maxn];
int ID[maxn],top[maxn],tot,U[maxn<<],V[maxn<<],val[maxn<<];
int stack[maxn],head; void DFS(int x){
stack[++head]=x;
while(head){
x=stack[head];
if(vis[x]){
if(fa[x]){
sz[fa[x]]+=sz[x];
if(sz[son[fa[x]]]<sz[x])
son[fa[x]]=x;
}
head--;
continue;
}
vis[x]=true;sz[x]=;
for(int i=fir[x];i;i=nxt[i])
if(to[i]!=fa[x]){
fa[to[i]]=x;
dep[to[i]]=dep[x]+;
stack[++head]=to[i];
}
}
} void DFS(int x,int tp){
top[x]=tp;
stack[++head]=x;
while(head){
x=stack[head];
if(vis[x]){
head--;
continue;
}
vis[x]=true;
ID[x]=++tot;
for(int i=fir[x];i;i=nxt[i])
if(to[i]!=fa[x]&&to[i]!=son[x]){
stack[++head]=to[i];
top[to[i]]=to[i];
}
if(son[x]){
stack[++head]=son[x];
top[son[x]]=top[x];
}
}
} int Query(int x,int l,int r,int g){
while(!del[x].empty()&&del[x].top()==Mx[x].top())del[x].pop(),Mx[x].pop();
if(l==r)
return Mx[x].empty()?-:Mx[x].top();
int mid=(l+r)>>,ret=Mx[x].empty()?-:Mx[x].top();
if(mid>=g)return max(ret,Query(x<<,l,mid,g));
else return max(ret,Query(x<<|,mid+,r,g));
} struct Node{
int l,r;
Node(int L=,int R=){
l=L;r=R;
}
bool operator <(const Node &a)const{
return l<a.l;
}
}st[maxn<<]; void Update(int x,int l,int r,int a,int b,int val,int on){
if(l>=a&&r<=b){
if(on)
Mx[x].push(val);
else
del[x].push(val);
return;
}
int mid=(l+r)>>;
if(mid>=a)Update(x<<,l,mid,a,b,val,on);
if(mid<b)Update(x<<|,mid+,r,a,b,val,on);
return;
} void Solve(int x,int y,int val,int on){
int tp=;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])
swap(x,y); st[++tp]=Node(ID[top[x]],ID[x]);
x=fa[top[x]];
} if(dep[x]<dep[y])swap(x,y);
st[++tp]=Node(ID[y],ID[x]); sort(st+,st+tp+); int L=;
for(int i=;i<=tp;i++){
if(L<=st[i].l-)
Update(,,n,L,st[i].l-,val,on);
L=st[i].r+;
} if(L<=n)
Update(,,n,L,n,val,on); return;
} int main(){
#ifndef ONLINE_JUDGE
//freopen("network_tenderRun.in","r",stdin);
//freopen("network_tenderRun.out","w",stdout);
#endif
scanf("%d%d",&n,&Q);
for(int i=,a,b;i<n;i++){
scanf("%d%d",&a,&b);
addedge(a,b);
addedge(b,a);
} DFS();
memset(vis,,sizeof(vis));
DFS(,); for(int t=,type,a;t<=Q;t++){
scanf("%d",&type);
if(type==){
scanf("%d%d%d",&U[t],&V[t],&val[t]);
Solve(U[t],V[t],val[t],);
}
else if(type==){
scanf("%d",&a);
Solve(U[a],V[a],val[a],);
}
else if(type==){
scanf("%d",&a);
printf("%d\n",Query(,,n,ID[a]));
}
}
return ;
}

如下:

数据结构(树链剖分,堆):HNOI 2016 network的更多相关文章

  1. BZOJ4538:[HNOI2016]网络(树链剖分,堆)

    Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做 一条树边.两个服务器进行数据的交互时,数据会经过连接这两个服务器的路径上的所有 ...

  2. 【BZOJ1146】【树链剖分+平衡树】网络管理Network

    Description M 公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通 信网络.该网络的结构由N个 ...

  3. luoguP3250 [HNOI2016]网络 树链剖分 + 堆

    机房某大佬告诉我,一条链在全局线段树中的区间最多有$log$段 因此同样的,代表不在这条链上的区间同样只有$log$段 对这$log$段区间进行维护即可 为了能够删除,在线段树的每个节点暴力维护一个堆 ...

  4. 数据结构(树链剖分):BZOJ 4034: [HAOI2015]T2

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...

  5. 数据结构--树链剖分准备之LCA

    有关LCA的模板题    传送门 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和 ...

  6. 数据结构(树链剖分):COGS 2109. [NOIP2015] 运输计划

    2109. [NOIP2015] 运输计划 ★★★   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:1 s   内存限制:256 MB [题目描 ...

  7. 数据结构(并查集||树链剖分):HEOI 2016 tree

    [注意事项] 为了体现增强版,题目限制和数据范围有所增强: 时间限制:1.5s 内存限制:128MB 对于15% 的数据,1<=N,Q<=1000. 对于35% 的数据,1<=N,Q ...

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

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

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

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

随机推荐

  1. 9.23 noip模拟试题

      Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N ...

  2. android入门系列- TextView EditText Button ImageView 的简单应用

    第一篇原创,其实自己就是一菜鸟,简单分享点基本知识吧.希望能有所帮助吧. TextView EditText Button ImageView 这几个控件可能是Android开发中最常用.最基本的几个 ...

  3. jquery-动态设置ul li a链接目标

    概述: 先上我的布局图: ul中的每一个li里面包含着一个'a'超链接,可以猜想到,我想没点击ul->li里面每个a,链接到不同的页面,在这里,我用iframe完成. html主要代码为: &l ...

  4. Oracle (内连接)

    例如: 表xuesheng id name 1, Jack 2, Tom 3, Kity 4, nono 表kaoshi id grade 1, 56 2, 76 11, 89 内连接(显示两表匹配的 ...

  5. Zend Server安装后首次运行就出现Internal Server Error的解决

    无论是使用哪个版本的Zend Server来搭建PHP服务器,首次运行都会出现Internal Server Error的错误,对很多新手而言,每当看到这种错误时,那一刻内心绝对都是崩溃的.然而,这个 ...

  6. [转]mysql 导入导出数据库以及函数、存储过程的介绍

    本篇文章是对mysql中的导入导出数据库命令以及函数.存储过程进行了详细的分析介绍,需要的朋友参考下: mysql常用导出数据命令:1.mysql导出整个数据库  mysqldump -hhostna ...

  7. X3850 Linux 下DSA日志收集办法

    收集工具下载 RHEL 6: 32bit-- [IBM 下载]http://delivery04.dhe.ibm.com/sar/CMA/XSA/03tza/1/ibm_utl_dsa_dsytb7x ...

  8. javaScript 的option触发事件

    先说jquery的option触发事件,很方便 $("option:selected")//这样就能直接触发选择的option了 在JavaScript中就显得比较麻烦,其实< ...

  9. ffmepg命令行参数

    ffmpeg使用 有些选项在每个流中都必须指定,例如比特率bitrate或编解码codec.指定流的字符串一般都会有各参数名称和参数,如编解码"-codec:a:1 ac3"表明第 ...

  10. php基础知识【函数】(9)数学和对象类函数

    一.数学  abs -- 绝对值 ceil -- 进一法取整 floor -- 舍去法取整 fmod -- 返回除法的浮点数余数 round -- 对浮点数进行四舍五入 sqrt -- 平方根 pi( ...