闲话 22.8.9

闲话

回家听了《独自摇曳》和《dogma》
完了已经被洗脑了

我:我是羊攻
gtm:我是羊攻
jjdw:我是凉宫

今天是《riri》!一首很有rock风格的歌!
虽然但是,其实里面有着很细腻的情感,可以好好品味
是成熟的少女riri在与nana分别后所感伤的话语
riri的话,是miku唱的 就很有电子风格 更能体现理解后的伤感
nana的话 是饭唱的 很温柔 有着儿童天真无邪的情感

リリ

泣いてしまったイノセンスを
因不知如何去安慰
慰めるすべも無いから
流泪不止的天真
信じていいと思った
还以为可以信任
信じていいと思った
本以为值得信任
全部言わない方がいいよね
要是全部都没有说该多好
君に押し付けたイノセンスは
强加在你身上的那份天真
僕の代わりの夢のようです
就仿佛我自己的梦想的代替
生きてもいいと思った
还以为可以活下去
死んでもいいと思った
还以为不在乎死亡
傷つけないなら
还以为只要不受伤
なんでも良いと思った
无论怎样都无所谓

大好きだった狂いそうなほど
我曾几近疯狂的喜欢你
何も話せなかった
什么也不曾告诉你
嫌われたくなかった
因为不愿意被你讨厌
ただこの冷めた瞳を溶かすのは
只是要融化那双冰凉的眼眸
君のイノセンスが僕を知る時だ
唯有在你的天真了解我之后

例えば誰かが
即使有人
僕らの邪魔をしていて
来阻碍我们
それでも僕らは
我也打算
一緒に居ようとしていて
一定要和你在一起
もしもそうだったら?
如果真是这样会如何?
涙も要らなかったかな
或许连眼泪都不会流吧

例えば 僕らが
假如我们
例えば 僕らが 例えば
假如我们 假如
例えば 例えば 例えば
假如 假如 假如

大好きだった忘れそうなほど
我几乎快忘记自己曾多么迷恋于你
君の青い髪が
你青蓝的发丝
僕のイノセンスだった
便是我曾经的天真
あの日大人のフリして
希望你能原谅那一天
逃げた馬鹿な僕を
假装大人逃开的样子
許して欲しかった
那愚蠢的我

ボロボロになったイノセンスで
请怀揣你那支离破碎的天真
僕を認めてよ
认可我吧

这让我想起了苏轼的《江城子·乙卯正月二十日夜记梦》。
都是怀念相离之人,都有着“欲忘而不得”的想法
春卷饭的歌 真的很有诗意
春卷饭在成年前是不是女性啊怎么那么会写

