【BZOJ4448】【SCOI2015】情报传递
这题面错别字真tm多
题意:
Description
Input
Output
题解:
数据结构学傻了->树剖随便做!
其实树剖的确可以做。。。虽然多了一个$log$但是数据范围小+常数小所以能过。。。
正解是树上主席树(新套路get)
先离线,然后危险值大于$C_i$的点的个数就是在$C_i-i$的时间之前开始收集情报的点的个数;
然后可以建一颗权值主席树,维护某段时间内的点个数。
每个点$x$在$fa[x]$上建主席树,然后查询的时候答案就是
$sum[x]+sum[y]-sum[lca(x,y)]-sum[fa[lca(x,y)]]$
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
struct edge{
int v,next;
}a[];
struct node{
int v,ls,rs;
}t[];
struct task{
int x,y,c,id;
}p[];
int n,m,f,rt,op,x,tot=,cnt=,tim=,pts=,head[],rts[],num[],dfn[],nmd[],dep[],fa[][];
void add(int u,int v){
a[++tot].v=v;
a[tot].next=head[u];
head[u]=tot;
}
void dfs(int u,int dpt){
dfn[u]=++tim;
nmd[tim]=u;
dep[u]=dpt;
for(int i=;i<=;i++)fa[u][i]=fa[fa[u][i-]][i-];
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
dfs(v,dpt+);
}
}
int lca(int u,int v){
if(dep[u]<dep[v])swap(u,v);
int l=dep[u]-dep[v];
for(int i=;i>=;i--){
if((<<i)&l){
u=fa[u][i];
}
}
if(u==v)return u;
for(int i=;i>=;i--){
if(fa[u][]!=fa[v][]){
u=fa[u][],v=fa[v][];
}
}
return fa[u][];
}
void updata(int l,int r,int &u,int k,int x){
u=++cnt;
t[u].ls=t[k].ls;
t[u].rs=t[k].rs;
t[u].v=t[k].v+;
if(l==r)return;
int mid=(l+r)/;
if(x<=mid)updata(l,mid,t[u].ls,t[k].ls,x);
else updata(mid+,r,t[u].rs,t[k].rs,x);
}
int query(int l,int r,int L,int R,int a,int b,int c,int d){
if(L>R)return ;
if(L<=l&&r<=R){
return t[a].v+t[b].v-t[c].v-t[d].v;
}
int mid=(l+r)/,ret=;
if(L<=mid)ret+=query(l,mid,L,R,t[a].ls,t[b].ls,t[c].ls,t[d].ls);
if(mid<R)ret+=query(mid+,r,L,R,t[a].rs,t[b].rs,t[c].rs,t[d].rs);
return ret;
}
int main(){
memset(head,-,sizeof(head));
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&f);
if(!f)rt=i;
else add(f,i),fa[i][]=f;
}
dfs(rt,);
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d",&op);
if(op==){
scanf("%d",&x);
num[x]=i;
}else{
pts++;
scanf("%d%d%d",&p[pts].x,&p[pts].y,&p[pts].c);
p[pts].id=i;
}
}
for(int i=;i<=n;i++){
updata(,m,rts[i],rts[dfn[fa[nmd[i]][]]],num[nmd[i]]);
}
for(int i=;i<=pts;i++){
int z=lca(p[i].x,p[i].y);
printf("%d %d\n",dep[p[i].x]+dep[p[i].y]-*dep[z]+,query(,m,,p[i].id-p[i].c-,rts[dfn[p[i].x]],rts[dfn[p[i].y]],rts[dfn[z]],rts[dfn[fa[z][]]]));
}
return ;
}
【BZOJ4448】【SCOI2015】情报传递的更多相关文章
- bzoj4448 SCOI2015 情报传递 message
传送门bzoj4448 题解 离线之后构建树上主席树,每个点的线段树维护到根路径的信息,不用链剖(我的链剖只是拿来求\(\mathrm{lca}\)的),时空复杂度\(O(n\log{n})\). c ...
- BZOJ4448 SCOI2015情报传递(离线+树链剖分+树状数组)
即滋磁单点修改,询问路径上小于某数的值有多少个.暴力树剖套个主席树(或者直接树上主席树,似乎就1个log了?感觉不一定比两个log快)即可,然而不太优美. 开始觉得可以cdq,然而就变成log^3了. ...
- bzoj4448 [Scoi2015]情报传递
第一问不解释,对于第二问的处理,可以使用cdq分治,假设分治的询问区间是[L,R],那么我们对于标号在[L,mid]的修改操作赋予一个权值,因为在当前[L,R]中[L,mid]的修改操作只会对[mid ...
- 2019.03.26 bzoj4448: [Scoi2015]情报传递(归并排序+树链剖分)
传送门 题意简述: 给一棵nnn个点的树,树上每个点表示一个情报员,一共有mmm天,每天会派发以下两种任务中的一个任务: 1.搜集情报:指派T号情报员搜集情报 2.传递情报:将一条情报从X号情报员传递 ...
- BZOJ4448[Scoi2015]情报传递——主席树+LCA
题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有 若T名(可能没有)下线,除1名大头目外其余n-1名情报员有且仅有1名上线.奈特公司纪律森严 ...
- bzoj4448 [Scoi2015]情报传递 主席树+树上差分
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4448 题解 练习一下主席树的基础练习题找回感觉. 对于每一次询问,第一问显然随便做. 第二问的 ...
- 【BZOJ4448】[Scoi2015]情报传递 主席树+LCA
[BZOJ4448][Scoi2015]情报传递 Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员能有若干名(可能没有)下线,除1名大头 ...
- BZOJ_4448_[Scoi2015]情报传递_主席树
BZOJ_4448_[Scoi2015]情报传递_主席树 Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有 若T名(可能没有) ...
- BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树
4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...
- [SCOI2015]情报传递[树剖+主席树]
[SCOI2015]情报传递 题意大概就是 使得在 \(i\) 时刻加入一个情报员帮您传情报 然后询问 \(x,y,c\) 指 \(x\)到\(y\)多少个人有风险-(大于c)的都有风险-每天风险值+ ...
随机推荐
- offscreen-render
offscreen-render 什么是offscreen-render?offscreen-render涉及的内容比较多,有offscreen-render那就有onscreen render,on ...
- 粘包_Client
# from socket import *# import time# ip_port = ('127.0.0.1',8080)# back_log = 5# buffer_size = 1024# ...
- ES8(2017)新特性学习
字符串填充 (1)从前填充:str.padStart(targetLength [, padString]); 示例: 'es8'.padStart(7, '0'); // '0000es8' (2) ...
- hp soap扩展最全说明,附天气预报调用的例子
自从php5开始,我们可以不用通过php nusoap来创建php soap web service 和调用 soap了,php5内置了 soap扩展.只需要在php.ini中开启soap的exten ...
- bzoj 1814 Fornula 1
Formula 1 题意 在\(n*m\)的矩阵中,有些格子有树,没有树的格子不能到达,找一条回路,吃完所有的树,求有多少种方法. 解法 因为只要一条回路,所以我们必须维护插头的连通性. 具体的可以参 ...
- 小学生绞尽脑汁也学不会的python(反射)
小学生绞尽脑汁也学不会的python(反射) 1. issubclass, type, isinstance issubclass 判断xxxx类是否是xxxx类的子类 type 给出xxx的数据类型 ...
- poj 3254 Corn Fields (状压dp)(棋盘dp)
状压dp入门题 因为当前行的状态只和上一行有关 所以可以一行一行来做 因为m <= 12所以可以用二进制来表示放了或者没有放 0表示没放,1表示放 f[i][state]表示第i行状态为stat ...
- 【codeforces 505D】Mr. Kitayuta's Technology
[题目链接]:http://codeforces.com/problemset/problem/505/D [题意] 让你构造一张有向图; n个点; 以及所要求的m对联通关系(xi,yi) 即要求这张 ...
- angular-代码段
重复代码 <div ng-app="" ng-init="names=['Jani','Hege','Kai']"> <p>使用 ng- ...
- 005推断两个字符串是否是变位词 (keep it up)
写一个函数推断两个字符串是否是变位词. 变位词(anagrams)指的是组成两个单词的字符同样,但位置不同的单词.比方说, abbcd和abcdb就是一对变位词 这也是简单的题. 我们能够排序然后对照 ...