阅读视图

发现新文章,点击刷新页面。
🔲 ☆

《赛博行动酒保行动》相关

为了去隔壁给 talk,不得不又重温了本作 = =。

我觉得要是游戏也和隔壁 NeurIPS 一样,发时间检验奖(Test-of-Time Award)的话,一个评判标准我觉得大概得是这个游戏是否引领了很多 xxx-like,那按照这个标准 rogue 是必然能上榜的,《银河战士》和《恶魔城月下夜想曲》大概也能的!

在调研了一番之后,很神奇的是我觉得《赛博行动酒保行动》后续也有很多酒保行动-like 的!

首先我觉得本作的设计在一个 game jam 体量的作品里还是非常特别的!你说它是模拟经营吧,不能说没有但是怎么看也不如今年爆红的《沙威玛传奇》,这个游戏绝对是 AI 游戏的代表作了,哈哈玩法我觉得是那种经典古早 flash 游戏,最后一看人家作者还真写 flash(什么,《沙威玛传奇》都能玩出竞速模式吗?)。

你说它是 galgame 吧,hmmm,它居然连对话选项都没有,但分支剧情又都是通过调酒玩法和经营的分数去触发的,这点又类似《仙剑客栈》那样的传统模拟经营了。

我觉得整体氛围最接近显然是 Coffee Talk 系列,虽然背景设定类似《奥秘:蒸汽与魔法》那样有点偏奇幻。

然后同样赛博朋克世界观下的有《红弦俱乐部》以及之前在游机会玩到的《爱&机器人维修技术》

居然还有这么多联动。。。
如何评价少女前线与VA-11 Hall-A赛博朋克酒保行动的联动活动?
赛博朋克酒保行动和赛博朋克红究竟联动了啥?(特别节目)【夜之城求生指南】

🔲 ☆

《疯狂动物城2》观后感

由于最近在填坑,所以刚好记录一下剧情。

(剧透警告!)

剧情

首先感觉两部的核心除了尼克和朱迪这一对 cp 的性格和阵营上的冲突,还有一个是如何维护 Zootopia 的 DEI(尽管这好像是一个被用坏掉了的词),第一部是肉食动物与草食动物之间,第二部则是哺乳动物和爬行动物之间。

故事开场利用了一场马里奥赛车一样的追逐戏快速的让我进入了状态,并且通过留下的蛇皮也制造了十足的悬念。使得我开始期待一个梅兰妮或是神偷卡门那样的展开,可结果光速发生第一次剧情上的反转,此时朱迪和尼克的阵营上的冲突也开始显现,尼克作为混乱中立显然不想掺和进去,而朱迪作为守序善良自然要贯彻自己 make the world a better place 的信念自然不惜深入险境。

不过我这里感觉是这个翻转比隔壁阿兹卡班的囚徒还要快,凭借蛇蛇的一面之词朱迪的立场就光速翻转,还险些害死了 Chief Bogo!接下来就进入死亡圣器的逃亡环节,朱迪像 cyberpunk 2077 里流浪者阵营一样开始了大逃亡,经过一个神似长弓溪谷坠机之地的水上集市(但是人很多)的地方之后,来到了一个有点像元组星球大战那样的地下酒吧,然后莫名其妙任务道具就丢了。中间一段踩河马脑袋的演出真的就像这类3D平台跳跃游戏的解谜一样,前面甚至还有铺垫的,你肯定在奥德赛 or 古惑狼里遇到过类似的关卡。

钻管子的演出也让人感觉有点梦回超级马里奥大电影。然后尼克就被抓了,说实话我要是朱迪这个时候我肯定已经后悔自责的要死了,第一要务肯定是去救尼克,而不是信任这个蛇蛇。不过尼克遇到了神仙队友居然这么轻易的就越狱成功了。

话说这只竹叶青居然叫 garry,ib 里的 garry 也恰好代表色是蓝色。

然后第二波翻转我方小队里迅速的出现了一个内鬼,说实话我一开始还以为蛇蛇和这个猞猁是 cp 关系,然后上演一场出类似隔壁叙拉古人那样对家族的反抗的剧情,结果居然跳反了?不过这期反派实在战斗力不太行,被有惊无险的光速击败了。

女性主义

