Description

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

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

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

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

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

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

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

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

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

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

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

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

解题报告:

用时:1h,2WA

和上题类似,这里的风险控制值实质上是询问开始收集情报时刻小于 \(i-c\) 的节点,所以我们就以天数为下标建立主席树,然后查询路径直接用树链剖分查找即可

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=200005;
int head[N],num=0,nxt[N<<1],to[N<<1],n,m,fa[N];
void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
struct question{int x,y,c;}q[N];int mt=0,tx[N],root[N];
int dep[N],top[N],DFN=0,id[N],sz[N],son[N];
void dfs1(int x){
int u;sz[x]=1;
for(int i=head[x];i;i=nxt[i]){
u=to[i];if(dep[u])continue;
dep[u]=dep[x]+1;fa[u]=x;
dfs1(u);
sz[x]+=sz[u];
if(sz[u]>sz[son[x]])son[x]=u;
}
}
void dfs2(int x,int tp){
top[x]=tp;id[x]=++DFN;
if(son[x])dfs2(son[x],tp);
for(int i=head[x];i;i=nxt[i])
if(to[i]!=son[x] && to[i]!=fa[x])dfs2(to[i],to[i]);
}
int totnode=0;
struct node{int l,r,s;}t[N*80];
void updata(int &rt,int last,int l,int r,int sa){
rt=++totnode;t[rt]=t[last];
if(l==r){t[rt].s++;return ;}
int mid=(l+r)>>1;
if(sa>mid)updata(t[rt].r,t[last].r,mid+1,r,sa);
else updata(t[rt].l,t[last].l,l,mid,sa);
t[rt].s=t[t[rt].l].s+t[t[rt].r].s;
}
int query(int rt,int l,int r,int sa,int se){
if(l>se || r<sa)return 0;
if(sa<=l && r<=se)return t[rt].s;
int mid=(l+r)>>1;
return query(t[rt].l,l,mid,sa,se)+query(t[rt].r,mid+1,r,sa,se);
}
void solve(int x,int y,int co){
int ret=0,dist=dep[x]+dep[y];
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
if(co>0)ret+=query(root[co],1,n,id[top[x]],id[x]);
x=fa[top[x]];
}
if(id[x]>id[y])swap(x,y);
if(co>0)ret+=query(root[co],1,n,id[x],id[y]);
dist-=dep[x]<<1;
printf("%d %d\n",dist+1,ret);
}
void work()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&fa[i]);
if(fa[i])link(fa[i],i),link(i,fa[i]);
}
scanf("%d",&m);
int flag;
for(int i=1;i<=m;i++){
scanf("%d",&flag);
if(flag==1){
mt++;scanf("%d%d%d",&q[mt].x,&q[mt].y,&q[mt].c);
q[mt].c=i-q[mt].c-1;
}
else scanf("%d",&tx[i]);
}
dep[1]=1;dfs1(1);dfs2(1,1);
for(int i=1;i<=m;i++){
if(!tx[i])root[i]=root[i-1];
else updata(root[i],root[i-1],1,n,id[tx[i]]);
}
for(int i=1;i<=mt;i++)
solve(q[i].x,q[i].y,q[i].c);
} int main()
{
work();
return 0;
}

bzoj 4448: [Scoi2015]情报传递的更多相关文章

  1. BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树

    4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...

  2. bzoj 4448 [Scoi2015]情报传递(主席树,LCA)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4448 [题意] 给定一颗树,询问一条路径上权值小于t-c的点数. [思路] 将一个2查 ...

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

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

  4. 洛谷 4216 BZOJ 4448 [SCOI2015]情报传递

    [题解] 每个情报员的危险值val[i]应该是一个分段函数,前面一段是平行于x轴的横线,后面一段是一次函数.我们可以用fx(t)=t-b[x]表示这个一次函数.每次询问一条链上fx(t)大于c的点的个 ...

  5. bzoj 4448 [Scoi2015]情报传递 主席树

    比较套路的题目. 可以发现难点在于某个点的权值动态修改 且我们要维护树上一条路径上的点权>x的个数. 每个点都在动态修改 这意味着我们的只能暴力的去查每个点. 考虑将所有可以动态修改的点变成静态 ...

  6. 4448: [Scoi2015]情报传递|主席树|离线操作

    能够把全部的操作离线,然后树链剖分将全部人搜集情报的时间增加到主席树中,查询的时候能够直接查询搜集情报时间≤i−C[i]−1的人的个数 时间复杂度n∗log22n,空间复杂度n∗log2n #incl ...

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

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

  8. BZOJ_4448_[Scoi2015]情报传递_主席树

    BZOJ_4448_[Scoi2015]情报传递_主席树 Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有 若T名(可能没有) ...

  9. 【BZOJ4448】[Scoi2015]情报传递 主席树+LCA

    [BZOJ4448][Scoi2015]情报传递 Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员能有若干名(可能没有)下线,除1名大头 ...

随机推荐

  1. UI事务重叠引发的crash

    在ios开发的世界里,通过动画来切换界面使我们早就习以为常的事情,但动画将一个原本同步执行的事务,变成一个异步事务,并由此引发了一系列的陷阱. 最近对公司产品的crashlytics报告进行了一些分析 ...

  2. nyoj 背包问题

    背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w< ...

  3. 接触JS的变量

    刚刚接触到js,写的代码都是很简单的,制单的概念也相当少,新学习的就是变量.let和const以及js的数据类型. 变量的内容有五个,我就不一一介绍了,重点在于: 在 JavaScript 中,使用变 ...

  4. LightningChart最新版 v.8.3 全新发布,新功能使用教程。

    LightningChart最新版v.8.3全新发布,主要介绍以下五个新功能及使用教程.   1. 网格模型,三角鼠标追踪 Tracing MeshModels with mouse. Traced ...

  5. python 人工智能资源推荐

    原创 2017-06-05 玄魂工作室 玄魂工作室 我翻了翻我自己曾经看过的书,还是放弃了推荐.原因很简单,我对这个领域并不是很熟悉,我来推荐资源有点误人子弟.so,简单推点其他人建议给我的内容,希望 ...

  6. VS 2008 开发WinCE程序 编译部署速度慢的解决办法

    1.找到以下文件 C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.Common.targets 2.用记事本打开该 ...

  7. SpringBoot14 SpringBoot整合mybatis

    1 版本说明 springboot:2.0 jdk:1.8 2 创建springBoot项目 创建项目时勾选必要web,MySQL,mybatis相关依赖 创建完成后再pom文件中添加自动部署.lom ...

  8. 用Vue.js开发微信小程序:开源框架mpvue解析

    前言 mpvue 是一款使用 Vue.js 开发微信小程序的前端框架.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为 H5 和小程序提供了代码复用的能力.如果想将 H5 项目改造为小程 ...

  9. Python内置函数(6)——round

    英文文档: round(number[, ndigits]) Return the floating point value number rounded to ndigits digits afte ...

  10. 访问远程的docker

        docker version vim /etc/default/docker DOCKER_OPTS="  -Label name=dockerserver2" docke ...