4448: [Scoi2015]情报传递

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 588  Solved: 308
[Submit][Status][Discuss]

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

首先说明因为是寻找危险度大于C的,那么就相当于是往前面移动C天,因此我们就只需要寻找1~i-c-1就好了。然后也相当于每天都对某一个节点进行染色。当然,dfs序和树链剖分的最主要的思想还是要去重

思路一:dfs序+主席树,类似于bzoj 2588

每次都是按照:root[x] + root[y] - root[lca] - root[par[lca][0]]即可哦

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = 2e5 + ;
struct Tree{
int lnub, rnub, sum;
Tree(int l = , int r = , int s = ): lnub(l), rnub(r), sum(s){}
}tree[maxn * ];
int deep[maxn], par[maxn][], root[maxn], day[maxn];
vector<int> G[maxn];
int n, m, tot;
int ty[maxn], x[maxn], y[maxn], c[maxn];
/*
由于每次询问都是询问危险值为c的,所以我们就要往前面走c+1天,表示在c+1天之前染色的数目。
我们可以发现,我们只要储存每次特工的开始的时间就好了。然后离线查询即可发现
*/ int update(int o, int l, int r, int pos){
int k = ++tot;
tree[k] = tree[o]; tree[k].sum++;
if (l == r && l == pos) return k;
int mid = (l + r) / ;
if (pos <= mid) tree[k].lnub = update(tree[o].lnub, l, mid, pos);
if (pos > mid) tree[k].rnub = update(tree[o].rnub, mid + , r, pos);
return k;
} void dfs(int u, int fa, int road){
deep[u] = road; par[u][] = fa;
root[u] = root[fa];
if (day[u]) root[u] = update(root[fa], , m, day[u]);
for (int i = ; i <= ; i++){
if (road < ( << i)) break;
par[u][i] = par[par[u][i - ]][i - ];
}
for (int i = ; i < G[u].size(); i++){
int v = G[u][i];
if (v == fa) continue;
dfs(v, u, road + );
}
} int get_lca(int x, int y){
if (deep[x] < deep[y]) swap(x, y);
int delta = deep[x] - deep[y];
for (int i = ; i <= ; i++){
if (delta & ( << i)) x = par[x][i];
}
if (x == y) return x;
for (int i = ; i >= ; i--){
if (par[x][i] != par[y][i])
x = par[x][i], y = par[y][i];
}
return par[x][];
} int query(int o, int l, int r, int ql, int qr){
if (ql > qr) return ;
if (ql <= l && qr >= r) return tree[o].sum;
int ans = ;
int mid = (l + r) / ;
if (ql <= mid) ans += query(tree[o].lnub, l, mid, ql, qr);
if (qr > mid) ans += query(tree[o].rnub, mid + , r, ql, qr);
return ans;
} void solve(){
for (int i = ; i <= m; i++){
if (ty[i] == ){
int lca = get_lca(x[i], y[i]), old = par[lca][];
int ans = deep[x[i]] + deep[y[i]] - deep[lca] - deep[old];
printf("%d ", ans);
ans = ;
int k = i - c[i] - ;
ans += query(root[x[i]], , m, , k);
ans += query(root[y[i]], , m, , k);
ans -= query(root[lca], , m, , k);
if (old) ans -= query(root[old], , m, , k);
printf("%d\n", ans);
}
}
} int main(){
scanf("%d", &n);
int rt;
for (int i = ; i <= n; i++){
int fa; scanf("%d", &fa); int v = i;
if (fa == ){rt = i; continue;}
G[fa].pb(v), G[v].pb(fa);
}
scanf("%d", &m);
for (int i = ; i <= m; i++){
scanf("%d", ty + i);
if(ty[i] == )
scanf("%d%d%d", x + i, y + i, c + i);
else {
int T; scanf("%d", &T); day[T] = i;
}
}
dfs(rt, , );
solve();
return ;
}

思路二:树链剖分+主席树 (这玩意儿到现在没看懂,明天再弄)

主席树呢,是按照dfstime来对每个,root[i]保存的是目前dfstime的时间。然后所以每次询问呢,

都是query(root[pos[belong[x]] - 1]], root[pos[x]], 1, m, c)

思路三:线段树套线段树 = =还没看,在说吧

dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. [FJOI2014]最短路径树问题 长链剖分

    [FJOI2014]最短路径树问题 LG传送门 B站传送门 长链剖分练手好题. 如果你还不会长链剖分的基本操作,可以看看我的总结. 这题本来出的很没水平,就是dijkstra(反正我是不用SPFA)的 ...

随机推荐

  1. lintcode-512-解码方法

    512-解码方法 有一个消息包含A-Z通过以下规则编码 'A' -> 1 'B' -> 2 ... 'Z' -> 26 现在给你一个加密过后的消息,问有几种解码的方式 样例 给你的消 ...

  2. lintcode-392-打劫房屋

    392-打劫房屋 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自 ...

  3. virsh 命令行管理虚拟机

    重用命令和选项 1:查看运行的虚拟机 virsh list   2:查看所有的虚拟机(关闭和运行的虚拟机) virsh list --all   3:连接虚拟机 virsh console +域名(虚 ...

  4. WebService(一)

    1.简介 Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用 ...

  5. MMU 和 MPU的区别

    S3C2440里面带的是MMU,而现在流行的Cortex-M3/4 里面带的是MPU. MMU vs MPU 内存是现代计算机最重要的组件之一.因此,它的内容不能被任何错误的应用所篡改.这个功能可以通 ...

  6. 关于初装kali linux 2.0时DEB文件安装失败的问题

    kali linux 是一个基于debian 的linux发行版本,支持deb文件格式的图形化安装. 刚装上kali linux时安装程序总是失败,提示处理时错误. 经过一番爬贴,是软件源的原因,解决 ...

  7. Spring Boot 学习笔记 - 01

    看了[纯洁的微笑]的博客后,我决定开始学好 Spring 体系了,真的是解决了饥渴的我.

  8. SQL Server Management Studio(SSMS)的使用与配置整理

    目录 目录 SQL Server Management Studio的使用与配置 1 设置SSMS显示行号 2 添加注释与取消注释的快捷键 3 新建查询的快捷键 4 开启sql语句TIME与IO的统计 ...

  9. 【Mybatis】Mybatis的sql模糊查询

    这个网站中有很多方法.https://code.google.com/p/mybatis/issues/detail?id=85 自己试验了如下的方法. 1.  参数中直接加入%% param.set ...

  10. 用户缓冲式I/O

    2018-08-05 (星期日)缓冲式I/O    所有磁盘操作都是按照块来进行的,因此,若所送出的I/O请求,其对齐块便捷为实际块大小的整数倍,则可以优化I/O的性能.    读取操作需要进行的系统 ...