4448: [Scoi2015]情报传递

题目连接:

http://www.lydsy.com/JudgeOnline/problem.php?id=4448

Description

奈特公司是一个巨大的情报公司,它有着庞大的情报网络。情报网络中共有n名情报员。每名情报员口J-能有

若T名(可能没有)下线,除1名大头日外其余n-1名情报员有且仅有1名上线。奈特公司纪律森严,每

名情报员只能与自己的上、下线联系,同时,情报网络中仟意两名情报员一定能够通过情报网络传递情报。

奈特公司每天会派发以下两种任务中的一个任务:

1.搜集情报:指派T号情报员搜集情报

2.传递情报:将一条情报从X号情报员传递给Y号情报员

情报员最初处于潜伏阶段,他们是相对安全的,我们认为此时所有情报员的危险值为0;-旦某个情报员开

始搜集情报,他的危险值就会持续增加,每天增加1点危险值(开始搜集情报的当天危险值仍为0,第2天

危险值为1,第3天危险值为2,以此类推)。传递情报并不会使情报员的危险值增加。

为了保证传递情报的过程相对安全,每条情报都有一个风险控制值C。余特公司认为,参与传递这条情

报的所有情报员中,危险值大于C的情报员将对该条情报构成威胁。现在,奈特公司希望知道,对于每

个传递情报任务,参与传递的情报员有多少个,其中对该条情报构成威胁的情报员有多少个。

Input

第1行包含1个正整数n,表示情报员个数。

笫2行包含n个非负整数,其中第i个整数Pi表示i号情报员上线的编号。特别地,若Pi=0,表示i号

情报员是大头目。

第3行包含1个正整数q,表示奈特公司将派发q个任务(每天一个)。

随后q行,依次描述q个任务。

每行首先有1个正整数k。若k=1,表示任务是传递情报,随后有3个正整数Xi、Yi、Ci,依次表示传递

情报的起点、终点和风险控制值;若k=2,表示任务是搜集情报,随后有1个正整数Ti,表示搜集情报的

情报员编号。

Output

对于每个传递情报任务输出一行,应包含两个整数,分别是参与传递情报的情报员个数和对该条情报构成威胁的情报员个数。

输出的行数应等于传递情报任务的个数,每行仅包含两个整数,用一个空格隔开。输出不应包含多余的空行和空格。

Sample Input

7

0 1 1 2 2 3 3

6

1 4 7 0

2 1

2 4

2 7

1 4 7 1

1 4 7 3

Sample Output

5 0

5 2

5 1

Hint

对于3个传递情报任务,都是经过5名情报员,分别是4号、2号、1号、3号和7号。其中,对于第1个

任务,所有情报员(危险值为0)都不对情报构成威胁;对于第2个任务,有2名情报员对情报构成威胁,

分别是1号情报员(危险值为3)和4号情报员(危险值为2),7号情报员(危险值为1)并不构成威胁;

对于第3个任务,只有1名情报员对情报构成威胁。

n< = 2×10^5,Q< = 2×105,0< Pi,C!< = N, 1< = Ti,Xi,Yi< = n

题意

题解:

离线之后,把2操作全部更新之后

1操作就变成查询链(x,y)上面,有多少个小于等于i-c[i]-1就完了

这个智障题就熟练剖分+主席树莽一波好啦

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
vector<int>E[maxn];
int n,m,cnt,l[maxn*20],r[maxn*20],fa[maxn],top[maxn],sz[maxn],deep[maxn],id[maxn],son[maxn],root[maxn*20],sum[maxn*20],x[maxn],y[maxn],c[maxn],op,cnt2,t[maxn],rh[maxn];
void add(int x,int y)
{
if(x==0||y==0)return;
E[x].push_back(y);
E[y].push_back(x);
}
void dfs(int x,int f)
{
sz[x]=1;fa[x]=f;
for(int i=0;i<E[x].size();i++)
{
int v=E[x][i];
if(v==f)continue;
deep[v]=deep[x]+1;
dfs(v,x);
sz[x]+=sz[v];
if(sz[v]>sz[son[x]])son[x]=v;
}
}
void dfs2(int x,int f)
{
id[x]=++cnt;top[x]=f;rh[cnt]=x;
if(son[x])dfs2(son[x],f);
for(int i=0;i<E[x].size();i++)
{
int v=E[x][i];
if(v==fa[x]||v==son[x])continue;
dfs2(v,v);
}
}
void update(int pre,int &x,int ll,int rr,int v)
{
x=++cnt;l[x]=l[pre],r[x]=r[pre];sum[x]=sum[pre]+1;
if(ll==rr)return;
int mid=ll+rr>>1;
if(v<=mid)update(l[pre],l[x],ll,mid,v);
else update(r[pre],r[x],mid+1,rr,v);
}
int query(int x,int y,int c)
{
int L=root[x-1],R=root[y],ll=1,rr=m,res=0;
while(ll!=rr)
{
int mid=ll+rr>>1;
if(c<=mid)L=l[L],R=l[R],rr=mid;
else res+=sum[l[R]]-sum[l[L]],L=r[L],R=r[R],ll=mid+1;
}
res+=(c>=ll?sum[R]-sum[L]:0);
return res;
}
void solve(int x,int y,int c)
{
int ans=0;int tmp=deep[x]+deep[y];
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]])swap(x,y);
ans+=query(id[top[x]],id[x],c);x=fa[top[x]];
}
if(deep[x]<deep[y])swap(x,y);
ans+=query(id[y],id[x],c);
printf("%d %d\n",tmp-2*deep[y]+1,ans);
}
int main()
{
n=read();
for(int i=1;i<=n;i++)add(read(),i);
dfs(1,1);dfs2(1,1);
m=read();
for(int i=1;i<=n;i++)t[i]=m;
for(int i=1;i<=m;i++)
{
if(read()==1)x[cnt2]=read(),y[cnt2]=read(),c[cnt2++]=i-read()-1;
else t[read()]=i;
}
for(int i=1;i<=n;i++)update(root[i-1],root[i],1,m,t[rh[i]]);
for(int i=0;i<cnt2;i++)solve(x[i],y[i],c[i]);
}

BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树的更多相关文章

  1. dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448

    4448: [Scoi2015]情报传递 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 588  Solved: 308[Submit][Status ...

  2. bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4448 题面: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络 ...

  3. Codechef FIBTREE 树链剖分 主席树 LCA 二次剩余 快速幂

    原文链接https://www.cnblogs.com/zhouzhendong/p/CC-FIBTREE.html 题目传送门 - CC-FIBTREE 题意 给定一个有 $n$ 个节点,初始点权都 ...

  4. BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链 ...

  5. [GDOI2016][树链剖分+主席树]疯狂动物城

    题面 Description Nick 是只在动物城以坑蒙拐骗为生的狐狸,儿时受到偏见的伤害,放弃了自己的理想.他被兔子 Judy 设下圈套,被迫与她合作查案,而卷入意想不到的阴谋,历尽艰险后成为搭档 ...

  6. HDU 5111 Alexandra and Two Trees 树链剖分 + 主席树

    题意: 给出两棵树,每棵树的节点都有一个权值. 同一棵树上的节点的权值互不相同,不同树上节点的权值可以相同. 要求回答如下询问: \(u_1 \, v_1 \, u_2 \, v_2\):询问第一棵树 ...

  7. 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治

    LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...

  8. BZOJ3531 SDOI2014 旅行 - 树链剖分,主席树

    题意:给定一棵树,树上每个点有权值和类型.支持:修改某个点的类型:修改某个点的权值:询问某条链上某个类型的点的和/最大值.点数/类型数/询问数<=100000. 分析: 树链剖分,对每个类型的点 ...

  9. BZOJ4012 HNOI2015开店(树链剖分+主席树)

    考虑这样一个问题:一棵树初始全是白点,有两种操作:把一个点染黑:询问某点到所有黑点的距离之和. 注意到树上两点x和y的距离为depth[x]+depth[y]-depth[lca(x,y)]*2.要求 ...

随机推荐

  1. sql的主键,int类型,自增,自动编号到了规定最大数,接下来数据库会怎么做

    答案:它会从1开始重新编号,但是避开已经重复的值.

  2. python基础--面向对象

    什么是面向对象编程 OOP编程是利用“类”和对象来创建各种模型来实现对真实世界的描述. OOP具有可维护性和可扩展性 二:面向对象有那些特性 1)CLASS类:一个类是对拥有相同属性的对象的抽象.类拥 ...

  3. 简单的TCP接受在转发到客户端的套接口

    //功能:客服端发送tcp包,服务器接受到并打印出来,并将包转换为大写后到客户端//2015.9.10成功 #include <stdio.h>#include <sys/socke ...

  4. 5 个非常有用的 Laravel Blade 指令,你用过哪些?

    接下来我将带大家认识下五个 Laravel Blade 指令,这些指令将让你在解决特定问题时如虎添翼.如果你是刚接触 Laravel 的用户,这些小技巧能带你认识到 Laravel Blade 模板引 ...

  5. 一步一步学习IdentityServer3 (11) OAuth2

    OAuth中定义了四个Role 资源所有者:这里可以理解为一个用户 资源服务器:如同前面章节中的 Web站点或者WebApi 服务资源站点 客户端:这里是Client,如同Identityserver ...

  6. Monaco Editor 使用入门

    以前项目是用ace编辑器的,但是总有些不敬人意的地方.前端事件看见的VS Code编辑器Monaco Editor准备更换下,下面介绍一些使用中遇到的一点问题.代码提示 1.项目引用 import * ...

  7. jquery省市区三级联动(数据来源国家统计局官网)内附源码下载

    很久很久没有写博了. 今天更新了项目的省市区三级联动数据,更新后最新的海南三沙都有,分享给所有需要的小伙伴们... JQUERY + JSON,无数据库,纯JS代码,无加密,无压缩,可直接使用在任何项 ...

  8. matplotlib使用总结

    一.简介 Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形.通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图 ...

  9. PHP开发命名规范

    命名规范 ThinkPHP5遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范: 目录和文件 目录使用小写+下划线: 类库.函数文件统一以.php为后缀: 类的文件名均以命名空间定义,并 ...

  10. synchronized锁优化

    1.自旋锁和自适应自旋锁 sync在JDK1.6之前之所以被称为重量级锁,是因为对于互斥同步的性能来说,影响最大的就是阻塞的实现.挂起线程与恢复线程的操作都需要转入内核态中完成.从用户态转入内核态是比 ...