Solution -「YunoOI 2007」rfplca
Description
Link.
Given is a rooted tree with the \(\sf1\)-th node as the root.
The tree will be given in this way: it will tell you that the parent of the \(\sf i\)-th node is \(a_{i}\).
Supporting the following operations:
1 l r x
: let \(\sf \forall i\in[l,r],a_{i}=max\{a_{i}-x,1\}\).2 u v
: find the LCA (Lowest Common Ancestor) of \(\sf u\) and \(\sf v\).
Solution
考虑到修改操作是对结点进行的操作,然后这个东西不太能直接 LCT 或树剖,考虑照序列来分块,那么我们来对结点编号分块。
- 修改;
\(\quad\)维护一个属性 \(\sf top_{u}\) 表示在原树上结点 \(\sf u\) 的祖先中不和 \(\sf u\) 在同一个块里面的编号最大的一个结点的编号,如果不存在的话就令 \(\sf top_{u}=1\)。这样的话你从结点 \(\sf u\) 跳到 root 的复杂度为 \(\sf O(\sqrt{n})\)。接下来考虑怎么维护这个东西。
\(\quad\)散块我们直接暴力扫着改;对于整块,可以发现如果一个块的被修改次数超过了块的大小,那么就一定会有 \(\sf top_{u}=fa_{u}\)。
- 询问。
\(\quad\)分三个类讨论,这个比较好做(差不多和树剖找 LCA 一个样子)。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,m,top[400010],deln[1000],tag[1000],belong[400010],bl[1000],br[1000],fa[400010],bs;
#define gtlf(x) ((x-1)*bs+1)
#define gtrg(x) (min(x*bs,n))
void updtop(LL x)
{
if(belong[x]^belong[fa[x]]) top[x]=fa[x];
else top[x]=top[fa[x]];
}
void turndown(LL x)
{
if(tag[x])
{
for(LL i=gtlf(x);i<=gtrg(x);++i) fa[i]=max(fa[i]-tag[x],1ll);
tag[x]=0;
}
}
template<typename T>
void read(T &hhh)
{
T x=0;
char c=getchar();
while(c<'0' || c>'9') c=getchar();
while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c&15),c=getchar();
hhh=x;
}
template<typename T>
void write(T x,char las='\n')
{
static int st[100],top=0;
do st[++top]=x%10,x/=10; while(x);
while(top) putchar(st[top]^'0'),--top;
putchar(las);
}
int main()
{
read(n),read(m),bs=sqrt(double(n))+1,fa[1]=belong[1]=1;
for(LL i=2;i<=n;++i) read(fa[i]);
for(LL i=2;i<=n;++i) belong[i]=(i-1)/bs+1,updtop(i);
LL las=0;
while(m--)
{
LL opt; read(opt);
if(opt==1)
{
LL opl,opr,opx;
read(opl),read(opr),read(opx);
opl^=las,opr^=las,opx^=las;
turndown(belong[opl]);
if(belong[opl]==belong[opr])
{
turndown(belong[opl]);
for(LL i=opl;i<=opr;++i) fa[i]=max(fa[i]-opx,1ll),updtop(i);
for(LL i=opr+1;i<=gtrg(belong[opl]);++i) updtop(i);
}
else
{
turndown(belong[opl]);
for(LL i=opl;i<=gtrg(belong[opl]);++i) fa[i]=max(fa[i]-opx,1ll),updtop(i);
for(LL i=gtlf(belong[opl]);i<opl;++i) updtop(i);
turndown(belong[opr]);
for(LL i=gtlf(belong[opr]);i<=opr;++i) fa[i]=max(fa[i]-opx,1ll),updtop(i);
for(LL i=opr+1;i<=gtrg(belong[opr]);++i) updtop(i);
for(LL i=belong[opl]+1;i<belong[opr];++i)
{
if(deln[i]>=bs) tag[i]+=opx;
else
{
++deln[i];
for(LL j=gtlf(i);j<=gtrg(i);++j) fa[j]=max(fa[j]-opx,1ll),updtop(j);
}
}
}
}
else
{
LL opx,opy; read(opx),read(opy);
opx^=las,opy^=las;
while(opx^opy)
{
LL fopx,fopy;
if(deln[belong[opx]] < bs) fopx=top[opx];
else fopx = max(1LL , fa[opx] - tag[belong[opx]]);
if(deln[belong[opy]] < bs) fopy=top[opy];
else fopy = max(1LL , fa[opy] - tag[belong[opy]]);
if(belong[opx]^belong[opy])
{
if(belong[opx]>belong[opy]) opx=fopx;
else opy=fopy;
}
else if(fopx^fopy) opx=fopx,opy=fopy;
else
{
if(opx>opy) turndown(belong[opx]),opx=max(1LL , fa[opx] - tag[belong[opx]]);
else turndown(belong[opy]),opy=max(1LL , fa[opy] - tag[belong[opy]]);
}
}
write(las=opx);
}
}
return 0;
}
Solution -「YunoOI 2007」rfplca的更多相关文章
- Solution -「HNOI 2007」「洛谷 P3185」分裂游戏
\(\mathcal{Description}\) Link. 给定 \(n\) 堆石子,数量为 \(\{a_n\}\),双人博弈,每轮操作选定 \(i<j\le k\),使 \(a_i ...
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- Solution -「BZOJ 3812」主旋律
\(\mathcal{Description}\) Link. 给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「简单 DP」zxy 讲课记实
魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...
- Solution -「基环树」做题记录
写的大多只是思路,比较简单的细节和证明过程就不放了,有需者自取. 基环树简介 简单说一说基环树吧.由名字扩展可得这是一类以环为基础的树(当然显然它不是树. 通常的表现形式是一棵树再加一条非树边,把图画 ...
- 「WC 2007」剪刀石头布
题目链接 戳我 \(Solution\) 直接求很明显不太好求,于是考虑不构成剪刀石头布的情况. 我们现在假设一个人\(i\)赢了\(x\)场,那么就会有\(\frac{x*(x-1)}{2}\) 我 ...
- Solution -「WC 2022」秃子酋长
\(\mathscr{Description}\) Link. (It's empty temporarily.) 给定排列 \(\{a_n\}\),\(q\) 次询问,每次给出 \([l,r ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
随机推荐
- C++面试八股文:static和const的关键字有哪些用法?
某日二师兄参加XXX科技公司的C++工程师开发岗位第7面: 面试官:C++中,static和const的关键字有哪些用法? 二师兄:satic关键字主要用在以下三个方面:1.用在全局作用域,修饰的变量 ...
- Python获取token数据的几种方式
import requestsfrom urllib import requestimport re# 一.从响应头中获取token# 登录url = 'http://xxx.nhf.cn/api/b ...
- 【技术积累】Java中的泛型【一】
泛型是什么 Java中的泛型是一种能够让用户在编写代码时避免使用明确的类型而进行类型参数化的机制.Java中的泛型可以让编程者在代码编写时不必关心具体类型,只用关心类型之间的关系和相互转换,从而在编写 ...
- Kafka 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?
如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? >幂等性,通俗点说,就一个数据,或者一个请求,给你重复来多次,你得确保对应的数据是不会改变的,不能出错. kafka 的机制: K ...
- 使用libswresample库实现音频重采样
一.初始化音频重采样器 在音频重采样时,用到的核心结构是SwrContext,我们可以通过swr_alloc()获取swr_ctx实例,然后通过av_opt_set_int()函数和av_opt_se ...
- 用 perfcollect 洞察 Linux 上.NET程序 CPU爆高
一:背景 1. 讲故事 如果要分析 Linux上的 .NET程序 CPU 爆高,按以往的个性我肯定是抓个 dump 下来做事后分析,这种分析模式虽然不重但也不轻,还需要一定的底层知识,那有没有傻瓜式的 ...
- Git子模块使用说明
介绍 前端不同应用存在公共的脚本或样式代码,为了避免重复开发,将公共的代码抽取出来,形成一个公共的 git 子模块,方便调用和维护. 软件架构 本仓库代码将作为 git 子模块,被引用到其他仓库中,不 ...
- k8s 的特点
Kubernetes 的信条是基于自动化的.API 驱动的基础设施,同时避免组件间紧密耦合.
- 长连接:chatgpt流式响应背后的逻辑
一.前言: 提起长连接,我们并不陌生,最常见的长连接非websocket莫属了.即使没有在项目中实际用过,至少也应该有所接触.长连接指在一次网络通信中,客户端与服务器之间建立一条持久的连接,可以在多次 ...
- chrome pre 自动换行
问题引出 当我想要使用chrome的打印功能生成一份关于md的pdf版本的时候发现有的代码块没有自动换行,生成的PDF没有自动换行,导致部分信息无法阅读 处理方式 把有自动换行的部分处理一下,在md文 ...