回来的路上 m200 说到,尼克在本作不就是一般意义上的女主位置么。确实,不过这种创作手法也不是第一次见到了,最经典的例子可能就是《空之轨迹FC》里的艾丝蒂尔和约修亚了吧。然后尼克本作完全就是宠妻狂魔,朱迪感觉完全就像是少根筋的直男似的,拜托我都没你这么焦虑!也就是你是迪士尼童话故事的主角不然感觉中间我们都死好几次了都。

上面这个视频居然没提到寄生前夜的女主 Aya,她可是我小时候玩过的觉得印象最深刻的女主角了,可能原因之一是她除了要和 boss 作战,还要面对来自身体内部线粒体内部的对抗与挣扎。

总之我觉得本作无论是对女性主义,对 DEI,对刻板印象的反击(神话、寓言故事里蛇通常是邪恶的)都处理的非常自然,感觉比《冰雪奇缘》还要棒!(除了没有女同)

🔲 ☆

AtCoder Beginner Contest 409

先把所有数都减一,n 表示进行了 n 个回合。

设 E[i] 为最后 i 出现的期望次数。那么显然 E[n] 最容易求,就是每次都 p,E[0] 也容易求,每个回合的 delta 只与当前有多少个 0 有关,看起来可以递推。
E[n-1] 则需要讨论一下,E[n-2] 就更要讨论了。

仔细观察,我们发现不得不枚举第一次出现 i 的时刻,设 A[i][j] 等于 i 第一次出现在 j 时刻的概率,我们有:

E[i] = A[i][j] B[n-j] | j = 0..n

这里 B[i] 表示当前最高位后续再进行 i 个回合期望出现多少次,和求 E[0] 类似,这个值只与后续进行的回合数有关!

进一步,考察 A[i][j],最后第 j 时刻必然是 p 事件,前面二项分布即可:

A[i][j] = C(j-1, i-1) p^i (1-p)^(j-i)

考察 B[i] 有:

B[0] = 1
B[i] = B[i-1] + B[i-1] / n-i

于是可以得到暴力 O(n2) dp。

#include <lastweapon/io>
#include <lastweapon/number>
using namespace lastweapon;

const int N = 1009;
Int Fact[N], iFact[N];
Int E[N], A[N], B[N];
int n, p, q;

Int Binom(int n, int m) {
    if (m < 0 || m > n) return 0;
    return Fact[n] * iFact[m] * iFact[n-m];
}

int main(){
    MOD = 998244353; RD(n, p); p = Int(p) / 100; q = Int(1) - p;
    Fact[0] = 1; REP_1(i, n) Fact[i] = Fact[i-1] * i;
    iFact[n] = _I(Fact[n]); DWN_1(i, n, 1) iFact[i-1] = iFact[i] * i;
    B[0] = 1; FOR(i, 1, n) B[i] = B[i-1] * (q+n-i) / (n-i);

<pre><code>E[0] = B[n-1]; FOR(i, 1, n) {
    FOR(j, i, n) E[i] += Binom(j-1, i-1) * pow(p, i) * pow(q, j-i) * B[n-1-j];
}

REP(i, n) printf(&amp;quot;%d\n&amp;quot;, E[i]);
</code></pre>

}

再卷积即可。

🔲 ☆

UOJ #188. 【UR #13】Sanrd

题意:次小素因子前缀和。

类似 PE 521 求最小素因子前缀和,虽然不是积性函数,但不妨碍我们筛。

令 S(n, k) 表示次小质因子 >= P[k] 时的前缀和(P[0] = 0)。
转移,分两种情况:
1. 剩余部分是一个更大的素数,贡献是,p * (g[id(n)] – g[p])。
2. 枚举最小因子分解,递归。

#include <lastweapon/io>
using namespace std;

const int N = int(1e6) + 9;
LL n; int nn; int P[N], Pn;
LL di[N], g[N]; int dn;
inline int id(LL x) {return x <= nn ? x : dn-n/x+1;}

LL S(LL n, int k) {
    int p = P[k]; if (n <= p) return 0;
    LL z = p * (g[id(n)] - g[p]);
    FOR_1(i, k+1, Pn) {
        LL p = P[i]; if (p*p > n) break;
        for (LL j=n/p;j>=p;j/=p) {
            z += S(j, i) + p;
        }
    }
    return z;
}

