闲话 22.9.22

闲话

发现最近gtm在无意识(?)地唱《月光》。
于是放一下歌词!(其实就是你自己想放吧喂)

月光

ガラクタばかりを集めて
一味收集毫无价值的杂物
ボロ切れひとつを被せた
以一块破碎旧布轻轻包裹
醜い形をしたレプリカ
形成外貌拙劣的复制品
誰かが紡いだ言葉を
是将他人编织的话语
誰かが奏でた音色を
以及他人奏响的音色
歪にコラージュした偽物
扭曲地拼凑而成的仿制品

一番最初はベイルの中
最初只是隐藏面纱之下
革新的な少年の愛情が
革新性的少年热爱之情
僕ら
然而
気付いたらもう見えなくなる
它早已在不知不觉间无迹可寻
おもちゃを無くした子供が泣いている
独留我们像丢失了玩具的小孩一样哭泣

どうしてだろう?
究竟是为什么呢?
あのスポットライトに
在那聚光灯之下
照らされている
沐浴万众光芒的
その背中はまたこの手から
那个背影又再度
遠ざかっていく
逐渐远离这只手

あなたみたいに
绝对无法变成
なれやしなくて
像你这样的人
あの月を追いかけるように
如同追逐着那月亮一般
渇いた心は
充满渴望的内心
満たされないまま
至今也未能填满
一人になって一人になって
纵然失去同伴 即使孤身一人
くすんだ夢を見続けてしまった
也仍旧在追逐着日渐暗淡的梦想
なぞる僕たちは
模仿他人的我们

ガラクタだって、ボロ切れだって
哪怕毫无价值,即使衣衫褴褛
その心臓が放つ血液には
从心脏中喷涌而出的血液
僕だけの怒りがあった
也饱含独属于我的愤怒

足りないのなんだったんだろう
到底是哪里还不足够呢
神様に聞いてきたあとで
我试图向神明寻求答案
堕天使の弓矢に口止めされた
却被堕天使的弓箭堵上了嘴
初めから知っていたんだよ
其实从最初开始就已然知晓
忘れた芝居をしてんだよ
却选择视而不见故作遗忘
貰いもんの剣を抱きしめている
只是紧紧怀抱着那被赠与的宝剑

何十回目の失望だろう?
已经失望第几十次了呢?
いっそ何もかもを捨ててしまいたいと
甚至想要干脆就把一切都尽数抛弃吧
きっと最後は何も残らない
到头来肯定什么也不会剩下
愛も、紡いだ音も、名前も朽ちていく
爱、纺织的音色、甚至名字都归于腐朽

どうしてだろう?
究竟是为什么呢?
この胸の奥に
这在我的内心深处
こびり付いている
紧紧缠绕不放
冬の夜の静寂に似た孤独を
犹如冬夜的静寂一般的孤独

あなたはきっと
你肯定就连这一点
知りもしないで
都不曾知晓吧
一人星を見ていた
独自一人看着星星
赤い目の僕に気も留めないまま
丝毫没有留意到我已通红的双眼
隣に立った
近在身旁的你
あなたは遠くて
却显得如此遥远
くすんだ夢も見えなくなってしまって
就连那日渐暗淡的梦想也已经无迹可寻
それでも追い続けて
即使如此仍不停追逐

偽物だって、真実(ほんとう)だって
是虚假也好,是真实也罢
今振り返ればただそこには
此刻若回首过往 会发现在那里
ぼやけた記憶があった
只留下一片朦胧的记忆

廃物と化したアイロニー
面对化作废品的冷嘲热讽
クリシェを抜け出したいのに
明明想要从那陈词滥调中脱身
「また誰かの焼き直し?」
“然而终究还是谁的翻版?”
数多の星の屑たち
漫天闪烁的群星们
沈み消えゆくユースタシー
随着海面升降徐徐沉没
無慈悲な月の光
徒留这残忍月光

