第一问不解释,对于第二问的处理,可以使用cdq分治,假设分治的询问区间是[L,R],那么我们对于标号在[L,mid]的修改操作赋予一个权值,因为在当前[L,R]中[L,mid]的修改操作只会对[mid+1,R]的询问操作,所以第i修改操作至少经过m-i的时间,因此赋予的权值是m-i,而对于[mid+1,R]区间中的询问操作,也赋予一个权值w-m,这里w为询问的数值,我们可以预处理出树的dfs序并维护一个树状数组,这样我们就可以把这些操作按权值从大到小插入或者询问,时间复杂度O(nlognlogn)。

  代码,运行时间差不多垫底。。(看了其他博主的题解貌似我想的复杂了。。。)

 #include<cstdio>
#include<algorithm>
#define N 500010
#define lb(x) (x&-x)
using namespace std;
int dp,p[N],pre[N],tt[N],n,a,i,m,o,c[N],deep[N],fa[N];
int L[N],R[N],ans[N];
int s[N][];
struct g{
int typ,l,r,w;
}b[N];
struct gg{
int id,v;
}w[N];
void cc(int x,int w)
{
while (x<=o)
{
c[x]+=w;
x+=lb(x);
}
}
void dfs(int x)
{
int i=p[x];
L[x]=++o;
while (i)
{
fa[tt[i]]=x;
deep[tt[i]]=deep[x]+;
dfs(tt[i]);
i=pre[i];
}
R[x]=++o;
}
int lca(int x,int y)
{
if(deep[x]>deep[y])x^=y^=x^=y;
int i;
for(i=;i>=;i--)
{
if(deep[y]-deep[x]>=(<<i))
{
y=s[y][i];
}
}
if(x==y)return x;
for(i=;i>=;i--)
{
if(s[x][i]!=s[y][i])
{
x=s[x][i];
y=s[y][i];
}
}
return fa[x];
}
int sum(int x)
{
int ans=;
while (x)
{
ans+=c[x];
x-=lb(x);
}
return ans;
}
void link(int x,int y)
{
dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
}
bool cmp(gg a,gg b)
{
if (a.v==b.v)
return a.id>b.id;
return a.v>b.v;
}
void solve(int l,int r)
{
int m,i,tot=;
if (l>=r) return;
m=(l+r)>>;
for (i=l;i<=m;i++)
if (b[i].typ==)
{
w[++tot].id=i;
w[tot].v=m-i;
}
for (i=m+;i<=r;i++)
if (b[i].typ==)
{
w[++tot].id=i;
w[tot].v=b[i].w-(i-m);
}
sort(w+,w++tot,cmp); for (i=;i<=tot;i++)
if (w[i].id<=m)
{
cc(L[b[w[i].id].w],);
cc(R[b[w[i].id].w],-);
}
else
{
int u=b[w[i].id].l;
int v=b[w[i].id].r;
int LCA=lca(u,v);
ans[w[i].id]+=sum(L[u])+sum(L[v])-sum(L[LCA])-sum(L[LCA]-);
}
for (i=;i<=tot;i++)
if (w[i].id<=m)
{
cc(L[b[w[i].id].w],-);
cc(R[b[w[i].id].w],);
} solve(l,m);solve(m+,r);
} int main()
{
scanf("%d",&n);
for (i=;i<=n;i++)
{
scanf("%d",&a);
if (a) link(a,i);
}
scanf("%d",&m);
for (i=;i<=m;i++)
{
scanf("%d",&b[i].typ);
if (b[i].typ==)
scanf("%d%d%d",&b[i].l,&b[i].r,&b[i].w);
else scanf("%d",&b[i].w);
}
dfs();
for(i=;i<=n;i++)s[i][]=fa[i];
for(int h=;h<;h++)
{
for(i=;i<=n;i++)
{
s[i][h]=s[s[i][h-]][h-];
}
}
solve(,m);
for (i=;i<=m;i++)
if (b[i].typ==)
{
int Ans=lca(b[i].l,b[i].r);
Ans=deep[b[i].l]+deep[b[i].r]-*deep[Ans]+;
printf("%d %d\n",Ans,ans[i]);
}
}

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

  1. bzoj4448 SCOI2015 情报传递 message

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

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

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

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

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

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

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

  5. bzoj4448 [Scoi2015]情报传递 主席树+树上差分

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4448 题解 练习一下主席树的基础练习题找回感觉. 对于每一次询问,第一问显然随便做. 第二问的 ...

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

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

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

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

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

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

  9. [SCOI2015]情报传递[树剖+主席树]

    [SCOI2015]情报传递 题意大概就是 使得在 \(i\) 时刻加入一个情报员帮您传情报 然后询问 \(x,y,c\) 指 \(x\)到\(y\)多少个人有风险-(大于c)的都有风险-每天风险值+ ...

随机推荐

  1. USB2.0协议笔记

    1.概述     USB(Universal Serial Bus)具有传输速率快,可热插拔等显著特点,应用已经十分广泛,目前的相当多的设备已经支持最新的USB3.0协议.理论上USB1.1的传输速度 ...

  2. SDP协议译稿(Part 1)

    本文的翻译内容是基于Bluetooth Core Spec 2.1+EDR 协议中对SDP的描述,很多都是个人的理解,难免有疏漏,有争议或者疑问的地方,欢迎在此留言进行探讨. 2. Overview ...

  3. docker nexus oss

    docker login/search x.x.x.x:8081 sonatype/docker-nexus Docker images for Sonatype Nexus with the Ora ...

  4. linux 冒号的用途

    用途说明 我们知道,在Linux系统中,冒号(:)常用来做路径的分隔符(PATH),数据字段的分隔符(/etc/passwd)等.其实,冒号(:)在Bash中也是一个内建命令,它啥也不做,是个空命令. ...

  5. jade复用

    jade复用说白了就是模板的继承. 使用 block 标识符,设置一个可修改的代码片段 layout.jade doctype html html head block title title Def ...

  6. ligerui做分页显示数据

    现在前台技术用到的是ligerui,一直想写一个有关ligerui的显示,利用加班的今天偷点闲复制一下下,当自己的一些小资料吧,不会的时候,还可以来看看............稍微有点多,毕竟是从前后 ...

  7. JS位操作符

    1.按位与 AND & var result = 25 & 3; alert(result); //1var result2 = 25 & -3;alert(result2); ...

  8. [转]详细介绍java中的数据结构

    详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各 ...

  9. Java实现热替换

    package test; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.nio. ...

  10. Java的浮点数和整数的进制转换

    整数的表达 –原码:第一位为符号位(0为正数,1为负数) –反码:符号位不动,原码取反 –负数补码:符号位不动,反码加1 –正数补码:和原码相同     -6      5 原码 10000110 0 ...