bzoj 4448 [Scoi2015]情报传递(主席树,LCA)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=4448
【题意】
给定一颗树,询问一条路径上权值小于t-c的点数。
【思路】
将一个2查询的出现时间作为该点的权值,按照树的形态建主席树,然后将权值插入,线段树结点中记录该区间的所有点数。
对于一个1查询,即查询u,v路径上权值小于t-c的点数,t为查询的出现时间。在主席树上统计,设ans(x)表示T[x]中小于t-c的点数,答案为ans(u)+ans(v)-ans(lca(u,v))-ans(fa(lca(u,v)))。
【代码】
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int N = 2e5+; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
} struct Edge {
int v,nxt;
}e[N<<];
int en=,front[N];
void adde(int u,int v)
{
e[++en]=(Edge){v,front[u]}; front[u]=en;
} struct Tnode {
Tnode *ls,*rs;
int sum;
}*T[N],mempool[N*],*G=mempool; Tnode * Nw(Tnode*l,Tnode*r,int x) {
G->ls=l,G->rs=r,G->sum=x;
return G++;
}
Tnode* build(Tnode* p,int l,int r,int pos) {
int val=pos==? p->sum:p->sum+;
if(l==r)
return Nw(T[N-],T[N-],val);
else {
int mid=l+r>>;
if(pos<=mid) return Nw(build(p->ls,l,mid,pos),p->rs,val);
else return Nw(p->ls,build(p->rs,mid+,r,pos),val);
}
}
int query(Tnode* x,int l,int r,int pos)
{
if(l==r) { return x->sum; }
else {
int mid=l+r>>;
if(pos<=mid) return query(x->ls,l,mid,pos);
else return x->ls->sum+query(x->rs,mid+,r,pos);
}
} int n,m,tot,val[N],que[N][];
int top[N],son[N],siz[N],dep[N],fa[N]; void dfs1(int u,int father)
{
siz[u]=; son[u]=;
T[u]=build(T[father],,m,val[u]);
trav(u,i) if(e[i].v!=father) {
int v=e[i].v;
fa[v]=u;
dep[v]=dep[u]+;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>siz[son[u]]) son[u]=v;
}
}
void dfs2(int u,int tp)
{
top[u]=tp;
if(son[u]) dfs2(son[u],tp);
trav(u,i) if(e[i].v!=fa[u]&&e[i].v!=son[u])
dfs2(e[i].v,e[i].v);
}
int lca(int u,int v)
{
while(top[u]!=top[v]) {
if(dep[top[u]]<dep[top[v]]) swap(u,v);
u=fa[top[u]];
}
return dep[u]<dep[v]? u:v;
} int main()
{
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
n=read();
int rt=,op,x,y,z;
FOR(i,,n) {
x=read();
if(!x) rt=i;
else adde(x,i);
}
m=read();
FOR(i,,m) {
op=read();
if(op==)
x=read(),val[x]=i;
else {
++tot;
que[tot][]=read(),que[tot][]=read(),que[tot][]=read();
que[tot][]=i;
}
}
dep[rt]=;
T[]=Nw(G,G,);
T[N-]=Nw(G,G,);
dfs1(rt,);
dfs2(rt,rt);
FOR(i,,tot) {
x=que[i][],y=que[i][],z=que[i][];
int LCA=lca(x,y),ans=dep[x]+dep[y]-dep[LCA]-dep[fa[LCA]];
if(que[i][]-z-<=) printf("%d 0\n",ans);
else {
int tmp=;
tmp+=query(T[x],,m,que[i][]-z-);
tmp+=query(T[y],,m,que[i][]-z-);
tmp-=query(T[LCA],,m,que[i][]-z-);
tmp-=query(T[fa[LCA]],,m,que[i][]-z-);
printf("%d %d\n",ans,tmp);
}
}
return ;
}
bzoj 4448 [Scoi2015]情报传递(主席树,LCA)的更多相关文章
- bzoj 4448 [Scoi2015]情报传递 主席树
比较套路的题目. 可以发现难点在于某个点的权值动态修改 且我们要维护树上一条路径上的点权>x的个数. 每个点都在动态修改 这意味着我们的只能暴力的去查每个点. 考虑将所有可以动态修改的点变成静态 ...
- 【BZOJ4448】[Scoi2015]情报传递 主席树+LCA
[BZOJ4448][Scoi2015]情报传递 Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员能有若干名(可能没有)下线,除1名大头 ...
- BZOJ4448[Scoi2015]情报传递——主席树+LCA
题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有 若T名(可能没有)下线,除1名大头目外其余n-1名情报员有且仅有1名上线.奈特公司纪律森严 ...
- 4448: [Scoi2015]情报传递|主席树|离线操作
能够把全部的操作离线,然后树链剖分将全部人搜集情报的时间增加到主席树中,查询的时候能够直接查询搜集情报时间≤i−C[i]−1的人的个数 时间复杂度n∗log22n,空间复杂度n∗log2n #incl ...
- BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树
4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...
- bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4448 题面: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络 ...
- bzoj4448 [Scoi2015]情报传递 主席树+树上差分
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4448 题解 练习一下主席树的基础练习题找回感觉. 对于每一次询问,第一问显然随便做. 第二问的 ...
- 【bzoj4448】[Scoi2015]情报传递 主席树
题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有若T名(可能没有)下线,除1名大头日外其余n-1名情报员有且仅有1名上线.奈特公司纪律森严, ...
- 洛谷 4216 BZOJ 4448 [SCOI2015]情报传递
[题解] 每个情报员的危险值val[i]应该是一个分段函数,前面一段是平行于x轴的横线,后面一段是一次函数.我们可以用fx(t)=t-b[x]表示这个一次函数.每次询问一条链上fx(t)大于c的点的个 ...
随机推荐
- Ios 弹框 MJPopup,KxMenu
IOS 弹框 如果直接弹出一个自定义的视图 可以选用第三方: MJPopup 弹出: if(!bandview) { bandview=[[[NSBundle mainBundle]loadNibNa ...
- Hibernate逍遥游记-第10章 映射继承关系-001继承关系树中的每个具体类对应一个表
1. 2. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...
- 谈Delphi中SSL协议的应用(好多相关文章)
摘要:本文主要介绍如何在Delphi中使用SSL协议.一共分为七个部分:(1)SSL协议是什么?(2)Delphi中如何使用SSL协议?(3)SSL客户端编程实例.(4)SSL服务端编程实例.(5)S ...
- NewPascal(也许只是对FreePascal的一种封装)
NewPascal is a breath of fresh air and long tradition! NewPascal offers a ready-to-be-used and up-to ...
- Android:界面设计工具DroidDraw
DroidDraw是款强大的安卓界面设计软件,基于Java Swing开发,可以通过它拖动控件.设置层属性.设置颜色等步骤轻松地生成复杂的安卓XML布局文件. >>>>> ...
- C#基础(WinForm窗体的单例模式,避免窗体被实例化多次)
在MDI窗体中使用单例模式可以有效的避免同个窗体被实例化多次 [csharp] view plain copy //==============字窗体的修改================ // ...
- P25、面试题1:赋值运算符函数
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString { public: CMyString(char* pData = NULL); CMyStr ...
- 安卓自动化测试工具MonkeyRunner之使用ID进行参数化,以及List选择某项和弹出框点击确定的写法
一.List选择某项的操作步骤: 1.通过父结点得出列表各子项 2.将选择项的文本与列表中的子项进行比较 3.计算出选择项的坐标位置 截取实例: from com.android.monkeyrunn ...
- poj 3101 Astronomy (java 分数的最小公倍数 gcd)
题目链接 要用大数,看了别人的博客,用java写的. 题意:求n个运动周期不完全相同的天体在一条直线上的周期. 分析:两个星球周期为a,b.则相差半周的长度为a*b/(2*abs(a-b)),对于n个 ...
- 函数buf_page_hash_get_low
/******************************************************************//** Returns the control block of ...