【树上莫队】【带修莫队】【权值分块】bzoj1146 [CTSC2008]网络管理Network
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 80001
int v[N<<1],en,first[N],next[N<<1];
void AddEdge(int U,int V)
{
v[++en]=V;
next[en]=first[U];
first[U]=en;
}
struct Point{int p,v;}t[86000];
bool operator < (Point a,Point b){return a.v<b.v;}
int n,m,ma[86000],a[86000],zy,b[86000];
int eq,ec,blo,sz,siz[N],top[N],fa[N],dep[N],num[N];
void dfs(int U)
{
for(int i=first[U];i;i=next[i])
if(v[i]!=fa[U])
{
fa[v[i]]=U;
dep[v[i]]=dep[U]+1;
if(siz[top[U]]<sz)
{
++siz[top[U]];
top[v[i]]=top[U];
}
dfs(v[i]);
}
}
void df2(int U)
{
num[U]=blo;
for(int i=first[U];i;i=next[i])
if(v[i]!=fa[U]&&top[v[i]]==top[U])
df2(v[i]);
}
int lca(int U,int V)
{
while(U!=V)
{
if(top[U]!=top[V])
{
if(dep[top[U]]<dep[top[V]])
swap(U,V);
U=fa[top[U]];
}
else
{
if(dep[U]<dep[V])
swap(U,V);
U=fa[U];
}
}
return U;
}
struct UPT{int x,y,z;}CH[N];
struct ASK{int l,r,k,p,t;}Q[N];
bool operator < (const ASK &a,const ASK &b)
{
if(num[a.l]==num[b.l])
{
if(num[a.r]==num[b.r])
return a.t<b.t;
return num[a.r]<num[b.r];
}
return num[a.l]<num[b.l];
}
int nu2[86000],r[300],sumv[300],bl2=1,T[86000];
void makeblock()
{
int sz=sqrt(zy); if(!sz) sz=0;
for(;bl2*sz<zy;++bl2)
{
r[bl2]=bl2*sz;
for(int i=r[bl2-1]+1;i<=r[bl2];++i)
nu2[i]=bl2;
}
r[bl2]=zy;
for(int i=r[bl2-1]+1;i<=r[bl2];++i)
nu2[i]=bl2;
}
void Update(int x,int op){T[x]+=op; sumv[nu2[x]]+=op;}
bool vis[N];
void Work(int U,int V,int LCA)
{
while(U!=LCA)
{
vis[U]^=1;
Update(a[U],vis[U]?1:-1);
U=fa[U];
}
while(V!=LCA)
{
vis[V]^=1;
Update(a[V],vis[V]?1:-1);
V=fa[V];
}
}
int Kth(int K)
{
int cnt=0;
for(int i=bl2;i;--i)
{
cnt+=sumv[i];
if(cnt>=K)
{
cnt-=sumv[i];
for(int j=r[i];;--j)
{
cnt+=T[j];
if(cnt>=K)
return ma[j];
}
}
}
return -1;
}
int Ks[N],anss[N];
int main()
{
int x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%d",&t[i].v);
t[i].p=i;
}
for(int i=1;i<n;++i)
{
scanf("%d%d",&x,&y);
AddEdge(x,y);
AddEdge(y,x);
}
for(int i=1;i<=n;++i)
{
top[i]=i;
siz[i]=1;
}
sz=(int)pow((double)n,2.0/3.0);
dfs(1);
for(int i=1;i<=n;++i)
if(top[i]==i)
{
++blo;
df2(i);
}
en=n;
for(int i=1;i<=m;++i)
{
scanf("%d",&Ks[i]);
if(!Ks[i])
{
++ec; ++en;
scanf("%d%d",&CH[ec].x,&t[en].v);
t[en].p=en;
}
else
{
++eq;
Q[eq].k=Ks[i];
scanf("%d%d",&Q[eq].l,&Q[eq].r);
Q[eq].t=ec; Q[eq].p=eq;
}
}
sort(t+1,t+en+1);
ma[a[t[1].p]=++zy]=t[1].v;
for(int i=2;i<=en;++i)
{
if(t[i].v!=t[i-1].v) ++zy;
ma[a[t[i].p]=zy]=t[i].v;
}
makeblock();
memcpy(b,a,sizeof(int)*(n+1));
en=n; ec=0;
for(int i=1;i<=m;++i)
if(!Ks[i])
{
++en; ++ec;
CH[ec].y=a[en];
CH[ec].z=b[CH[ec].x];
b[CH[ec].x]=a[en];
}
sort(Q+1,Q+eq+1);
for(int i=1;i<=Q[1].t;++i)
a[CH[i].x]=CH[i].y;
int LCA=lca(Q[1].l,Q[1].r);
Work(Q[1].l,Q[1].r,LCA);
Update(a[LCA],1);
anss[Q[1].p]=Kth(Q[1].k);
Update(a[LCA],-1);
for(int i=2;i<=eq;++i)
{
if(Q[i-1].t<Q[i].t) for(int j=Q[i-1].t+1;j<=Q[i].t;++j)
{
if(vis[CH[j].x])
{
Update(CH[j].y,1);
Update(a[CH[j].x],-1);
}
a[CH[j].x]=CH[j].y;
}
else for(int j=Q[i-1].t;j>Q[i].t;--j)
{
if(vis[CH[j].x])
{
Update(CH[j].z,1);
Update(a[CH[j].x],-1);
}
a[CH[j].x]=CH[j].z;
}
Work(Q[i-1].l,Q[i].l,lca(Q[i-1].l,Q[i].l));
Work(Q[i-1].r,Q[i].r,lca(Q[i-1].r,Q[i].r));
LCA=lca(Q[i].l,Q[i].r);
Update(a[LCA],1);
anss[Q[i].p]=Kth(Q[i].k);
Update(a[LCA],-1);
}
for(int i=1;i<=eq;++i)
if(anss[i]!=-1)
printf("%d\n",anss[i]);
else
puts("invalid request!");
return 0;
}
【树上莫队】【带修莫队】【权值分块】bzoj1146 [CTSC2008]网络管理Network的更多相关文章
- BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...
- BZOJ2120 数颜色 莫队 带修莫队
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...
- 【树链剖分】【函数式权值分块】bzoj1146 [CTSC2008]网络管理Network
裸题,直接上.复杂度O(n*sqrt(n)*log(n)). //Num[i]表示树中的点i在函数式权值分块中对应的点 //Map[i]表示函数式权值分块中的点i在树中对应的点 #include< ...
- BZOJ 4129 Haruna’s Breakfast ( 树上带修莫队 )
题面 求树上某路径上最小的没出现过的权值,有单点修改 添加链接描述 分析 树上带修莫队板题,问题是怎么求最小的没出现过的权值. 因为只有nnn个点,所以没出现过的最小值一定在[0,n][0,n][0, ...
- 【BZOJ-3052】糖果公园 树上带修莫队算法
3052: [wc2013]糖果公园 Time Limit: 200 Sec Memory Limit: 512 MBSubmit: 883 Solved: 419[Submit][Status] ...
- BZOJ3052: [wc2013]糖果公园【树上带修莫队】
Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 HINT 思路 非常模板的树上带修莫队 真的 ...
- luogu4074 [WC2013]糖果公园(树上带修莫队)
link 题目大意:给一个树,树上每个点都有一种颜色,每个颜色都有一个收益 每次修改一个点上的颜色 或询问一条链上所有颜色第i次遇到颜色j可以获得w[i]*v[j]的价值,求链上价值和 题解:树上带修 ...
- 【带修莫队】【权值分块】bzoj3196 Tyvj 1730 二逼平衡树
这题用了三种算法写: 分块+二分:O(n*sqrt(n*log(n)) 函数式权值分块:O(n*sqrt(n)) 带修莫队+权值分块:O(n5/3) 结果……复杂度越高的实际上跑得越快……最后这个竟然 ...
- BZOJ 3052 树上带修莫队
思路: 就是把带修莫队移到了树上 块的大小开到(n^2/3)/2 比较好- 这是一个卡OJ好题 //By SiriusRen #include <cmath> #include <c ...
随机推荐
- [poj 1743]差分+后缀数组
题目链接:http://poj.org/problem?id=1743 首先,musical theme只与前后位置的增减关系有关,而与绝对的数值无关,因此想到做一次差分. 然后对于差分后的数组,找到 ...
- Codeforces Round #525 (Div. 2) F. Ehab and a weird weight formula
F. Ehab and a weird weight formula 题目链接:https://codeforces.com/contest/1088/problem/F 题意: 给出一颗点有权值的树 ...
- input 只允许输入数字
onkeyup='this.value=this.value.replace(/[^0-9\-]/gi,"")'
- 【hdu2825-Wireless Password】AC自动机+DP
http://acm.hust.edu.cn/vjudge/problem/16883 题意:要构造一个长度为n的字符串,然后有m模板串构成一个集合(m<=10),构造出来的字符串至少含有k种模 ...
- 【NOIP1999】邮票面值设计 dfs+dp
题目传送门 这道题其实就是找一波上界比较麻烦 用一波 背包可以推出上界mx 所以新加入的物品价值一旦大于mx+1,显然就会出现断层,所以可以以maxm+1为枚举上界,然后这样进行下一层的dfs. 这样 ...
- 怎么重启shell ubuntu
sunosfind . -type f | xargs grep count 怎么重启shell ubuntu方法一:退出,重新登录方法二:source /etc/profile
- 白话TCP三次握手
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握 ...
- APMserv常见问题
一.启动是提示apache启动失败,mysql启动成功 1.去掉ssl的勾选(勾选需要证书),重启看解决没有 2.端口被占,吧apache端口改成80或者8080端口(其他端口也可以试试,80的话访问 ...
- Win 32平台SDK中的文件操作
读取文件: HANDLE hFile ; // 声明文件操作内核对象句柄 hFile = CreateFile(, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ...
- rhel 6.5 yum源的配置
https://blog.csdn.net/error_0_0_/article/details/54962199