树上的区间第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. hdu 4899 Hero meet devil

    传送阵:http://acm.hdu.edu.cn/showproblem.php?pid=4899 题目大意:给定一个DNA序列,求有多少长度为m的序列与该序列的最长公共子序列长度为0,1...|S ...

  2. 解决导入so库报错小结

    最近公司准备将重构后的项目上线,可是等到我接手的时候发现一个很纠结的问题:安卓5.0以上的手机(例如我现在在用的红米note3)运行重构后项目发生报错,提示缺少某so库. 而5.0以下的手机(我的小米 ...

  3. swift 2.x学习笔记(三)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400 } p.p2 { margin: 0.0px 0. ...

  4. 骑士游历/knight tour - visual basic 解决

    在visual baisc 6 how to program 中文版第七章的练习题上看到了这个问题,骑士游历的问题. 在8x8的国际象棋的棋盘上,骑士(走法:一个方向走两格,另一个方向一格)不重复走完 ...

  5. Thinking in Java——笔记(11)

    Holding Your Objects In general, your programs will always be creating new objects based on some cri ...

  6. P1041 传染病控制

    #include <bits/stdc++.h> using namespace std; const int maxn = 301; std::vector<int> son ...

  7. angular前端开发环境

    1.代码编辑工具 webstorm 2.断点调试工具 chrome插件Batarang 3.版本管理工具 git(仅仅是命令行工具) git小乌龟--tortoisegit(图形化工具) 首先在git ...

  8. Raspberry pi 添加vnc远程桌面控制

    // 安装服务 apt-get install tightvncserver // 设置连接密码 vncpasswd // 在端口1处开启服务 tightvncserver :1

  9. SQL学习整理_1

    数据库是保存表和其他相关SQL结构的容器. 列是存储在表中的一块同类型数据. 行是一组能够描述某个事物的列的集合. SQL不区分大小写,但建议命令采用大写,表名采用小写,便于读写. 建立数据库 CRE ...

  10. 2.4.1 用NPOI操作EXCEL--画线(转)

    之所有说NPOI强大,是因为常用的Excel操作她都可以通过编程的方式完成.这节开始,我们开始学习NPOI的画图功能.先从最简单的开始,画一条直线:对应的代码为: HSSFSheet sheet1 = ...