LL S(LL n) {
    ::n = n; nn = sqrt(n); Pn = dn = 0;
    for (LL i=1,j;i<=n;i=j+1) {
        di[++dn] = j = n/(n/i);
        g[dn] = j-1;
    }
    FOR_1(p, 2, nn) if (g[p] != g[p-1]) {
        P[++Pn] = p; for (LL i=dn,ii=di[i];(LL)p*p<=ii;ii=di[--i]) {
            g[i] -= g[id(ii/p)] - g[p-1];
        }
    }
    if (!Pn) return 0;
    return S(n, 0);
}

int main(){
    LL l, r; RD(l, r);
    cout << S(r) - S(l-1) << endl;
}
🔲 ⭐

《浅谈函数最值的动态维护》学习笔记

感觉需要按照 这个顺序 重新复习一下线段树,掌握一下先进姿势!

首先我觉得最重要的就是仔细学习 atc 模板:

虽然线段树模板茫茫多,但是这个无疑依然是目前最有生命力的一个,它不仅适用范围广,速度快(里面居然是个 zkw 树),而后面的 lazysegtree 模板的原理现在大家所说的「双半群」模型。
领悟之后我们发现大部分线段树问题竟然都变成了无脑填空题囧!!

而另一个技术就是势能线段树!简单来说就是有些修改操作破坏半群性质修改的情况,我们找到区间后先暴力清空,或者放宽找区间的代码,递归下去。
这样看似暴力,但是因为有些时候修改操作可以势能分析,发现复杂度没变!
最经典的模型就是区间取模取根,区间染色,以及区间 CheckMin QueryMax!

🔲 ☆

UOJ #164. 【清华集训2015】V

Kimi 居然会做这个题的暴力 https://kimi.moonshot.cn/share/cvaqfgsjc3febjghkqh0
除了一些细节问题(欧姆定律和电阻公式实际不需要,要开 long long),实际能拿 40 分

然后注意到本题的这个区间减操作,是不能减成负值的(AI 居然也能注意到?),所以我们还需要支持区间最值操作,而区间赋值操作是可以用区间最值模拟的,具体说来我们需要维护一个双半群,标记合并是:

struct F{LL a0, b0, a1, b1;};
F comp(F r, F l) {
    return F{
        max(l.a0+r.a0,-INFF),
        max(l.b0+r.a0, r.b0),
        max(l.a1,l.a0+r.a1),
        max(l.b1,l.b0+r.a1,r.b1)
    };
}

注意这里历史标记需要当前标记的信息来维护,所以不能开两个线段树分别维护。

https://uoj.ac/submission/745579

☑️ ⭐

Luogu P4314. CPU 监控

https://www.luogu.com.cn/problem/P4314

先不考虑赋值操作,先拿个 20 分。

再考虑赋值操作对标记的影响,显然我们不能对每个状态开一个 vector 记录所有历史操作,但我们发现赋值操作可以清空前面的所有历史操作,且之后的加减操作可以和这个赋值操作合并。
因此我们只需要 (a, b) 两个数表示先加再赋值即可描述标记。
再讨论操作,对于加减操作,如果之前存在赋值,我们转化成赋值操作即可。

手写下放标记思路是比较清晰的。
https://www.luogu.com.cn/record/207893466
难点主要是分情况讨论,赋值存在和不存在的情况,如果开 LL 的话还可以用哨兵少开一个数组!

当然我们发现强行套 atc 模板双半群填空大法也是可以的!
https://www.luogu.com.cn/record/208212684

后来经过这个题的启发,我们发现直接用 checkMax 去模拟赋值可能是更好的选择?
https://www.luogu.com.cn/record/208211497

这个写法果然和模板相性更好,不仅不用分情况讨论,合并操作更简洁减少犯错的机会,
而且 checkMax 能模拟 set,反过来却不能,应用范围也更广更强大!

还有一个细节是 op 和 mapp 里是不需要 checkMax(b, a) 的,因为维护标记的过程就隐含了这层逻辑。

☑️ ⭐

Ethflow Round 1 (Codeforces Round 1001, Div. 1 + Div. 2)

Problem E.