「アイデンティティさえまやかし?」
“就连自我证明亦是伪造?”
「盗んででも愛が欲しい?」
“不惜偷窃也想要这份爱?”

羊のような雲が浮かんだ昼すぎ
飘浮着羊羔般轻柔的云朵的午后
懐かしい歌が風に揺れている
令人怀念的歌声随风轻轻飘扬
あなたの声で教えて貰った言葉
你曾经告诉过我的那些珍贵话语
今でも忘れぬように
如今的我也依然谨记于心
書き留めてる同じことを
不曾忘记 从未改变

あなたみたいに
绝对无法变成
なれやしなくて
像你这样的人
あの月を追いかけるように
如同追逐着那月亮一般
渇いた心は
充满渴望的内心
満たされないまま
至今也未能填满
時間が経って
纵然时间流逝
時間が経って
即便历经风霜
振り返る時目を逸らさぬように
回顾往事时 只愿那眼神不必躲闪
なぞる僕たちは
模仿他人的我们

ガラクタだって、ボロ切れだって
哪怕毫无价值,即使衣衫褴褛
醒めぬ夢を追っていった先には
在追逐永不醒来的梦想之路上
僕だけの光が、ずっと
只属于我的光芒,永远在前方闪耀

是一首满含深意的歌呢
希望能多读几遍歌词,比较感动人。

gtm问我开头怎么唱
然后我就流利地唱了前一分多钟的词
并暴论“饭的歌我哪首都记得清清楚楚”
其实早期的歌能不能唱还是存疑的
在那之后就无意识地哼了半个小时的《月光》,被某人在博客里抱怨,按下不表。