《riri》是我随机抽到的(
jjdw没歌词了于是让我帮他抽一首
于是我抽到了nana,和riri的视角相对应
可以看到一个天真无邪的少女向往着对方
点这里看!

按位

按位的思想,是以确定的方式遍历每个二进制位或二进制值,多见于状态压缩与按位确定答案中。

BZOJ2165

以邻接矩阵 \(g\) 方式给定一张 \(n\) 个点的有向图,\(g[i][j] > 0\) 表示 \(i \rightarrow j\) 有一条长为 \(g[i][j]\) 的边,\(g[i][j] = 0\) 表示 \(i,j\) 不连通。求图中从 \(1\) 开始长度 $ \ge m$ 且边数最少的路径经过的边数。

\(n \le 100, \ m \le 1e18\)

考虑矩阵乘法。定义 \(A \times B = S\) 以如下方式确定rhs矩阵:

\[S_{(i,j)} = \max_{k = 1}^n (A_{(i,k)} + B_{(k,j)}) , A_{(i,k)} \neq 0, B_{(k,j)} \neq 0 \]

\(f[p]\) 表示经过 \(2^p\) 条边后最长路径的邻接矩阵,此矩阵可通过倍增乘法迅速求得,边界为第一行存在一个数字 $ \ge m$ 。
随后考虑如何求得“差一步就能得到结果”的矩阵。我们为求得差一步,先考虑如何求得差 \(2^k\) 步。
考虑按位取得答案。讨论答案中第 \(k\) 位的01性。我们首先令 \(G\) 为确定到 \(k+1\) 位的矩阵,随后判断 \(G \times f[k]\) 的第一行是否存在 $ \ge m$ 的数字。若不存在,答案的第 \(k\) 位可以为1,并 \(G \leftarrow G \times f[k]\) 。确定到最后一位,答案+1即为最终答案。

代码
struct matrix {
    int mat[102][102];
    matrix() {
        rep(i,1,n) rep(j,1,n) mat[i][j] = 0;
    }
    void scan() {
        rep(i,1,n) rep(j,1,n) {
            scanf("%lld", &mat[i][j]);
            if (mat[i][j] == 0) mat[i][j] = -inf;
        }
    }
    matrix operator * (const matrix & b) const {
        matrix ret;
        rep(i,1,n) rep(j,1,n) {
            ret.mat[i][j] = -inf;
            rep(k,1,n) ret.mat[i][j] = max(ret.mat[i][j], mat[i][k] + b.mat[k][j]);
            if (ret.mat[i][j] > M) ret.mat[i][j] = M;
        } return ret;
    } 
    bool check() {
        rep(i,1,n) if (mat[1][i] >= M) return 1;
        return 0;
    }
} f[102];

signed main() {
    scanf("%lld", &T);
    while (T--) {
        scanf("%lld %lld", &n, &M);
        f[1].scan();
        int cnt = 1;
        while (1) {
            f[cnt+1] = f[cnt] * f[cnt];
            if(f[cnt+1].check()) break;
            cnt++;
        } matrix tmp = f[1];
		int ans = 1;
		pre(i,cnt,1){
			matrix x = tmp * f[i];
			if(!x.check()) {
                tmp = x;
				ans += 1ll << (i-1);
			}
		} printf("%lld\n",ans+1);
	} return 0;
}

APIO2007

一个环上包含 \(n\) 个点,有 \(c\) 个人要去看,每个人都有一个站的位置。假设 \(ta\) 站在位置 \(x\),则 \(ta\) 只能看到区间 \([x,x+4]\),这 \(5\) 个位置的点。每个人都有喜欢的和讨厌的点,一个人开心当且仅当一个 \(ta\) 喜欢的点没有被移走或者一个 \(a\) 讨厌的点被移走了,求怎么设计移走点能使开心的人数最多,输出这个人数。

对于 \(100\%\) 的数据,\(10 \le N \le 10^4\)\(1 \le C \le 5\times 10^4\)\(1 \le x \le N\)

好这是一道状态压缩题。状态压缩的意思就是把一种或很多种情况用一个01串表示,随后对这个压缩后的状态空间进行遍历。由于需要对状态空间压缩,所以基本上数据范围不会很大。如果 \(\le 20\) 的话可以直接考虑压缩。
这题就不是很正常的状压,因为显然你没法把整个环压成01串,尽管这题的状压明显是第i位为1表示移走第i个点,为0则不移走。然而我们可以把一个人看到的一段压成01串,每次取得后四位并左移作为下一次dp的起始状态。

大概的代码
cin >> numAni >> numChi;
for (int k = 1; k <= numChi; k++) {
	cin >> pos >> fe >> l;
	fear = 0, like = 0;
	for (int i = 1; i <= fe; i++) {
		cin >> tmp;
		tmp -= pos;
		if (tmp < 0) tmp += numAni;
		fear |= (1<<tmp);
} for (int i = 1; i <= l; i++) {
	cin >> tmp;
		tmp -= pos;
		if (tmp < 0) tmp += numAni;
		like |= (1<<tmp);
	} for (int i = 0; i < 32; i++) {
		if (((i & fear) or (~i & like))) {
			cnt[pos][i]++;
		}
	}
} for (int i = 0; i < 32; i++) {
	memset(f[0], -0x3f, sizeof f[0]);
	f[0][i] = 0;
	for (int j = 1; j <= numAni; j++) {
		for (int k = 0; k < 32; k++) {
			f[j][k] = max(f[j-1][(k&15)<<1], f[j-1][(k&15)<<1|1]) + cnt[j][k];
		}
	} ans = max(ans, f[numAni][i]);
} cout << ans;

SCOI2009

Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 \(2\) 的正整数被称为 Windy 数。
Windy 想知道,在 \(A\)\(B\) 之间,包括 \(A\)\(B\) ,总共有多少个 Windy 数?

\(A,B \le 1e18\)

十进制也算按位!所以这种是数位dp,按每一位该放什么来进行dp。因为给出的一般是很大的十进制数,因此需要按每一位填入十进制数字。
进行dfs遍历状态空间即可。由于是按位,所以需要进行状态压缩。每次只需要确定当前位和先前一位的数字即可转移。

大概的代码
int f[15][15];
int stk[15], top;
int dfs(int now, int lst, bool zero, bool mx) {
	if (now == 0) return !zero;
	if (!zero and !mx and f[now][lst] != -1) {
		return f[now][lst];
	} int tmp = (mx ? stk[now] : 9), ret = 0;
	rep(i,0,tmp) {
		if (zero or abs(i - lst) >= 2) ret += dfs(now-1, i, zero and i == 0, mx and i == tmp);
	} if (!mx and !zero) f[now][lst] = ret;
	return ret;
}
int get_ans(int val) {
	top = 0;
	while (val) {
		stk[++top] = val % 10;
		val /= 10;
	} return dfs(top, 0, 1, 1);
}
posted @ 2022-08-09 19:38  joke3579  阅读(104)  评论(5编辑  收藏  举报