树上的区间第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. 2016huasacm暑假集训训练四 DP_B

    题目链接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/M 题意:有N件物品和一个容量为V的背包.第i件物品的费用是体积c[i],价值是w[ ...

  2. 在线OJ实用技巧(转载)

    1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long long或__int64型(两个下 ...

  3. Java中的递归运算

    Java中的递归运算是一种在自己的方法内部调用自己的方法 递归的设计思想是:把一个复杂的问题,分解为若干个等同的子问题,重复执行,直到之问题能够简单到直接求解,这样复杂的问题就得以解决. 递归运算有两 ...

  4. C# 程序实现功能目录

    1.根据年月日获取 星期几  http://www.cnblogs.com/liwp/p/5943226.html 2.json对象转换为泛型集合 http://www.cnblogs.com/liw ...

  5. GCD死锁 多线程

    NSLog("); dispatch_sync(dispatch_get_main_queue(), ^{ // sync同步 main串行 // 同步,异步--线程 同步-主线程 // m ...

  6. [功能改进]Live Writer发博支持“建分类、加标签、写摘要”

    以前您在园子里用Windows Live Wirter发布博文是不是有以下三个不爽: 不爽1:如果想在发布随笔时新建分类并将随笔添加至该分类,需要先在博客后台添加分类,然后在Live Writer中刷 ...

  7. java new Date()得到的时间和系统时间不一样

    造成这种问题的原因是:操作系统时区跟JVM的时区不一致. [root@paas244 ~]# timedatectl Local time: Thu 2016-12-29 15:35:44 CST U ...

  8. nginx 配置优化(简单)

    配置文件     正常运行的必备配置:         1.user username [groupname]:(推荐nginx)         以那个用户身份运行,以在configure指定的用户 ...

  9. inotify监控目录变化重启服务器tornado项目

    pycharm 配置了提交服务器项目每次pycharm修改后,虽然保存到服务器但是项目还得自己去服务器kill再启动.就花几分钟写了shell脚本用于监控项目目录变化并重启tornado项目的脚本 如 ...

  10. Linux环境安装MySQL数据库

    1.  下载mysql安装包 下载地址1:  http://www.mysql.com/   (mysql官网) 下载地址2:  http://mirrors.sohu.com/mysql/   (其 ...