又是树上又是反常游戏(misere-game)的,不过和之前的 Goodbye 2024 的这个题一样,都不会进行太深的轮次,所以都不需要用 sg 理论等高级知识 = =。

必胜态:存在一条到必败态的决策。
必败态:所有决策都引向必胜。

我们按照 w 从大到小排序,显然选择最大的 w 决策必败,其次所有更大的 w 都在决策点子树里的状态也必败,反之必胜(后手剩下的决策都引向必胜)。

因此第一问只需要用 dfs 序,看子树里有没有处理过的点即可,最简单的是直接用树状数组每次标记下求个和,也可以求所有更大节点的 lca 看在不在子树里,因为可以基数排序所以后者实际可以 O(n),标程用了前后缀和看子树外有没有省去了 lca 和树状数组。

第二问难度陡增。。

除了上面的情况,后手要赢,要么没得走,要么必然存在先手还能走的决策,只要从这些决策里选最大的先手走完必然自己不能再走,就可以确保获胜,

所以剩下的必胜态也必须都像第一问里的状态那样,能够一步将死对面。

因此我们可以枚举先手和后手的决策,然后看不存在第三步即可。

但是这样复杂度太高,我们考虑只枚举后手决策,因为按上面的分析第三步可以打包处理,现在只需要检查是否存在合法的先手决策即可。

🔲 ☆

区间子串询问

初见杀,实际套路,应该放一起做!

首先能离线当然考虑离线(Ukkonen 可以魔改支持左删,但是好像还是不能很好的支持左加和右删,否则我们甚至能莫队?),
那么我们只要维护一个线段树记录询问左端点在不同位置的答案,考察增加操作对线段树的影响,发现只影响 fail 树向上的节点,最后一步动态树优化即可,复杂度 O(nlog2n + mlogn)。

和 BZOJ_2555 相比,这里由于我们不需要强制在线,动态树不需要在后缀自动机插入字符时候跟随 SAM 变化形态,只需要在全部插入完后根据 fail 树构建即可,因而也可以树链剖分啊启发式合并啊替代动态树的环节。

具体来看,先考察 Luogu P6292 区间本质不同子串个数,每次添加新字符时,先把所有位置都加 1,然后类似 dquery 一题的搞法,我们记录上次添加的时刻以去掉重复计数的部分,而这只需要沿着 fail 树向上,并记录每个状态上次计数的时刻即可。这里的线段树只需要支持区间加减,区间求和,因而也可以用树状树组替代。

观察这里的动态树这里其实唯一的用处就只有压缩 fail 树 = =,我们只需要维护上次访问的标记即可,其它信息都可以从 SAM 中拿到,因为 Splay 之后父节点和自己刚好形成压缩后的 endpos 区间。

fzoi 那枚只需要把线段树从区间加常数变成加等差数列。再看 uoj 608,这里我们线段树需要支持的是区间等差数列 checkMax,由于这个标记是单调的,所以可以简单标记持久化,动态树同样只起到压缩 fail 树的功能,完全不用改!

☑️ ☆

UOJ #131. 【NOI2015】品酒大会

显然我们只需要在后缀树上 dp 即可,比较容易的写法是逆序构造 sam。https://www.luogu.com.cn/record/196889119

