题目链接

离线+树上主席树,主席树维护时间标记

注意查询时如果c<0要把c赋为0;

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#define re(i,l,r) for(int i=(l);i<=(r);i++)
#define rre(i,r,l) for(int i=(r);i>=(l);i--)
using namespace std;
template <typename Q>
void inin(Q &ret)
{
ret=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=;ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
ret=f?-ret:ret;
}
const int xxx=;
int n,fa[xxx],w[xxx],head[xxx<<],next[xxx<<],zhi[xxx<<],ed;
void add(int a,int b)
{
next[++ed]=head[a],head[a]=ed,zhi[ed]=b;
next[++ed]=head[b],head[b]=ed,zhi[ed]=a;
}
namespace pou
{
int top[xxx],shen[xxx],son[xxx];
int dfs(int x)
{
int ret=,temp,Max=;
for(int i=head[x];i;i=next[i])if(zhi[i]!=fa[x])
{
shen[zhi[i]]=shen[x]+,fa[zhi[i]]=x;
temp=dfs(zhi[i]);ret+=temp;
if(Max<temp)Max=temp,son[x]=zhi[i];
}
return ret;
}
void dfs(int x,int t)
{
if(!x)return ;
top[x]=t;
dfs(son[x],t);
for(int i=head[x];i;i=next[i])if(zhi[i]!=fa[x]&&zhi[i]!=son[x])
dfs(zhi[i],zhi[i]);
}
int lca(int x,int y)
{
while(top[x]!=top[y])
if(shen[top[x]]>shen[top[y]])x=fa[top[x]];
else y=fa[top[y]];
return shen[x]<shen[y]?x:y;
}
}
namespace pst
{
int root[xxx],sum[xxx<<],ed,ch[xxx<<][];
void update(int l,int r,int L,int &R,int x)
{
R=++ed;sum[R]=sum[L]+(x?:);
if(!x){ch[R][]=ch[L][],ch[R][]=ch[L][];return ;}
if(l==r)return ;
int mid=(l+r)>>;
if(x<=mid)ch[R][]=ch[L][],update(l,mid,ch[L][],ch[R][],x);
else ch[R][]=ch[L][],update(mid+,r,ch[L][],ch[R][],x);
}
void build(int x)
{
update(,n,root[fa[x]],root[x],w[x]);
for(int i=head[x];i;i=next[i])if(zhi[i]!=fa[x])
build(zhi[i]);
}
int query(int l,int r,int x,int c)
{
if(c==)return ;
if(l>=&&r<=c)return sum[x];
int mid=(l+r)>>;
if(c<=mid)return query(l,mid,ch[x][],c);
else return query(l,mid,ch[x][],c)+query(mid+,r,ch[x][],c);
}
}
struct que
{
int x,y,c;
}sta[];int top;
int main()
{
inin(n);
re(i,,n)
{
int x;inin(x);
if(x)add(i,x);
}pou::shen[]=;
pou::dfs();
pou::dfs(,);
int q;inin(q);
re(i,,q)
{
int opt,x,y,c;inin(opt),inin(x);
if(opt==)inin(y),inin(c),sta[++top]=(que){x,y,i-c-};
else w[x]=w[x]?w[x]:i;
}
pst::build();
re(i,,top)
{
using namespace pou;
using namespace pst;
int temp=lca(sta[i].x,sta[i].y),x=sta[i].x,y=sta[i].y,c=sta[i].c;if(c<)c=;
printf("%d ",shen[sta[i].x]+shen[sta[i].y]-(shen[temp]<<)+);
printf("%d\n",query(,n,root[x],c)+query(,n,root[y],c)-*query(,n,root[fa[temp]],c)-(w[temp]<=c&&w[temp]>));
}
return ;
}

