壱雫空

本来打算省选游记推这首歌的,但是省选破大防了,最后他来到了这里。感觉拿这个当起床铃效果一定很好(关键这歌超好听的!)。

もしこの雨が上がっても

忘れずに歩いてくよ

最初のひとしずくに 顔上げた今日の僕を

透明な傘で作る ひとり分だけの世界

(遮って隠れた)

そっと逃げ込んでいた

ビニール越しの空から

こぼれ落ちる音響いて

(弾けた合図)

滲む心へと溶けた

泣きじゃくっている この空といこう

(アスファルト染めていく 溢れ出したスコール)

通り過ぎる時を 待つだけじゃなくて

僕は見つめていたいんだよ

無色でもそこにあるもの

この雨が上がってく時

なにもなかったように

消えてく傘花みたいに心は

上手に折り畳めないから

過ぎ去ってしまう瞬間を

僕はあつめたいよ

ああ ひとしずくを

とめどなく傘にすべり落ちる

雫が揺れて描いてく(模様)

風に震えては

ぐずついてる僕みたいな

くすんでる今日を映した

迷い続けるこの空といこう

(曖昧に透ける色 眺めていたい)

ただよう雲だって 1秒先なんて

わからないままいくんだろう

不安で鈍く霞んでく 明日も

もしこの雨が上がっても

忘れたくないから

たった今を書きとめておきたいんだ

この手じゃ届かない

あの空から点線の糸で

つなぐように届いた ひとしずく

いまこの雨が上がってく

最後のひと粒が

小さく光って僕を映した

まだ道は乾かないだろう

潤んだ風を吸い込んだ

僕は連れていこう ああ ひとしずくを

就算这场大雨就此停止

我也将永不忘怀向前行

那抬头仰望最初一滴雨滴的今天的我

透明的伞创造出的一人份的世界

(遮蔽雨水隐藏身影)

悄悄逃入其中

从塑胶布另一头的天空

响起了雨珠落下的音色

(随着信号响起)

融入渗透了的内心之中

与哽咽啜泣的 这片天空同行吧

(雨水染遍了柏油路 强风随之满溢而出)

不光只是在等待 已逝去的时光

我是希望能够找到它啊

那无色却存在着的事物

当这场大雨渐渐止息时

仿佛一切都没发生过似地

逐渐消失的伞如花一般

正因无法好好折起内心

那些稍纵即逝的瞬间

多渴望能够收集它们

啊啊 那一滴雨珠

不断从伞上滑落而下

水滴摇曳绘制出的(模样)

在风中摇摆

那乌云密布的今日天空

映照出郁闷不安的内心

同这不断迷茫的天空为伴

(模糊又透明的色彩 我还想继续观望着)

那漂浮的云朵 也不知1秒后的未来

即便是如此但仍在前行

就算不安 使得明日朦胧暗淡

就算这场大雨就此停止

我也不愿忘记

只想记录并留下此刻

这只手触及不到的

从那片天空落下的点线

好似连接着 那一滴雨珠

此刻这大雨正逐渐停歇

那最后一颗小小的雨滴

微小地闪光并映射出我

前方道路仍尚未干透

轻轻吸入湿润的空气

我会将其带走 啊啊 那一滴雨珠

长链剖分

类似重链剖分,设 \(maxdep_i\) 表示节点 \(i\) 到所有叶子中经过节点数的最大值,那么长链剖分将每个节点 \(maxdep\) 最大的儿子(也就是最长链上的儿子)设为重儿子,将他们之间的边设为重边。

可以发现任意节点到根的轻边条数是 \(O(\sqrt{n})\) 的(以下 \(n\) 均与节点总数同阶)。考虑一条边数为 \(k\) 的链,链上全是轻边最少需要多少个点。我们规定根节点相对与叶子节点的方向为上方。考虑这条链最下方第 \(a+1\) 个点,这个点要使刚才的链上全为轻边就必须至少有一条与刚才的链无交且长至少为 \(O(a)\) 的链作为子树。将每个节点所需额外点数加起来共为 \(O(n^2)\),故当点数为 \(O(n)\) 时任意一点到根的轻边条数至少为 \(O(\sqrt{n})\)。

长链剖分求 k 级祖先

考虑我们事先通过倍增知道了每个节点的第 \(2^i\) 级祖先,现在我们要求 \(x\) 的 \(k\) 级祖先。我们先 \(O(1)\) 求出 \(a=\log_2{k}\),并将 \(x\) 跳到他的 \(2^a\) 级祖先处。考虑求新的节点的 \(k-2^a\) 级祖先。由于我们实现跳了 \(2^a\) 步,所以新的节点的 \(maxdep\) 一定大于等于 \(2^a\),也就是说他所在的长链长度大于等于 \(2^a\)。所以我们考虑将每条长链从下到上存储下来,如果这条长链长度为 \(b\),就在后面依次存储 \(b\) 个链顶的祖先。由于最后跳的步数一定小于 \(2^a\)(否则 \(a \neq {\log_2{k}}\)),所以可以直接在这个表上 \(O(1)\) 地找到 \(x\) 的 \(k\) 级祖先。最终我们用 \(O(n\log{n}+q)\)(以下 \(q\) 均与询问次数同阶)的时间解决了这个问题。

