bzoj4448 [Scoi2015]情报传递

时间:2021-09-17 23:37:42

  第一问不解释,对于第二问的处理,可以使用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情报传递(离线&plus;树链剖分&plus;树状数组)

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

  3. 2019&period;03&period;26 bzoj4448&colon; &lbrack;Scoi2015&rsqb;情报传递(归并排序&plus;树链剖分)

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

  4. BZOJ4448&lbrack;Scoi2015&rsqb;情报传递——主席树&plus;LCA

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

  5. bzoj4448 &lbrack;Scoi2015&rsqb;情报传递 主席树&plus;树上差分

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

  6. 【BZOJ4448】&lbrack;Scoi2015&rsqb;情报传递 主席树&plus;LCA

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

  7. BZOJ&lowbar;4448&lowbar;&lbrack;Scoi2015&rsqb;情报传递&lowbar;主席树

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

  8. BZOJ 4448&colon; &lbrack;Scoi2015&rsqb;情报传递 树链剖分 主席树

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

  9. &lbrack;SCOI2015&rsqb;情报传递&lbrack;树剖&plus;主席树&rsqb;

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

随机推荐

  1. 面试中关于Java你所需知道的的一切

    本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些, ...

  2. &lbrack;源码&rsqb;String StringBuffer StringBudlider(1String部分)

      String     /** The value is used for character storage. */     private final char value[];  /** Th ...

  3. ADB常用的几个命令

    1. 查看设备 adb devices 查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示 2. 安装软件 adb install [-r] [-s] <file&gt ...

  4. 一个应用层的Makefile

    CC = gcc #gcc编译器LIB= -lpthread #需要链接的库文件CFLAGS=-std=gnu99 #C编译器的选项,C99标准OBJ=test.o gpio.o #生成的汇编文件PR ...

  5. ios 开发小技巧一

    对于UITableViewCell中的textField/textView,你肯定想让它编辑时可以把所在行滚动到键盘上方.如果你的VC是UITableViewController或者子类,那么只要在o ...

  6. ptype&lowbar;base和ptype&lowbar;all学习笔记

    "linux-2.6.32/include/linux/netdevice.h" struct packet_type { __be16 type; /* This is real ...

  7. java构造函数也可以用private开头

    private 构造函数一般用于Singleton模式,指的是整个应用只有本类的一个对象,一般这种类都有一个类似getInstance()的方法!下面是一个Singleton的例子:public cl ...

  8. Serializable接口的背后

    序列化是什么? 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得.序列化分为两大部分:序列化和反序列化. 序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网 ...

  9. CentOS7安装wps

    https://blog.csdn.net/u010445843/article/details/77828552

  10. 创建MySQL用户 赋予某指定库表的权限

    摘自: http://renxiangzyq.iteye.com/blog/763837 update ERROR 1364 (HY000): Field 'ssl_cipher' doesn't h ...