NOIP 模拟 $14\; \text{影魔}$
题解 \(by\;\;zj\varphi\)
不是原题
一道(对我来说)很需要技巧的题
对于颜色数如何处理
离线,将子树转化为 \(dfs\) 序,但这种做法无法处理深度
我们按照深度加点(可以通过 \(bfs\) 实现),对于加到的每一个点,寻找和它颜色相同的点的 \(dfs\) 序,记录前趋和后继( \(set\) ),
将这个点和前趋,和后继的 \(lca\) 权值减 \(1\),将前趋和后继的 \(lca\) 权值加 \(1\)。
至于如何处理深度,可以维护一棵可持久化线段树,对于每一层在 \(dfs\) 序上建立,查询时直接区间查询相应深度的那棵线段树。
Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
template<typename T>inline void read(T &x) {
ri f=1;x=0;register char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
}
using IO::read;
namespace nanfeng{
#define pb(x) push_back(x)
#define cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
static const int N=1e5+7;
set<int> ste[N];
set<int>::iterator it,ti;
int first[N],col[N],l[N],r[N],bc[N],que[N],head[N],st[N<<1][19],dep[N],mxdep[N],lg[N<<1],ol,dfn,t=1,n,m;
struct edge{int v,nxt;}e[N];
inline void add(int u,int v) {e[t].v=v,e[t].nxt=first[u],first[u]=t++;}
struct Seg{
#define ls(x) T[x].l
#define rs(x) T[x].r
#define up(x) T[x].w=T[ls(x)].w+T[rs(x)].w
struct segmenttree{int l,r,w;}T[N<<6];
int rt[N],tot;
inline int New(int pre) {T[p(tot)]=T[pre];return tot;}
void update(int &x,int p,int k,int l,int r) {
if (!x) x=p(tot);
if (l==r) {T[x].w+=k;return;}
int mid(l+r>>1);
if (p<=mid) update(ls(x),p,k,l,mid);
else update(rs(x),p,k,mid+1,r);
up(x);
}
int merge(int x,int y) {
if (!x||!y) return (x|y);
T[x].w+=T[y].w;
ls(x)=merge(ls(x),ls(y));
rs(x)=merge(rs(x),rs(y));
return x;
}
int query(int x,int l,int r,int lt,int rt) {
if (!x) return 0;
if (l<=lt&&rt<=r) return T[x].w;
int mid(lt+rt>>1),res(0);
if (l<=mid) res+=query(ls(x),l,r,lt,mid);
if (r>mid) res+=query(rs(x),l,r,mid+1,rt);
return res;
}
}T;
void dfs(int x) {
bc[l[x]=p(dfn)]=x;
head[st[p(ol)][0]=x]=ol;
mxdep[x]=dep[x];
for (ri i(first[x]),v;i;i=e[i].nxt)
dep[v=e[i].v]=dep[st[p(ol)][0]=x]+1,dfs(v),mxdep[x]=cmax(mxdep[x],mxdep[v]);
r[x]=dfn;
}
inline void init_rmq() {
dep[1]=1;dfs(1);
for (ri i(2);i<=ol;p(i)) lg[i]=lg[i>>1]+1;
int k=lg[ol];
for (ri j(1);j<=k;p(j)) {
ri len=(1<<j);
for (ri i(1);i+len-1<=ol;p(i)) {
int x1=st[i][j-1],x2=st[i+(1<<j-1)][j-1];
st[i][j]=dep[x1]<dep[x2]?x1:x2;
}
}
}
inline int Getlca(int u,int v) {
if (head[u]>head[v]) swap(u,v);
int k=lg[head[v]-head[u]+1];
int x1=st[head[u]][k],x2=st[head[v]-(1<<k)+1][k];
return dep[x1]<dep[x2]?x1:x2;
}
inline void bfs() {
ri hd=1,tl=0,mxd;
que[p(tl)]=1;
while(hd<=tl) {
ri x=que[hd++],cl=col[x],pre=0,nxt=0;
T.update(T.rt[dep[x]],l[x],1,1,n);
ste[cl].insert(l[x]);
it=ti=ste[cl].find(l[x]);
if (ti!=ste[cl].begin()) {
pre=bc[*--ti];
T.update(T.rt[dep[x]],l[Getlca(pre,x)],-1,1,n);
}
if (it!=--ste[cl].end()) {
nxt=bc[*p(it)];
T.update(T.rt[dep[x]],l[Getlca(x,nxt)],-1,1,n);
}
if (pre&&nxt) T.update(T.rt[dep[x]],l[Getlca(pre,nxt)],1,1,n);
for (ri i(first[x]);i;i=e[i].nxt) que[p(tl)]=e[i].v;
}
mxd=dep[que[tl]];
for (ri i(2);i<=mxd;p(i)) T.merge(T.rt[i],T.rt[i-1]);
}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
read(n),read(m);
for (ri i(1);i<=n;p(i)) read(col[i]);
for (ri i(2),u;i<=n;p(i)) read(u),add(u,i);
init_rmq();
bfs();
for (ri i(1),x,d;i<=m;p(i)) {
read(x),read(d);
if (dep[x]+d>mxdep[x])
printf("%d\n",T.query(T.rt[mxdep[x]],l[x],r[x],1,n));
else printf("%d\n",T.query(T.rt[dep[x]+d],l[x],r[x],1,n));
}
return 0;
}
}
int main() {return nanfeng::main();}
NOIP 模拟 $14\; \text{影魔}$的更多相关文章
- NOIP 模拟 $14\; \text{抛硬币}$
题解 \(by\;\;zj\varphi\) 签到题,自己看题解 Code #include<bits/stdc++.h> #define ri register signed #defi ...
- NOIP 模拟 $14\; \text{队长快跑}$
题解 \(by\;zj\varphi\) 一道很妙的 \(dp\) 题,方程状态不好设置,细节也不少 看到数据范围,直接想离散化 设 \(f_{i,j}\) 表示处理完前 \(i\) 个水晶,其中摧毁 ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
- 20190902+0903合集-NOIP模拟
一直没时间写QwQ 于是补一下. Day 1 晚饭吃的有点恶心…… $1s\,2s\,5s$ 还开 -O2 ?? 有点恐怖. T1 猛的一想: 把外面设成一个点, 向入口连一条权为排队时间的边 从出口 ...
- 2021.5.22 noip模拟1
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...
- NOIP模拟
1.要选一个{1,2,...n}的子集使得假如a和b在所选集合里且(a+b)/2∈{1,2,...n}那么(a+b)/2也在所选集合里 f[i]=2*f[i-1]-f[i-2]+g[i] g[n]:选 ...
- NOIP模拟3
期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...
- 7.22 NOIP模拟7
又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...
- NOIP模拟 14
垃圾成绩,一点都不稳定. 如果把数组开小的分得到的话..总分还挺不错.. 那又能怪谁,都快NOIP了还犯这种傻逼错误 nc哥是要阿卡的节奏..真是太强了 某kyh也不知道偷了谁的rp,分高的一批 wd ...
随机推荐
- Adaptive AUTOSAR 学习笔记 3 - AP 背景、技术及特征(中文翻译)
本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20-11 版本.本文从AUTOSAR_EXP_PlatformDesign.pdf开始,一边学习,一边顺带着翻译一 ...
- Docker原理:Namespace
目录 Namespace UTS Namespae PID Namespace Mount Namespace User Namespace Network Namespace 参考 Namespac ...
- CentOS 8 已经不再支持,Rocky Linux 才是未来
2020年12月8日,红帽公司宣布,他们将停止开发CentOS,而在此之前CentOS一直作为红帽企业Linux的生产型分支及下游版本,此后他们将转而开发该操作系统的一个更新的上游开发变种,即 &qu ...
- Linux之19——Shell编程基础详解
第一部分:Linux Shell 简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序, ...
- 机器学习Sklearn系列:(四)朴素贝叶斯
3--朴素贝叶斯 原理 朴素贝叶斯本质上就是通过贝叶斯公式来对得到类别概率,但区别于通常的贝叶斯公式,朴素贝叶斯有一个默认条件,就是特征之间条件独立. 条件概率公式: \[P(B|A) = \frac ...
- python numpy 数据集合操作函数
arrarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])arr1array([0, 1, 2, 3, 4])np.intersect1d(arr,arr1)#计算数组ARR A ...
- 【Azure Redis 缓存】云服务Worker Role中调用StackExchange.Redis,遇见莫名异常(RedisConnectionException: UnableToConnect on xxx 或 No connection is available to service this operation: xxx)
问题描述 在Visual Studio 2019中,通过Cloud Service模板创建了一个Worker Role的角色,在角色中使用StackExchange.Redis来连接Redis.遇见了 ...
- Appium和Python实现蚂蚁森林自动化收取能量
准备环境 Window10系统 Appium1.21.0 AndroidSDK r24.1.1 Python3.7.5 支付宝apk文件 查看支付宝apk包信息 使用android sdk aapt命 ...
- 每天五分钟Go - Map
map的定义 var m map[type]type fmt.Println(m) 此种方法定义的m为nil //打印的结果为: map[] map的创建 1.使用make创建 var m1 = ma ...
- ifix与4G DTU对接实现数据显示
前言: 因公司项目需求,需要使用4G DTU设备对远端RS 485设备进行数据采集,购买了相关产品进行技术实验,成功对接ifix将数据采集并显示,将过程记录,供大家参考. 1,4G DTU基本原理和配 ...