【BZOJ1146】[CTSC2008]网络管理Network
Description
Input
Output
Sample Input
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
2
2
invalid request!
题解:用树状数组+主席树维护DFS序即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=80010;
int n,m,N,nm,cnt,tot,l1,l2,l3,l4;
int p[maxn],q[maxn],s1[maxn],s2[maxn],s3[maxn],s4[maxn],v[maxn],pa[maxn],pb[maxn],pc[maxn];
int to[maxn<<1],next[maxn<<1],head[maxn],fa[18][maxn],dep[maxn],rt[maxn],ref[maxn<<1];
struct number
{
int val,org;
}num[maxn<<1];
struct node
{
int siz,ls,rs;
}s[maxn*160];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
bool cmp(number a,number b)
{
return a.val<b.val;
}
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x)
{
p[x]=++q[0];
for(int i=head[x];i!=-1;i=next[i])
{
if(to[i]==fa[0][x]) continue;
fa[0][to[i]]=x,dep[to[i]]=dep[x]+1,dfs(to[i]);
}
q[x]=q[0];
}
void insert(int &x,int l,int r,int pos,int v)
{
if(!x) x=++tot;
s[x].siz+=v;
if(l==r) return ;
int mid=l+r>>1;
if(pos<=mid) insert(s[x].ls,l,mid,pos,v);
else insert(s[x].rs,mid+1,r,pos,v);
}
void updata(int x,int y,int v)
{
for(int i=x;i<=n;i+=i&-i) insert(rt[i],1,N,y,v);
}
int query(int l,int r,int pos)
{
if(!pos) printf("fuck\n");
if(l==r) return ref[l];
int sr=0,mid=l+r>>1,i;
for(i=1;i<=l1;i++) sr+=s[s[s1[i]].rs].siz;
for(i=1;i<=l2;i++) sr+=s[s[s2[i]].rs].siz;
for(i=1;i<=l3;i++) sr-=s[s[s3[i]].rs].siz;
for(i=1;i<=l4;i++) sr-=s[s[s4[i]].rs].siz;
if(pos<=sr)
{
for(i=1;i<=l1;i++) s1[i]=s[s1[i]].rs;
for(i=1;i<=l2;i++) s2[i]=s[s2[i]].rs;
for(i=1;i<=l3;i++) s3[i]=s[s3[i]].rs;
for(i=1;i<=l4;i++) s4[i]=s[s4[i]].rs;
return query(mid+1,r,pos);
}
else
{
for(i=1;i<=l1;i++) s1[i]=s[s1[i]].ls;
for(i=1;i<=l2;i++) s2[i]=s[s2[i]].ls;
for(i=1;i<=l3;i++) s3[i]=s[s3[i]].ls;
for(i=1;i<=l4;i++) s4[i]=s[s4[i]].ls;
return query(l,mid,pos-sr);
}
}
int lca(int a,int b)
{
if(dep[a]<dep[b]) swap(a,b);
int i;
for(i=17;~i;i--) if(dep[fa[i][a]]>=dep[b]) a=fa[i][a];
if(a==b) return a;
for(i=17;~i;i--) if(fa[i][a]!=fa[i][b]) a=fa[i][a],b=fa[i][b];
return fa[0][a];
}
int main()
{
n=rd(),m=rd();
int i,j,a,b,c,d,e;
memset(head,-1,sizeof(head));
for(i=1;i<=n;i++) num[++nm].val=rd(),num[nm].org=i;
for(i=1;i<n;i++) a=rd(),b=rd(),add(a,b),add(b,a);
dep[1]=1,dfs(1);
for(j=1;(1<<j)<=n;j++) for(i=1;i<=n;i++) fa[j][i]=fa[j-1][fa[j-1][i]];
for(i=1;i<=m;i++)
{
pc[i]=rd(),pa[i]=rd(),pb[i]=rd();
if(!pc[i]) num[++nm].val=pb[i],num[nm].org=n+i;
}
sort(num+1,num+nm+1,cmp);
for(i=1;i<=nm;i++)
{
if(num[i].val>ref[N]) ref[++N]=num[i].val;
if(num[i].org<=n) v[num[i].org]=N;
else pb[num[i].org-n]=N;
}
for(i=1;i<=n;i++) updata(p[i],v[i],1),updata(q[i]+1,v[i],-1);
for(i=1;i<=m;i++)
{
c=pc[i],a=pa[i],b=pb[i];
if(!c)
{
updata(p[a],v[a],-1),updata(q[a]+1,v[a],1),v[a]=b,updata(p[a],b,1),updata(q[a]+1,b,-1);
}
else
{
d=lca(a,b),e=fa[0][d],l1=l2=l3=l4=0;
if(dep[a]+dep[b]-dep[d]-dep[e]<c)
{
printf("invalid request!\n");
continue;
}
for(j=p[a];j;j-=j&-j) s1[++l1]=rt[j];
for(j=p[b];j;j-=j&-j) s2[++l2]=rt[j];
for(j=p[d];j;j-=j&-j) s3[++l3]=rt[j];
for(j=p[e];j;j-=j&-j) s4[++l4]=rt[j];
printf("%d\n",query(1,N,c));
}
}
return 0;
}//5 5 5 1 2 3 4 3 1 2 1 4 3 5 3 1 1 1 1 1 5 2 1 5 3 1 5 2 1 2
【BZOJ1146】[CTSC2008]网络管理Network 树状数组+DFS序+主席树的更多相关文章
-
【BZOJ】2434: [Noi2011]阿狸的打字机 AC自动机+树状数组+DFS序
[题意]阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小写 ...
-
BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
-
【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 508 Solved: 158[Submit][Sta ...
-
【BZOJ-1103】大都市meg 树状数组 + DFS序
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2009 Solved: 1056[Submit][Sta ...
-
POJ 3321 Apple Tree (树状数组+dfs序)
题目链接:http://poj.org/problem?id=3321 给你n个点,n-1条边,1为根节点.给你m条操作,C操作是将x点变反(1变0,0变1),Q操作是询问x节点以及它子树的值之和.初 ...
-
BZOJ 1103 [POI2007]大都市meg(树状数组+dfs序)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1103 [题目大意] 给出一棵树,每条边的经过代价为1,现在告诉你有些路不需要代价了, ...
-
[luogu P3787][新创无际夏日公开赛] 冰精冻西瓜 [树状数组][dfs序]
题目背景 盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦. 题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有 ...
-
HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)
Tree chain problem Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
-
BZOJ.2434.[NOI2011]阿狸的打字机(AC自动机 树状数组 DFS序)
题目链接 首先不需要存储每个字符串,可以将所有输入的字符依次存进Trie树,对于每个'P',记录该串结束的位置在哪,以及当前节点对应的是第几个串(当前串即根节点到当前节点):对于'B',只需向上跳一个 ...
随机推荐
-
easyx与VS2015
7.10 之前在文件头将__acrt_iob_func重定义&__iob_func,在格子涂色的程序中解决了问题:然而在俄罗斯方块的程序中出现了更多的问题,好像是FILE在其他外部依赖项cor ...
-
Entity Framework在Asp.net MVC中的实现One Context Per Request(附源码)
上篇中"Entity Framework中的Identity map和Unit of Work模式", 由于EF中的Identity map和Unit of Work模式,EF体现 ...
-
WEB-INF目录下的jsp页面如何访问?
只能在sevlet(或者spring的control,struts的action,本质都是sevlet)中访问也就是只能通过java后台访问,这里web-inf下的内容是不对外开放的/安全的,不能通过 ...
-
Java中如何使用Redis做缓存
基本功能测试 1.程序基本结构 2.主要类 1)功能类 package com.redis; import java.util.ArrayList; import java.util.Iterator ...
-
工作中常用Git指令操作
常用Git指令总结 前阵子有几天好不顺,可谓是喝水都呛着,更何况被Git给呛着了,还不轻,哈哈.所以打算总结一下自己在工作使用到Git相关的东西以及和大家探讨使用GIt的心得体会.于是,关于Git的的 ...
-
jmeter插件安装
一.下载插件 访问网址http://jmeter-plugins.org/downloads/all/,下载三个文件.其中JMeterPlugins-Standard和JMeterPlugins-Ex ...
-
linux 的那些hung 检测机制
在dmesg中,看到如下信息: [:: seconds [:: seconds [:af: seconds [:af: seconds [:: seconds [:3b: seconds [:: se ...
-
OpenGL笔记(三) GLSL语法与内建函数
GLSL,OpenGL Shading Language,GLSL中没有指针,并且没有任何类型的字符串或字符. (1)GLSL的修饰符与基本数据类型 const:用于声明非可写的编译时常量变量: at ...
-
[leetcode]Valid Palindrome @ Python
原题地址:https://oj.leetcode.com/problems/valid-palindrome/ 题意: Given a string, determine if it is a pal ...
-
Java动态代理学习
动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类: 1.Interface InvocationHandler 该接口中仅定义了一个方法: Objec ...