附上一份在 P5903 【模板】树上 K 级祖先 中跑得并不很快的代码。

代码
#include<bits/stdc++.h>
using namespace std;
#define ui unsigned int
ui s; inline ui get(ui x) {
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
return s = x;
}
struct node{
int end,nxt;
}edge[500100];
int n,q,root,cnt,head[500100],fa[22][500100],dep[500100],mxdp[500100],hson[500100],top[500100],pos[500100],lg[500100],ans;
vector<int> v[500100];
inline void add(int x,int y){
edge[++cnt]={y,head[x]};
head[x]=cnt;
}
void pre(int x,int y){
fa[0][x]=y;
dep[x]=dep[y]+1;
for(int i=1;i<20;++i) fa[i][x]=fa[i-1][fa[i-1][x]];
for(int i=head[x];i;i=edge[i].nxt){
pre(edge[i].end,x);
int tem=mxdp[edge[i].end]+1;
if(tem+1>mxdp[x]) mxdp[x]=tem,hson[x]=edge[i].end;
}
}
void dfs(int x,int y){
top[x]=y;
v[y].emplace_back(x);
if(hson[x]) dfs(hson[x],y);
for(int i=head[x];i;i=edge[i].nxt){
if(edge[i].end^hson[x])
dfs(edge[i].end,edge[i].end);
}
}
inline void query(int x,int y){
if(!y){ans=x;return;}
x=fa[lg[y]][x];
y-=(1<<lg[y]);
ans=v[top[x]][pos[x]+y];
}
int main(){
scanf("%d%d%u",&n,&q,&s);
for(int i=2;i<=n;++i) lg[i]=lg[i>>1]+1;
int ta,tb;
for(int i=1;i<=n;++i){
scanf("%d",&ta);
if(ta) add(ta,i);
else root=i;
}
pre(root,0);
dfs(root,root);
for(int i=1;i<=n;++i){
if(!v[i].empty()){
reverse(v[i].begin(),v[i].end());
int cur=0;
for(auto j:v[i]) pos[j]=cur++;
for(int j=v[i].size(),k=fa[0][i];j&&k;--j,k=fa[0][k]) v[i].emplace_back(k);
}
}
long long rtr=0;
for(int i=1;i<=q;++i){
ta=((get(s)^ans)%n)+1;
tb=((get(s)^ans)%dep[ta]+dep[ta])%dep[ta];
query(ta,tb);
rtr^=1ll*i*ans;
}
printf("%lld\n",rtr);
return 0;
}

长链剖分优化 dp

当我们在树上进行 dp 且有一维是 \(maxdep\) 是,可以考虑使用长链剖分进行优化。假设除了子树之间状态合并外所有操作复杂度均为 \(O(1)\)(包括直接继承状态和合并两个单个状态),子树间状态合并的复杂度与两颗子树中 \(maxdep\) 的最小值同阶,那么考虑每个节点直接继承重儿子的状态。然后以此合并各个轻儿子。可以发现所有合并的复杂度总和与每条重链的长度之和同阶(因为只有到达链顶使这条链在一条轻边下面才会发生一次复杂度与链长同阶的合并),所以总复杂度为 \(O(n)\)。

推图

Reference

壹雫空 - 百度百科

树链剖分 - OI Wiki

链剖分总结 - 洛谷专栏

