树上的区间第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. python3 抓取网页资源的 N 种方法

    1. 最简单 import urllib.request response = urllib.request.urlopen('http://python.org/') html = response ...

  2. Model & ModelMap & ModelAndView 比较ModelFactory简介

    Model: 是一个接口,其实现类必继承ModelMap. ModelMap: 继承与LinkedHashMap,相当于自定义了一个map. ModelAndView: 里面封装了两个对象,其中vie ...

  3. opencv支持的机器学习算法

    CXCORE库: Mahalanobis距离: K均值: CV库: 人脸检测/Haar分类器 ML库: 正态朴素贝叶斯分类器: 决策树: Boosting: 随机森林: EM算法: K近邻(KNN): ...

  4. Kafka 解析

    Kafak采用硬盘顺序写入和内存映射文件技术提示性能.即便是顺序写入硬盘,硬盘的访问速度还是不可能追上内存.所以Kafka的数据并不是实时的写入硬盘,它充分利用了现代操作系统分页存储来利用内存提高I/ ...

  5. Ueditor百度网页编辑器开发者版java utf-8的使用

    index.jsp主要代码: <html> <head> <title>网页编辑器</title> <script type="text ...

  6. warnin php startup in unknown on line 0:

    PHP Warning:  PHP Startup:  in Unknown on line 0 这种情况是因为扩展路径有问题导致的路径或错,或没有该扩展但ini中开启了此扩展

  7. dom4j学习

    在使用xml读写的过程中,用到了dom4j,也算是一个比较主流的xml包了,在使用的过程中,将学习经历记录一下,以后查阅也比较方便. 首先是在pom中添加依赖,在Maven的中心库搜索后选择了该包: ...

  8. Python学习之路【目录】

    本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! 目录: Python学习[第一篇]python简介 Python学习[第二篇]p ...

  9. 【转载】JMeter学习(三十六)发送HTTPS请求

    Jmeter一般来说是压力测试的利器,最近想尝试jmeter和BeanShell进行接口测试.由于在云阅读接口测试的过程中需要进行登录操作,而登录请求是HTTPS协议.这就需要对jmeter进行设置. ...

  10. jira操作

    1. 字段 关键字 issuetype 2. 语法 2.1 in AND issuekey in (WQBNEWSDLDL-348, WQBNEWSDLDL-348, WQBNEWSDLDL-352, ...