bzoj4448 情报传递的更多相关文章

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

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

  2. bzoj4448 SCOI2015 情报传递 message

    传送门bzoj4448 题解 离线之后构建树上主席树,每个点的线段树维护到根路径的信息,不用链剖(我的链剖只是拿来求\(\mathrm{lca}\)的),时空复杂度\(O(n\log{n})\). c ...

  3. BZOJ4448 SCOI2015情报传递(离线+树链剖分+树状数组)

    即滋磁单点修改,询问路径上小于某数的值有多少个.暴力树剖套个主席树(或者直接树上主席树,似乎就1个log了?感觉不一定比两个log快)即可,然而不太优美. 开始觉得可以cdq,然而就变成log^3了. ...

  4. BZOJ4448:[SCO2015]情报传递

    题目大意:给你一棵树,有两种操作,一个是修改某个点的权值,另一个是询问两点之间的距离以及路径上小于某个值的数的个数. 询问两点之间距离直接lca即可,对于求个数的问题可以用主席树完成. #includ ...

  5. bzoj4448 [Scoi2015]情报传递

    第一问不解释,对于第二问的处理,可以使用cdq分治,假设分治的询问区间是[L,R],那么我们对于标号在[L,mid]的修改操作赋予一个权值,因为在当前[L,R]中[L,mid]的修改操作只会对[mid ...

  6. 2019.03.26 bzoj4448: [Scoi2015]情报传递(归并排序+树链剖分)

    传送门 题意简述: 给一棵nnn个点的树,树上每个点表示一个情报员,一共有mmm天,每天会派发以下两种任务中的一个任务: 1.搜集情报:指派T号情报员搜集情报 2.传递情报:将一条情报从X号情报员传递 ...

  7. BZOJ4448[Scoi2015]情报传递——主席树+LCA

    题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有 若T名(可能没有)下线,除1名大头目外其余n-1名情报员有且仅有1名上线.奈特公司纪律森严 ...

  8. 【bzoj4448】SCOI2015 情报传递

    树剖,可以相当于一个染色问题,以及询问先前节点的染色个数. 把第二种操作离线掉,然后用线段树模拟即可. #include<bits/stdc++.h> #define N 800010 # ...

  9. 【bzoj4448】[Scoi2015]情报传递 主席树

    题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有若T名(可能没有)下线,除1名大头日外其余n-1名情报员有且仅有1名上线.奈特公司纪律森严, ...

随机推荐

  1. 20170811 使用Bootstrap框架写个页面

    采用Bootstrap-table 做的页面. 1. 增加Query 查询功能,涉及Ajax 来加载页面数据吧! <meta charset="UTF-8">  < ...

  2. what' the python之面向对象(进阶)

    面向对象的知识点补充(进阶版) classmethod和staticmethod:这两个函数的用途就是可以不用实例化对象就可以调用方法 class Classmethod_Demo(): role = ...

  3. 数据库机器迁移对AlwaysON 集群影响测试

    1主3从(共享文件见证)     模拟事故 AlwaysON集群 结论 主域控服务器重启 共享文件夹见证失败,SQL集群无影响 无影响 修改共享文件夹见证路径 第一次测试修改后:整个集群突然重启,查询 ...

  4. grub启动流程和配置

    grub stage  1 MBR中前 446个字节,如果把这里面的内容损坏,那么系统会认为当前磁盘没有启动引导功能,会尝试从光盘或者网络启动系统 grub  stage  1.5 存放识别/boot ...

  5. MySql利用mysqldump导出/导入数据库表数据

    备份 在源主机上,先使用mysqldump命令备份,导出sql脚本文件 mysqldump -uroot -p tel_dev > /opt/tel_dev.sql 也可指定编码 mysqldu ...

  6. word2vec 评测 sg=0 sg=1 size=100 window=3

    1.评价sg=0与sg=1的区别    结果原文:sg_difference.txt sg=0     sg=1 绑定                         1 关联            ...

  7. socket发送http报文的疑惑(求高手指点一二)

    给8080或80端口的服务端(自己写的serverSocket服务端)发送字符串,此字符串按照http协议拼接而成,既是所谓的http报文.服务端接受成功.如果在报头与消息体之间少了“\r\n\r\n ...

  8. 时间序列模式(ARIMA)---Python实现

    时间序列分析的主要目的是根据已有的历史数据对未来进行预测.如餐饮销售预测可以看做是基于时间序列的短期数据预测, 预测的对象时具体菜品的销售量. 1.时间序列算法: 常见的时间序列模型; ​ 2.时序模 ...

  9. Stacking调参总结

    1. 回归 训练了两个回归器,GBDT和Xgboost,用这两个回归器做stacking 使用之前已经调好参的训练器 gbdt_nxf = GradientBoostingRegressor(lear ...

  10. MongoDB--预备