BZOJ 3306 树
dfs序建线段树+分类讨论+写的有点长。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 100500
#define maxe 200500
#define inf 2147483646
using namespace std;
int n,m,w[maxv],dfn[maxv],fdfn[maxv],g[maxv],nume=,x,y,cnt=,dis[maxv],mx[maxv],anc[maxv][];
int tot=,root,ls[maxv<<],rs[maxv<<],val[maxv<<],nrt;
char s[];
struct edge
{
int v,nxt;
}e[maxe];
void addedge(int u,int v)
{
e[++nume].v=v;
e[nume].nxt=g[u];
g[u]=nume;
}
void dfs(int x,int fath)
{
dfn[x]=++cnt;mx[x]=dfn[x];fdfn[cnt]=x;
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v==fath) continue;
dis[v]=dis[x]+;
dfs(v,x);anc[v][]=x;
mx[x]=max(mx[x],mx[v]);
}
}
void get_table()
{
for (int e=;e<=;e++)
for (int i=;i<=n;i++)
anc[i][e]=anc[anc[i][e-]][e-];
}
void build(int &now,int left,int right)
{
now=++tot;
if (left==right)
{
val[now]=w[fdfn[left]];
return;
}
int mid=(left+right)>>;
build(ls[now],left,mid);
build(rs[now],mid+,right);
val[now]=min(val[ls[now]],val[rs[now]]);
}
void modify(int now,int left,int right,int pos)
{
if ((left==right) && (left==pos))
{
val[now]=w[fdfn[left]];
return;
}
int mid=(left+right)>>;
if (pos<=mid) modify(ls[now],left,mid,pos);
else modify(rs[now],mid+,right,pos);
val[now]=min(val[ls[now]],val[rs[now]]);
}
int ask(int now,int left,int right,int l,int r)
{
if (l>r) return inf;
if ((l<=) || (r>=n+)) return inf;
if ((left==l) && (right==r)) return val[now];
int mid=(left+right)>>;
if (r<=mid) return ask(ls[now],left,mid,l,r);
else if (l>=mid+) return ask(rs[now],mid+,right,l,r);
else return min(ask(ls[now],left,mid,l,mid),ask(rs[now],mid+,right,mid+,r));
}
int find(int x,int pos)
{
for (int e=;e>=;e--)
{
if (dis[anc[x][e]]>dis[pos])
x=anc[x][e];
}
return x;
}
int main()
{
freopen("cin.in","r",stdin);
freopen("a.out","w",stdout);
nrt=;
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
scanf("%d%d",&x,&w[i]);
if (x!=) {addedge(i,x);addedge(x,i);}
}
dfs(,);
get_table();
build(root,,n);
for (int i=;i<=m;i++)
{
scanf("%s",s);
if (s[]=='V')
{
scanf("%d%d",&x,&y);
w[x]=y;
modify(root,,n,dfn[x]);
}
else if (s[]=='E') scanf("%d",&nrt);
else
{
scanf("%d",&x);
if (x==nrt) printf("%d\n",val[]);
else if ((dfn[nrt]>=dfn[x]) && (dfn[nrt]<=mx[x]))
{
int r=find(nrt,x);
printf("%d\n",min(ask(root,,n,,dfn[r]-),ask(root,,n,mx[r]+,n)));
}
else printf("%d\n",ask(root,,n,dfn[x],mx[x]));
}
}
return ;
}
BZOJ 3306 树的更多相关文章
- BZOJ 3306: 树 LCT + set 维护子树信息
可以作为 LCT 维护子树信息的模板,写的还是比较优美的. 本地可过,bzoj 时限太紧,一直 TLE #include<bits/stdc++.h> #define setIO(s) f ...
- 【bzoj 3306】树
Description 给定一棵大小为 n 的有根点权树,支持以下操作: • 换根 • 修改点权 • 查询子树最小值 Input 第一行两个整数 n, Q ,分别表示树的大小和操作数. ...
- bzoj 3306
以1号节点为根,弄出DFS序,我们发现,对于一个询问:(rt,u),以rt为根,u节点的子树中的最小点权,我们可以根据rt,u,1这三个节点在同一条路径上的相对关系来把它转化为以1为根的在DFS序上的 ...
- bzoj 3196 树套树模板
然而我还是在继续刷水题... 终于解开了区间第k大的心结... 比较裸的线段树套平衡树,比较不好想的是求区间第k大时需要二分一下答案,然后问题就转化为了第一个操作.复杂度nlog3n.跑的比较慢... ...
- BZOJ 1969 树链剖分+Tarjan缩点
发现自己Tarjan的板子有错误.发现可以用Map直接删去边,Get. 听说std是双连通.LCA.并查集.离线思想.用BIT维护dfs序和并查集维护LCA的动态缩点的好题 #include < ...
- BZOJ 2286 树链剖分+DFS序+虚树+树形DP
第一次学习虚树,就是把无关的点去掉.S里维护一条链即可. #include <iostream> #include <cstring> #include <cstdio& ...
- BZOJ 4326 树链剖分+二分+差分+记忆化
去年NOIP的时候我还不会树链剖分! 还是被UOJ 的数据卡了一组. 差分的思想还是很神啊! #include <iostream> #include <cstring> #i ...
- BZOJ 3110 树套树 && 永久化标记
感觉树套树是个非常高深的数据结构.从来没写过 #include <iostream> #include <cstdio> #include <algorithm> ...
- BZOJ 2282 & 树的直径
SDOI2011的Dayx第2题 题意: 在树中找到一条权值和不超过S的链(为什么是链呢,因为题目中提到“使得路径的两端都是城市”,如果不是链那不就不止两端了吗——怎么这么机智的感觉...),使得不在 ...
随机推荐
- Android中的Adapter总结
一.Adapter的介绍 An Adapter object acts as a bridge between an AdapterView and the underlying data for t ...
- OPEN资讯
http://www.open-open.com/news/view/1f55540 随着 Android 平台市场份额的持续猛增 , 越来越多的开发者开始投入 Android 应用程序的开发大潮.如 ...
- UVA 10341 二分搜索
Solve the equation:p ∗ e−x + q ∗ sin(x) + r ∗ cos(x) + s ∗ tan(x) + t ∗ x2 + u = 0where 0 ≤ x ≤ 1.In ...
- 小鲜肉初学JS做得仿京东淘宝竖排二级导航
<!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equ ...
- VS2010中打开VS2013/VS2012项目
VS2010中打开VS2013/VS2012项目 (2014-04-03 23:47:53) 转载▼ 分类: IT VS低版本打开高版本创建的项目时会提示"选择的文件是解决方案文件,但是 ...
- java连接access数据库
完整代码: package odbcj; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prep ...
- C语言一个简单的闹钟程序
#include <stdio.h> #include <stdbool.h> #include <Windows.h> ; i < ; ++i) { // ...
- 物联网操作系统Hello China V1.76(PC串口版)版本发布
作为向ARM平台移植的基线版本,经过三个多月的努力,Hello China V1.76终于完成并发布.相对原来发布的V1.75版本,该版本主要做了如下修改: 彻底去掉了原来版本源代码中的C++特性,采 ...
- WaitForSingleObject与WaitForMultipleObjects用法详解(好用,而且进入一个非常高效沉睡状态,只占用极少的CPU时间片)
在多线程下面,有时候会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects ...
- JavaWeb笔记——ajax异步请求
1. ajax是什么? * asynchronous javascript and xml:异步的js和xml * 它能使用js访问服务器,而且是异步访问 * 服务器给客户端的响应一般是 ...