在犇犇里发的歌词一般而言是我已经无意识中唱了好几小时的词
因此比较有意义(

现在第一段能流利唱出来(而且能第一时间想到)的似乎只有《第三心脏》《若能化作彗星》和《雾霭相随》
第三首只会个开头
如果让我边听边唱还看歌词那肯定哪首都没问题(

关于ARC

事先声明这不是某个缩写为Arc的游戏的相关内容。
博主不玩这游戏。

ARC125D

给出一个长度为 \(n\) 的序列 \(a\),输出满足以下条件的子序列个数,模 998244353。

条件:从 \(a\) 中取出这个序列的方案唯一。

\(n ,a[i] \le 2\times 10^5\).

这个东西场上我差一点推出来。在考后20min拿到200pts的秘诀就是场上把所有题都推到只剩最后一步然后不写

\(f[i]\) 为以 \(a_i\) 为最终元素的子序列中唯一的序列个数。定义比较含糊,但也没必要定义的很清楚,只需要知道这玩意值的加和是答案就行。然后考虑怎么dp。

如果当前这个位置的数第一次出现,那显然设 \(f[i]\) 的初值为 1,然后把前面所有的值都加到它身上,因为这个东西往什么序列后面加一个数都不会重。
如果这个位置的数不是第一次出现,那记上一次出现的位置是 \(\text{last}[i]\)。我们把 \([\text{last}[i], i)\) 里的数都加到 \(f[i]\) 身上,再把 \(f[\text{last}[i]]\) 归零。

解释后半部分的意思。首先,向\((\text{last}[i], i)\) 区间对应的序列后面加一个新数对唯一性是没有影响的。而如果 \(f[\text{last}[i]]\) 确实表示了一些序列,那向他们后面再加一个相同的数在当前情况下肯定是新序列,但是在当前情况下 \(f[\text{last}[i]]\) 对应的序列就不是新序列了,所以需要删除。
由此可见,\(f[1...i]\) 里存的是dp到 \(i\) 位置时的最新情况。

这个东西直接模拟是 \(O(n^2)\) 的,用个BIT是 \(O(n\log n)\) 的。
没了。

哦对了还有代码
#include <bits/stdc++.h>
#define rep(i,a,b) for (register int (i) = (a); (i) <= (b); ++(i))
#define pre(i,a,b) for (register int (i) = (a); (i) >= (b); --(i))
using namespace std;
const int N = 5e5 + 10, mod = 998244353;
int n, a[N], f[N], lst[N], tmp[N];

void get(int & x){ /*Read In Something*/ } 

int Index[N];
void add(int p, int v) {
	while (p <= n) {
		Index[p] = (Index[p] + v) % mod;
		p += p & -p;
	}
}
int qry(int p) {
	int ret = 0;
	while (p) {
		ret = (ret + Index[p]) % mod;
		p ^= p & -p;
	} return ret;
}

signed main() {
	get(n);
	rep(i,1,n) get(a[i]), lst[i] = tmp[a[i]], tmp[a[i]] = i;

	rep(i,1,n) {
		if (lst[i] == 0) f[i] = (qry(i - 1) + 1) % mod;
		else f[i] = (qry(i - 1) - qry(lst[i] - 1) + mod) % mod, add(lst[i], mod - f[lst[i]]);
		add(i, f[i]);
	}

	cout << qry(n) << endl;
    return 0;
}

ARC126D

给出长度为 \(n\) 的数组 \(a\),每一项是 \(1\)\(k\) 之间的一个整数,可以任意交换相邻的两项。找出最小的交换次数,使得 \(a\) 中连续出现 \(1,2,3,\dots k\)

\(n \le 200, k \le 16\).

因为这个玩意状态不好确定,考虑一手状压。

我们设 \(f[i][S]\) 为dp到 \(i\) 位置,当前已选状态为 \(S\) 的最小交换次数。
然后考虑一个状态 \(S_0\) 的花费。

  1. 当前值移动到自己需要去的位置
    我们发现,\(a[i]\) 从最末尾移动到他所在位置,需要和当前所选内容中与他成逆序对的元素进行交换。这样的元素共有 \(\text{popcount}(S_0 >> a[i])\) 个。因此有

    \[f[i][S_0 | (1<<a[i])] = f[i-1][S_0] + \text{popcount}(S_0 >> a[i]) \]

  2. 当前情况下不相邻的元素移动到一起
    我们发现,这些元素想要挨在一起,其实就相当于将当前状态下的 \(0\) 放到一边去。于是有花费 \(k - \text{popcount}(S_0)\)。另一方面,我们也可以将 \(0\) 视作存在元素,因此花费也可为 \(\text{popcount}(S_0)\)。两者取较小值即可。

    \[f[i][S_0] = f[i-1][S_0] + \min(\text{popcount}(S_0),k - \text{popcount}(S_0)) \]

进行dp即可。第一维可以自然滚掉。

需要注意的是,库函数中的 \(\text{popcount}()\) 常数较大,如果想要优秀的实现可以考虑递推实现求二进制 \(1\) 个数。

这是没卡常的,放心看
#include <bits/stdc++.h>
#define rep(i,a,b) for (register int (i) = (a); (i) <= (b); ++(i))
#define pre(i,a,b) for (register int (i) = (a); (i) >= (b); --(i))
using namespace std;
typedef long long ll;
int n, k, a[202], S, f[1<<16], ans = 0x3f3f3f3f;

#define cnt(p) (__builtin_popcount(p))
void get(int & x){ /*Read In Something*/ } 

signed main() {
    get(n, k); S = (1<<k) - 1;
    rep(i,1,n) get(a[i]), a[i]--;

    memset(f, 0x3f, sizeof f);
    f[0] = 0;
    rep(i,1,n) {
        pre(s,S,0) {
            f[s | (1<<a[i])] = min(f[s | (1<<a[i])], f[s] + cnt(s >> a[i]));
            f[s] += min(cnt(s), cnt(S ^ s));
        }
    }

    cout << f[S];
    return 0;
}
posted @ 2022-09-22 20:04  joke3579  阅读(106)  评论(2编辑  收藏  举报