壱雫空

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

もしこの雨が上がっても

忘れずに歩いてくよ

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

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

(遮って隠れた)

そっと逃げ込んでいた

ビニール越しの空から

こぼれ落ちる音響いて

(弾けた合図)

滲む心へと溶けた

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

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

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

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

無色でもそこにあるもの

この雨が上がってく時

なにもなかったように

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

上手に折り畳めないから

過ぎ去ってしまう瞬間を

僕はあつめたいよ

ああ ひとしずくを

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

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

風に震えては

ぐずついてる僕みたいな

くすんでる今日を映した

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

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

ただよう雲だって 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. Warning MVC1000

    场景重现 视图文件中有些代码如下: @Html.Partial("_Footer") 会出现警告: // 警告 MVC1000 Use of IHtmlHelper.Partial ...

  2. Linux终端居然也可以做文件浏览器?

    大家好,我是良许. 在抖音上做直播已经整整 5 个月了,我很自豪我一路坚持到了现在[笑脸] 最近我在做直播的时候,也开始学习鱼皮大佬,直播写代码.当然我不懂 Java 后端,因此就写写自己擅长的 Sh ...

  3. 一些CF上的补题0504

    知识点模块 1.通过三点计算三角形的面积可以这样写 area=fabs(x1*y2-x2*y1+x2*y3-x3*y2+x3*y1-x1*y3)/2; 2.最小公倍数与最大公约数 x×y=gcd(x, ...

  4. SpringSecurity5(14-Gateway整合)

    MVC 与 WebFlux 关系 SpringSecurity 设置要采用响应式配置,基于 WebFlux 中 WebFilter 实现,与 Spring MVC 的 Security 是通过 Ser ...

  5. STM32F4_HAL_CAN总线注意事项

    如果CAN总线没有连接其他设备,即HL是悬空状态,则发送会失败,下图的Error_Handler需要屏蔽,否则会造成系统卡顿,或影响其他功能模块的使用 /* ********************* ...

  6. 云备份技术解析:云容灾 CT-CDR 关键技术介绍

    本文分享自天翼云开发者社区<云备份技术解析:云容灾 CT-CDR 关键技术介绍>,作者:沈****军 1.CDP+存储快照,实现秒级RPO (1)CDP技术:云容灾CT-CDR(Cloud ...

  7. MySQL建立RFM模型

    1.数据来源 charge_record表数据 提取代码如下: # coding=utf-8import pymysql# 原数据库链接db1 = pymysql.connect( host='*** ...

  8. bat脚本之启动MySQL服务

    @echo off :: 获取管理员权限 %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute(&quo ...

  9. iOS深色模式媒体查询css

    @media (prefers-color-scheme: dark) { body { background-color: #000; color: #fff; } }

  10. .net6 中间件

    参照资料: ASP.NET Core 中间件 | Microsoft Learn ASP.NET Core端点路由 作用原理 - 知乎 (zhihu.com) 一.概念 中间件是一种装配到应用管道以处 ...