【闲话 No.2】 长链剖分的更多相关文章

  1. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  2. LOJ3053 十二省联考2019 希望 容斥、树形DP、长链剖分

    传送门 官方题解其实讲的挺清楚了,就是锅有点多-- 一些有启发性的部分分 L=N 一个经典(反正我是不会)的容斥:最后的答案=对于每个点能够以它作为集合点的方案数-对于每条边能够以其两个端点作为集合点 ...

  3. BZOJ 3653: 谈笑风生(离线, 长链剖分, 后缀和)

    题意 给你一颗有 \(n\) 个点并且以 \(1\) 为根的树.共有 \(q\) 次询问,每次询问两个参数 \(p, k\) .询问有多少对点 \((p, a, b)\) 满足 \(p,a,b\) 为 ...

  4. 2019.03.11 COGS2652 秘术(天文密葬法)(分数规划+长链剖分)

    传送门 题意:nnn个点的树,每个点两个值a,ba,ba,b,问长度为mmm的路径∑ai∑bi\frac{\sum a_i}{\sum b_i}∑bi​∑ai​​的最大值. 思路:一眼要01分数规划, ...

  5. 【BZOJ3522】【BZOJ4543】【POI2014】Hotel 树形DP 长链剖分 启发式合并

    题目大意 ​ 给你一棵树,求有多少个组点满足\(x\neq y,x\neq z,y\neq z,dist_{x,y}=dist_{x,z}=dist_{y,z}\) ​ \(1\leq n\leq 1 ...

  6. 【Vijos】lxhgww的奇思妙想(长链剖分)

    题面 给定一棵树,每次询问一个点的\(k\)次祖先,强制在线. Vijos 题解 长链剖分. 链接暂时咕咕咕了. 现在可以戳链接看题解了 #include<iostream> #inclu ...

  7. 【BZOJ4543】Hotel加强版(长链剖分)

    [BZOJ4543]Hotel加强版(长链剖分) 题面 BZOJ,没有题面 洛谷,只是普通版本 题解 原来我们的\(O(n^2)\)做法是设\(f[i][j]\)表示以\(i\)为根的子树中,距离\( ...

  8. 【BZOJ3653】谈笑风生(长链剖分)

    [BZOJ3653]谈笑风生(长链剖分) 题面 BZOJ 洛谷 权限题啊.... 题解 首先根据题目给的条件,发现\(a,b\)都要是\(c\)的父亲. 所以这三个点是树上的一条深度单增的链. 因为\ ...

  9. 【CF1009F】Dominant Indices(长链剖分)

    [CF1009F]Dominant Indices(长链剖分) 题面 洛谷 CF 翻译: 给定一棵\(n\)个点,以\(1\)号点为根的有根树. 对于每个点,回答在它子树中, 假设距离它为\(d\)的 ...

  10. 【COGS2652】秘术「天文密葬法」(长链剖分,分数规划)

    [COGS2652]秘术「天文密葬法」(长链剖分,分数规划) 题面 Cogs 上面废话真多,建议直接拉到最下面看一句话题意吧: 给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σa ...

随机推荐

  1. Java并发编程实战-多线程任务执行

    Executor框架与线程池(ThreadPoolExecutor) Executor框架的组成 组件 作用 Executor 基础接口,仅定义execute(Runnable)方法,用于执行任务. ...

  2. 『Plotly实战指南』--布局基础篇

    在数据分析与可视化领域,一张优秀的图表不仅需要准确呈现数据,更应通过合理的布局提升信息传达效率,增强专业性和可读性. Plotly作为一款强大的Python可视化库,提供了丰富的布局定制功能,帮助我们 ...

  3. 解决宝塔环境composer报错:TypeError: Return value of Symfony\Component\Process\Process::close

    问题: 解决宝塔环境安装运行composer时报错:TypeError: Return value of Symfony\Component\Process\Process::close 不熟悉的人看 ...

  4. ElasticSearch学习文档

    中文文档:https://doc.codingdict.com/elasticsearch/ Elastic 官方网站:Free and Open Search: The Creators of El ...

  5. 可持久化 01-trie 简记

    本文略过了 trie 和 可持久化的介绍,如果没学过请先自学. 在求给定一个值 \(k\) 与区间中某些值的异或最大值时,可以考虑使用在线的数据结构可持久化 01-trie 来维护. 01-trie ...

  6. Spring基于注解的事务管理

    Spring基于注解的事务管理 源码 代码测试 pom.xml <?xml version="1.0" encoding="UTF-8"?> < ...

  7. Python实验4 列表与字典应用

    目的 :熟练操作组合数据类型. 试验任务: 基础:生日悖论分析.如果一个房间有23 人或以上,那么至少有两 个人的生日相同的概率大于50%.编写程序,输出在不同随机样本数 量下,23 个人中至少两个人 ...

  8. C#开发的Panel滚动分页控件 - 开源研究系列文章

    前些时候因为想拥有一个自己的软件快捷打开软件,于是参考Windows 11的开始菜单,进行了编写这个应用软件,里面有一个功能就是对显示的Panel里的应用对象的分页功能,于是就想写一个对Panel的自 ...

  9. Linux的二进制表示格式—ELF

    之前在解决项目中关于解析core文件中,了解了关于ELF的相关知识,当时还处于萌新(现在还处于萌新状态)对于ELF格式那是一脸懵,今天就对ELF做一个简单的了解. ELF 首先一个文本文件只有经过编译 ...

  10. TVM:PACKFUNC机制

    转载:https://www.cnblogs.com/wanger-sjtu/p/15063948.html 为实现多种语言支持,需要满足以下几点: 部署:编译结果可以从python/javascri ...