情报传递(message)
情报传递(message)
题目描述
奈特公司是一个巨大的情报公司,它有着庞大的情报网络,情报网络中共有n名情报员。每名情报员可能有若干名(可能没有)下线,除1名大头目外其余n-1名情报员有且仅有1名上线。奈特公司纪律森严,每名情报员只能与自己的上、下线联系,同时,情报网络中任意两名情报员一定能够通过情报网络传递情报。
奈特公司每天会派发以下两种任务中的一个任务:
1、搜集情报:指派T号情报员搜集情报
2、传递情报:将一条情报从X号情报员传递至Y号情报员
情报员最初处于潜伏阶段,他们是相对安全的,我们认为此时所有情报员的危险值为0;一旦某个情报员开始搜集情报,他的危险值就会持续增加,每天增加1点危险值(开始搜集情报的当天危险值仍为0,第2天危险值为1,第3天危险值为2,以此类推)。传递情报并不会使情报员的危险值增加。
为了保证传递情报的过程相对安全,每条情报都有一个风险控制值C。奈特公司认为,参与传递这条情报的所有情报员中,危险值大于C的情报员将对这条情报构成威胁。现在,奈特公司希望知道,对于每个传递情报任务,参与传递的情报员有多少个,其中对这条情报构成威胁的情报员有多少个。
第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,表示搜集情报的情报员编号。
solution
首先把询问离线。
可以发现如果一个有威胁的人应该在T-c[i]时刻之前就开始收集
按时间为下标,每个点建主席树。
第k棵树的每个值表示时间i,k到根的路径上是否有点出现
由于离线,我们就一开始全部建完。
效率O(nlogn)
xjq神犇用树状数组切掉
把询问按T-c排序,用树剖序作下标建树状数组
按时间把点和询问加入
常数贼小orz
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 200005
using namespace std;
int n,Q,f[maxn][22],head[maxn],t1,t2,tot,deep[maxn];
int ti[maxn],root[maxn],cnt;
struct node{
int v,nex;
}e[maxn*2];
struct Que{
int op,x,y,c;
}q[maxn];
struct Node{
int x,ls,rs;
}tree[maxn*20];
void lj(int t1,int t2){
e[++tot].v=t2;e[tot].nex=head[t1];head[t1]=tot;
}
void wh(int k){
tree[k].x=tree[tree[k].ls].x+tree[tree[k].rs].x;
}
void build(int &k,int la,int l,int r,int pl){
if(!k)k=++cnt;
if(l==r){tree[k].x=tree[la].x+1;return;}
int mid=l+r>>1;
if(pl<=mid)tree[k].rs=tree[la].rs,build(tree[k].ls,tree[la].ls,l,mid,pl);
else tree[k].ls=tree[la].ls,build(tree[k].rs,tree[la].rs,mid+1,r,pl);
wh(k);
}
void dfs(int k){
int fa=f[k][0];deep[k]=deep[fa]+1;
if(ti[k])build(root[k],root[fa],1,Q,ti[k]);
else root[k]=root[fa];
for(int i=head[k];i;i=e[i].nex){
if(e[i].v!=fa)dfs(e[i].v);
}
}
int L(int x,int y){
if(deep[x]<deep[y])swap(x,y);
for(int i=20;i>=0;i--)if(deep[f[x][i]]>=deep[y])x=f[x][i];
for(int i=20;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
if(x==y)return x;
return f[x][0];
}
int ask(int t1,int t2,int t3,int t4,int l,int r,int pl){
if(pl<=0)return 0;
if(l==r)return tree[t1].x+tree[t2].x-tree[t3].x-tree[t4].x;
int mid=l+r>>1;
int s1=tree[t1].ls,s2=tree[t2].ls,s3=tree[t3].ls,s4=tree[t4].ls;
if(mid<pl){
int tmp=tree[s1].x+tree[s2].x-tree[s3].x-tree[s4].x;
s1=tree[t1].rs,s2=tree[t2].rs,s3=tree[t3].rs,s4=tree[t4].rs;
return tmp+ask(s1,s2,s3,s4,mid+1,r,pl);
}
else return ask(s1,s2,s3,s4,l,mid,pl);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&f[i][0]);
lj(f[i][0],i);
}
for(int j=1;j<=20;j++)
for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];
cin>>Q;
for(int i=1;i<=Q;i++){
scanf("%d",&q[i].op);
if(q[i].op==1)scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].c);
else {
scanf("%d",&q[i].c);
if(!ti[q[i].c])ti[q[i].c]=i;
}
}
dfs(1);
for(int i=1;i<=Q;i++){
if(q[i].op==2)continue;
int lca=L(q[i].x,q[i].y);
printf("%d ",deep[q[i].x]+deep[q[i].y]-deep[lca]-deep[f[lca][0]]);
printf("%d\n",ask(root[q[i].x],root[q[i].y],root[lca],root[f[lca][0]],1,Q,i-q[i].c-1));
}
return 0;
}
情报传递(message)的更多相关文章
- bzoj4448 SCOI2015 情报传递 message
传送门bzoj4448 题解 离线之后构建树上主席树,每个点的线段树维护到根路径的信息,不用链剖(我的链剖只是拿来求\(\mathrm{lca}\)的),时空复杂度\(O(n\log{n})\). c ...
- Eclipse 4.2 failed to start after TEE is installed
--------------- VM Arguments--------------- jvm_args: -Dosgi.requiredJavaVersion=1.6 -Dhelp.lucene ...
- ABP文档 - Javascript Api - Message
本节内容: 显示信息 确认 Message API给用户显示一个信息,或从用户那里获取一个确认信息. Message API默认使用sweetalert实现,为使sweetalert正常工作,你应该包 ...
- 代码的坏味道(20)——过度耦合的消息链(Message Chains)
坏味道--过度耦合的消息链(Message Chains) 特征 消息链的形式类似于:obj.getA().getB().getC(). 问题原因 如果你看到用户向一个对象请求另一个对象,然后再向后者 ...
- java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE
Android发出HTTP请求时出现了这个错误: java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INST ...
- POJ2774 Long Long Message [后缀数组]
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 29277 Accepted: 11 ...
- Android消息处理机制(Handler、Looper、MessageQueue与Message)
Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...
- Logstash时区、时间转换,message重组
适用场景 获取日志本身时间 日志时间转Unix时间 重组message 示例日志: hellow@,@world@,@2011-11-01 18:46:43 logstash 配置文件: input{ ...
- Kafka消息时间戳(kafka message timestamp)
最近碰到了消息时间戳的问题,于是花了一些功夫研究了一下,特此记录一下. Kafka消息的时间戳 在消息中增加了一个时间戳字段和时间戳类型.目前支持的时间戳类型有两种: CreateTime 和 L ...
随机推荐
- PHP自动生成分页链接
page.class.php <?php class Page { // 分页栏每页显示的页数 public $rollPage = 5; // 页数跳转时要带的参数 public $param ...
- Shell学习——数值运算
在Bash shell中,可以利用let.(( )).[]执行基本的算术操作,在高级操作时,使用expr和bc两个工具1.let[root@client02 ~]# no1=4[root@client ...
- Python基本数据类型及使用
# 基本数据类型分类 - int 整数 - float 小数 - bool 布尔值 - str 字符串 ## int 整数 - 包括正整数和负整数 - 与java.c等语言相比并没有位数限制,理论上可 ...
- PHP生成特定长度的纯字母字符串
PHP中,md5().uniqid()函数可以返回32位和13位不重复的字符串,但是这些字符串都可能包含有数字.如果需要纯字母的字符串,而且长度不定,比如8位,那么直接用这两个函数无法达到效果. 这时 ...
- 学习python第十一天,函数3 函数的序列化和反序列化
我们把变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unp ...
- python3爬取咪咕音乐榜信息(附源代码)
参照上一篇爬虫小猪短租的思路https://www.cnblogs.com/aby321/p/9946831.html,继续熟悉基础爬虫方法,本次爬取的是咪咕音乐的排名 咪咕音乐榜首页http://m ...
- Pandas 索引和切片
Series和Datafram索引的原理一样,我们以Dataframe的索引为主来学习 列索引:df['列名'] (Series不存在列索引) 行索引:df.loc[].df.iloc[] 选择列 / ...
- 12,nginx+uWSGI+django+virtualenv+supervisor发布web服务器
导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) 基于wsgi运行的框架 ...
- P2285 [HNOI2004]打鼹鼠
P2285 [HNOI2004]打鼹鼠 题目描述 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某 ...
- springboot遇见问题总结
今天开始学习创建springboot项目 问题1: 产生异常: 创建项目目录: demo代码: 代码Controller import org.springframework.web.bind.ann ...