另外因为后缀树组的 height 数组上建笛卡尔树叶可以构造出 fail 树等价结构,而 height 数组恰好对应了 n-1 个内点,height 对应后缀共享的最长公共前缀 len,n 个空儿子恰好对应了 |endpos| = 1 的叶子结点。(https://github.com/981377660LMT/algorithm-study/blob/585e0b2b800fa08ae1fc4e89fd53fa64a2683510/17_%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D/%E5%90%8E%E7%BC%80%E6%A0%91/SuffixTree.go

https://www.luogu.com.cn/record/196821208

另外此处也可以不显示构造出后缀树。
使用并查集 https://uoj.ac/submission/482165
或者单调栈也可以。

☑️ ☆

The 2024 ICPC World Finals Astana

恭喜 PKU 连冠!太强了 Orz。。

Problem B. Bingo for the Win!

签到题。只需要枚举最后一张牌,然后看编号最大的有这张牌的选手即可。
(据说 o1 也会这个题 Orz。)

Problem C. Citizenship

签到题。要处理时间戳,代码肯定比上一题长。

Problem F. Friendly Rivalry

二分答案,然后 dfs 求出所有连通块,然后类似拔河那个题,看这些连通块能否凑成容量为 n 的背包。
最后单独构造一下方案即可。

Problem D. Doubles Horseback Wrestling

给定 n 组区间,问可以最多凑出多少对区间,使得可以从这对区间中各取一个数和为给定的 s。

挺有趣的题,首先一般的匹配算法肯定不行了,考虑扫描线贪心。最后每组区间中一定有一个数取 <= s/2,不妨我们从中间分成左右两侧。
假设所有左侧的区间都是单点,那么贪心策略显然,就对所有右区间进行扫描线,从大到小扫描,然后每次拿潜力最小,也就是左端点最大的区间即可。
考虑一般情况,那么需要在左右两侧同时向中间扫描,贪心策略不变。注意到现在有些区间可能会在两侧的事件中同时存在,因此需要开一个全局 used[] 数组记录一下,然后每次贪心要 while 循环,找到第一个没用过的区间进行匹配。
最后再把剩下来的元素两两匹配即可。

Problem J. The Silk Road . . . with Robots!

给定一个数轴,然后依次安排一些事件,表示某个位置刷新一个机器人,或者某个位置刷新一个收益为 c 的资源点,机器人可以花费 1 代价移动单位距离,问最大收益是多少。

这个题极易读错。。注意到每个机器人居然可以 reuse,那么地图上的资源点实际被这些机器人覆盖,每个机器人覆盖一个区间,机器人可以仅左、仅右,或者先左再右、先右再左四种方式构成区间。那么显然这个东西可以用线段树维护区间来动态 dp,转移类似矩阵乘法,难点是构造单点的状态,建议拆成区间和单点,2n-1 个状态来处理,可以写的非常对称。

Problem I. Steppe on It

这个题我也读错了,读成 k 个点然后距离和最小了,囧。
那么只要最大最小显然还是二分答案树 dp。

据说是 COCI 原题,https://www.luogu.com.cn/problem/P8314,囧,还是非常容易写错的。。。

Problem A. Billboards

无聊的几何题,每个赞助商有一个分段线性函数设置偏好,且只需要在它的评价下取一段函数值大于 1/n 的区间即可。
我们只需要贪心的每次在左边找最短的一块符合某个赞助商要求的区间即可。

Problem H. Maxwell’s Demon

封闭空间分成左右两半,初始有一些粒子,在边缘会完全弹性碰撞,中间的墙的某个位置有一个 door,到粒子运动到门时,你可以决定是否让它通过,当同一时刻有多个粒子经过门时,你必须同时决定它们是否能够通过。每个例子初始是红色或者蓝色,问是否能让所有红色粒子在左边,所有蓝色粒子在右边,如果可以,最短时间是多少。

发现难点主要是粒子同时撞到门的情况,假设不考虑这种情况,那么只要算出每个点最早撞到门的时刻即可。
现在考虑这些连携的情况,我们发现这些例子现在的状态纠缠在了一起,我们虽然没法在当前时刻立刻决定是否通过门,但是好消息是否通过对我们的计算影响不大,因为门的两侧的运动轨迹是完全对称的,粒子通过门与否不会影响这些例子下次经过门的时刻。

我们用 01 向量表达每个粒子初始是否需要经过一次门,那么问题就变成了,随着时间的推进,我们不断加入一些 01 向量,问何时当前向量组能够线性表示出初始向量,而这只需要维护一组 xor 向量基即可。

🔲 ☆

AtCoder Beginner Contest 371

Problem E. I Hate Sigma Problems

询问区间不同元素数目有各种经典离线和函数式线段树做法,但是这个题要统计整体,直接上数据结构复杂度反而不太对。
我们可以单独统计每种元素对答案的贡献,而这个只要计算其补集即可,复杂度 O(n)。
https://atcoder.jp/contests/abc371/submissions/57884316

Problem G. Lexicographically Smallest Permutation

原题等价于求字典序最小的 AP^x,由于 P 是个排列,显然可以只考察它的循环分解。我们从左到右贪心的确定 AP^x 的每一位以及打包得到其所在的循环所有位置的结果,按顺序考察每一组这样的循环。我们总能得到一组形如 x = r (mod c) 的限制,这里的 c 是循环的长度,我们要在贪心结果尽可能小的同时,不破坏之前得到的所有限制条件。

我们可以合并这些条件,计算所有这些 c 形成的 lcm,但是这样这个 lcm 可能会特别大。注意到我们并不需要计算具体的 x,并且对于所有互素的 c,显然这些限制是不互相影响的,这提醒我们只需要考察和更新所有 c 的因子所形成的限制条件,进一步我们只需要维护所有素数幂的限制即可。
https://atcoder.jp/contests/abc371/submissions/57872303

☑️ ☆

AtCoder Beginner Contest 369

Problem E. Sightseeing Tour

什么 K 只有 5?那么 floyd 预处理,暴力搜索即可。
https://atcoder.jp/contests/abc369/submissions/57867165

Problem F. Gather Coins

等价于 O(nlogn) LIS,注意记录决策,用递归构造方案。
https://atcoder.jp/contests/abc369/submissions/57490934

Problem G. As far as possible

经典题,上次见到还是 2021 年 Meta Hacker Cup 的 Final Round!存在一个非常简单且好写的贪心,就是树 dp 的时候返回子树最长链,其它链全部加到全局的数组里最后丢出去排序即可。
但如果不知道这个贪心这个题会巨复杂囧。
https://atcoder.jp/contests/abc369/submissions/57491760

☑️ ⭐

RPGMaker 2k3 百科

(Seriously, use any RPG Maker made after XP or some other engine entirely instead of trying to be clever and hack around with 2k3.)
—— https://github.com/elizagamedev/oneshot-legacy/

之前写过不少推荐 RPGMaker 2k3 的文章,前段时间看 EasyRPG Repo 还发现了一个有趣的 issue,不过可见很多旧的代码连编译都不行了,但是我依然相信这种随心所欲,控制一切的感觉!

当务之急自然是给旧代码做整理,最好能赶在 2k3 的文化遗产消失之前 …

为什么选

实战

  • galgame
  • 猜拳
  • 四合一小游戏
  • 随机地图
  • roguelike
  • card game
  • 世界地图
☑️ ⭐

OneShot 的考古

最近看 ynoproject 上右下角居然多了一个 oneshot,我心想这个也不算是传统的梦日记派生吧,于是就去研究了一下。
和 ib、madofaza 等作品一样,这款作品也出过重置版,并且时间更早,神奇的是,和前面的作品不同,oneshot 的重置居然是基于 rmxp?那样不是相当于只领先了一个版本。
自己学习下发现居然是 基于 mkxp 的魔改

反而是 2k3 的原版,因为 https://rpgmaker.net/ 挂掉后,没那么容易找到资源了,还好 discord 也有遇到同样问题的朋友。
https://www.mediafire.com/download/6ocmn9l8iq8b9xd/Oneshot_v1.03_en.zip

☑️ ⭐

2024“开创拓芯”游戏创享节的相关记录

前言

上周末比较有价值的活动是北京的 智谱 AI Demo Day,台北的 Coscup 以及后续的 ABS。。。但是智谱的活动依然是在它们的 office 里,名额太少,台北的活动又比较远,需要做更仔细的规划。。还好这个时候看到 Tony 老师和卡姐都转发了开拓芯的活动,地点就在 Google Shanghai 旁边的正大广场顶楼。。。(什么原来这个建筑里面还有这么大一个空间)。

看了一下嘉宾。。什么。。不仅有 P 社,还有开发了《脑叶公司》的月计!!。。这一定要去了。。。虽然已经早就过了报名阶段。。。但 Tony 老师还是很给力的帮我搞到了邀请函!!。。。

正篇

书接上文。。。之前提到 CJ 回来之后,我出现了较为严重的戒断反应。。。因为这次有鹰角的孵化器赞助。。。
所以就出了图图姐。。。

根据前回 CJ 的经验。。造成游场体力下降最大的两个因素主要是假毛和鞋子。。要不是有个展位提前跑路留下了很多椅子估计人就直接 G 了。。。显而易见的是作为一名黑长直。。出图图姐的好处是首先我可以不用带假毛。。。鞋子也打算用平常的鞋子替代。。(其实那个鞋子是琴春的遗产。。)

果然这个组合体力就可以维持体力槽一直在线。。。

❌