树上的区间第k小数,以前写的主席树是一直MLE的,后来看到一种在初始化的时候的优化:直接DFS这颗树,得到每个点的主席树,然后更新的时候另外对DFS序建主席树,答案加上初始每个点的主席树,这样在初始化每个点的时候就不需要用BIT维护了,省去的空间正好AC了这个题。

呆马:

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#define maxn 80008
using namespace std;
struct node
{
node *lc,*rc;
int s;
node () {s=;}
}*rot[maxn],*sum[maxn],*p;
vector <node*> st[];
struct et
{
int s,t,next;
}e[maxn*];
int ll[maxn],rr[maxn],fir[maxn],key[maxn];
int w[maxn*],dep[maxn],fa[maxn][];
int x[maxn],y[maxn],z[maxn];
int n,m,tot,low,cnt,num;
int v[]; node *build(int l,int r)
{
node *now=new node();
if (l==r) return now;
int mid=(l+r)>>;
now->lc=build(l,mid);
now->rc=build(mid+,r);
return now;
} node *change(int l,int r,int x,int z)
{
node *now=new node();
now->lc=p->lc; now->rc=p->rc;
now->s=p->s+z;
if (l==r) return now;
int mid=(l+r)>>;
if (x<=mid) p=p->lc,now->lc=change(l,mid,x,z);
else p=p->rc,now->rc=change(mid+,r,x,z);
return now;
} void adj(int x,int y,int z)
{
if (x==) return ;
for (int i=x;i<=n;i+=(i&-i)) p=rot[i],rot[i]=change(,num,y,z);
} void fill(int k)
{
st[k].clear();
st[k].push_back(sum[v[k]]);
for (int i=ll[v[k]];i>;i-=(i&-i)) st[k].push_back(rot[i]);
} int getsum(int k)
{
int ans=, n=st[k].size();
for (int i=;i<n;i++) ans+=st[k][i]->s;
return ans;
} int getsize(int k)
{
int ans=, n=st[k].size();
for (int i=;i<n;i++) ans+=st[k][i]->rc->s;
return ans;
} void goleft(int k)
{
int n=st[k].size();
for (int i=;i<n;i++) st[k][i]=st[k][i]->lc;
} void goright(int k)
{
int n=st[k].size();
for (int i=;i<n;i++) st[k][i]=st[k][i]->rc;
} int query(int l,int r,int k)
{
if (k>getsum()+getsum()-getsum()-getsum()) return ;
if (l==r) return l;
int tmp=getsize()+getsize()-getsize()-getsize();
int mid=(l+r)>>;
if (k<=tmp)
{
goright(),goright(),goright(),goright();
return query(mid+,r,k);
}
else
{
goleft(),goleft(),goleft(),goleft();
return query(l,mid,k-tmp);
}
} int lca(int x,int y)
{
if (dep[x]>dep[y]) swap(x,y);
for (int i=low;i>=;i--)
if (dep[fa[y][i]]>=dep[x]) y=fa[y][i];
if (x==y) return x;
for (int i=low;i>=;i--)
if (fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
return fa[x][];
} void write(node *now,int l,int r)
{
if (l==r)
{
cout<<now->s;
return ;
}
int mid=(l+r)>>;
write(now->lc,l,mid);
write(now->rc,mid+,r);
} void dfs(int now)
{
ll[now]=rr[now]=++cnt;
p=sum[fa[now][]];
sum[now]=change(,num,key[now],); for (int j=fir[now];j;j=e[j].next)
{
int k=e[j].t;
if (fa[now][]!=k)
{
fa[k][]=now; dep[k]=dep[now]+;
for (int i=;i<=low;i++) fa[k][i]=fa[fa[k][i-]][i-];
dfs(k);
rr[now]=rr[k];
}
}
} void add(int x,int y)
{
e[++tot].s=x; e[tot].t=y; e[tot].next=fir[x]; fir[x]=tot;
e[++tot].s=y; e[tot].t=x; e[tot].next=fir[y]; fir[y]=tot;
} int main()
{
//freopen("network10.in","r",stdin);
//freopen("network.out","w",stdout);
scanf("%d%d",&n,&m);
low=log(n)/log(2.0);
for (int i=;i<=n;i++) scanf("%d",&key[i]),w[++num]=key[i];
int st,ed;
for (int i=;i<n;i++) scanf("%d%d",&st,&ed),add(st,ed);
num=n;
for (int i=;i<=m;i++)
{
scanf("%d%d%d",&z[i],&x[i],&y[i]);
if (!z[i]) w[++num]=y[i];
}
sort(w+,w+num+);
num=unique(w+,w+num+)-w;
for (int i=;i<=n;i++) key[i]=lower_bound(w+, w+num+, key[i])-w;
for (int i=;i<=m;i++) if (!z[i]) y[i]=lower_bound(w+, w+num+, y[i])-w; sum[]=rot[]=build(,num);
for (int i=;i<=n;i++) rot[i]=rot[];
int root=rand()%n+; dep[root]=;
dfs(root); for (int i=;i<=m;i++)
{
if (z[i])
{
int tmp;
v[]=x[i],v[]=y[i],v[]=tmp=lca(x[i],y[i]),v[]=fa[tmp][];
fill(); fill(); fill(); fill();
int ans=query(,num,z[i]);
if (ans)
printf("%d\n",w[ans]);
else
printf("invalid request!\n");
}
else
{
adj(ll[x[i]],key[x[i]],-),adj(rr[x[i]]+,key[x[i]],);
key[x[i]]=y[i];
adj(ll[x[i]],key[x[i]],),adj(rr[x[i]]+,key[x[i]],-);
}
}
return ;
}

network

bzoj 1162 network的更多相关文章

  1. BZOJ 3732 Network

    2016.1.28 纪念我BZOJ第一题 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= ...

  2. BZOJ 3732: Network 最小生成树 倍增

    3732: Network 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 &l ...

  3. [bzoj 3732] Network (Kruskal重构树)

    kruskal重构树 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第 ...

  4. bzoj 3732 Network(最短路+倍增 | LCT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3732 [题意] 给定一个无向图,处理若干询问:uv路径上最长的边最小是多少? [思路一 ...

  5. 【刷题】BZOJ 3732 Network

    Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_ ...

  6. BZOJ 3732 Network Link-Cut-Tree (我是认真的!!

    题目大意:给定一个n个点m条边的无向连通图.k次询问两点之间全部路径中最长边的最小值 LCT的裸题! 首先维护一个动态的最小生成树,然后每次增加边时删除两点间路径上权值最大的边.最后询问时直接求x到y ...

  7. bzoj 3732: Network 树上两点边权最值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3732 首先想到,要使得最长边最短,应该尽量走最短的边,在MST上. 然后像LCA那样倍增娶个最大值 ...

  8. BZOJ 3732 Network —— 最小生成树 + 倍增LCA

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 <= N <= 15, ...

  9. BZOJ 3732 Network 最小瓶颈路

    题目大意:给出一个无向边,非常多询问,问x,y两地之间的最长路最短是多少. 思路:乍一看好像是二分啊. 的确这个题二分能够做.可是时间会慢非常多,有的题直接就T掉(NOIP2013货车运输). 事实上 ...

随机推荐

  1. JavaScript-table+大图滚动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. MySQL时间戳相互转换

    mysql将时间戳转成常用时间格式 在mysql中,一个时间字段的存储类型是int(11),怎么转化成字符类型,比方存储为13270655222,需要转化为yyyy -mm-dd的形式. 使用 FRO ...

  3. Visual Studio命令行工具

    devenv.exe Visual Studio IDE 主程序,位于VS_INSTALL_DIR/Common7/IDE. 本节内容来源:vs2010环境执行devenv /? 启动VS deven ...

  4. 【偶像大师 白金星光】的【Variable Tone】技术大公开!偶像从哪里看都那么可爱,VA小组谈制作方针

    http://game.watch.impress.co.jp/docs/news/1016369.html         自从街机版的运营依赖,今年迎来了[偶像大师]系列的11周年.在CEDEC ...

  5. [lua]安卓ndk如何编译lua库

    这里说的lua库是标准lua库,不包含tolua,不包含cocos2dx的各种lua扩展,是干净的lua. 参考: http://stackoverflow.com/questions/1229965 ...

  6. 常用数据存储集合与Map

    一.常见的数据存储实现 二.遍历 1.集合 新循环 迭代器    Iterator Iterator<?> it = C.iterator(); // 问.取.删 it.hasNext() ...

  7. sublime 配置jade高亮显示

    1.下载 Package Control.sublime-package 文件放入Packages文件目录下 2.control + shift + p   输入install package 3. ...

  8. LeetCode First Unique Character in a String

    原题链接在这里:https://leetcode.com/problems/first-unique-character-in-a-string/ 题目: Given a string, find t ...

  9. iOS:个人浅谈工厂模式

    一.什么是工厂方法? 正式的解释是:在基类中定义创建对象的一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到子类中进行.工厂方法要解决的问题是对象的创建时机,它提供了一种扩展的策略,很好 ...

  10. iOS网络相关知识总结

    iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...