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的点的个 ...
随机推荐
- POSIX semaphore: sem_open, sem_close, sem_post, sem_wait
http://www.cnblogs.com/BloodAndBone/archive/2011/01/18/1938552.html 一.Posix有名信号灯 1.posix有名信号灯函数 函数se ...
- 实例学习写Makefile文件
目录 0. 扫盲 1. 编译,链接 2. Makefile文件执行 3. Makefile书写规则 4. 案例 5. Makefile是如何工作的 6. 拔高,参考 0. 扫盲 Linux 环境下的程 ...
- Web应用程序简介
1.HTTP通讯协议 根据联机方式与所使用的网络服务不同,会有不同的通信协议.例如,发送信件时会使用SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),传输文件会 ...
- 解决Cygwin中vim的backspace不能正常使用(转)
转载于:http://blog.chinaunix.net/uid-20614631-id-1914849.html 亲测可用 先把Cygwin下载下来,想在linux下编程的话一定要安装vim,g ...
- Hibernate学习笔记(1)
1 使用Hibernate (1)创建User Library,命名为HIBERNATE3,加入需要的jar (2)创建hibernate配置文件hibernate.cfg.xml, 为了便于调试最好 ...
- selenium--大家庭介绍
安装好配置环境后,开始我的selenium之旅.简单的了解一下色,selenium大家庭的组成. Selenium是ThoughtWorks专门为 Web 应用而开发的功能测试工具.Selenium使 ...
- 修改tabbarcontroller选中图片及选中颜色
1.修改选中图片: UITabBarItem* item = [self.tabBarController.tabBar.items objectAtIndex:1]; //从0开始 item.s ...
- bzoj2466: [中山市选2009]树
同上一题.(应该可以树形dp,然而我不会... #include<cstdio> #include<cstring> #include<iostream> #inc ...
- Windows SDK 实现不规则窗口介绍
不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的 ...
- UVA 10917 Walk Through the Forest(dijkstra+DAG上的dp)
用新模板阿姨了一天,换成原来的一遍就ac了= = 题意很重要..最关键的一句话是说:若走A->B这条边,必然是d[B]<d[A],d[]数组保存的是各点到终点的最短路. 所以先做dij,由 ...