树上的区间第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. HTML 5 拖放(Drag 和drop)

    浏览器支持 Internet Explorer 9.Firefox.Opera 12.Chrome 以及 Safari 5. 1.把标签 draggable 属性设置为 true. 2.向标签添加on ...

  2. centos关闭防火墙

    Centos7 关闭防火墙 CentOS 7.0默认使用的是firewall作为防火墙,使用iptables必须重新设置一下 1.直接关闭防火墙 systemctl stop firewalld.se ...

  3. Ubuntu ssh服务安装

    在使用xshell连接ubuntu虚拟机时,提示 Could not connect to '192.168.0.106' (port 22): Connection failed. 在主机使用pin ...

  4. C# 方法返回值的个数

    方法返回值类型总的来说分为值类型,引用类型,Void 有些方法显示的标出返回值 public int Add(int a,int b) { return a+b; } 有些方法隐式的返回返回值,我们可 ...

  5. Java Basic - Annotation

    使用注解最主要的部分在于对注解的处理,那么就会涉及到注解处理器.      从原理上讲,注解处理器就是通过反射机制获取被检查方法上的注解信息,然后根据注解元素的值进行特定的处理.   注解处理器类库( ...

  6. java线程同步 以及wait 和notify用法

    package test; public class ThreadTest2 extends Thread { private int threadNo; private String lock; p ...

  7. PCB板的质量可接受性标准 IPC-A-600H 中文版下载

    对于电子行业的小伙伴来说,经常要找PCB板厂打板,总难免遇到跟板厂因PCB上的质量缺陷扯皮的时候,这是就要有一份公认PCB质量可接受性标准作为最终PCB产品的验收标准,即IPC-A-600标准规范. ...

  8. mysql slow query---pt-query-digest----db structure consistency,monitor table records before and after transaction.

    将数据库脚本纳入版本管理是很必要的,尤其对于需要在客户那里部署升级的系统. 对于Python Django等框架,由于数据库是通过Model生成的,因此框架本身包括数据库升级工具,并通过代码版本间接管 ...

  9. IO复用三种方式

    简介 IO复用技术,简单来说就是同时监听多个描述符.在没有用到IO复用以前,只能是一个线程或一个 线程去监听,服务端同时有多个连接的时候,需要创建多个线程或者进程.而且,并不是所有的连 接是一直在传输 ...

  10. @Html.Raw()

    在用VS 2015写代码时,匹配邮箱的正则表达式 /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/​ @报错  主要因为 @是MVC里的关键字,所以不能直 ...