退役后的日子

2022.9.24

CF1479D Odd Mineral Resource
假如不需要知道路径上哪些数只出现奇数次,那么这道题及类似于共价大爷游长沙
现在考虑如何找出路径上出现奇数次,范围在 $ [l, r] $ 之间的任意数。考虑用欧拉序的方式来维护路径,具体用主席树维护某一个值的出现次数。
My Submission

CF1515I Phoenix and Diamonds
读错题意若干次QAQ
如果用线段树暴力维护,每次选择连续一段尽可能取走,很容易被卡复杂度,实测Time Limit Exceeded on Test 71。
由于 $ c $ 一开始非常大,$ w_i $ 则较小,前面可以尽可能取,直到剩下的 $ c $ 小于 $ 10^5 $ 。
考虑对于每个 $ c $ ,大于 $ \lfloor c \rfloor $ 最多取一次,剩下的要在小于 $ \lfloor c \rfloor $ 中取。由于取的顺序是一定的,所以可以通过线段树维护能取到 $ \lfloor c \rfloor $ 的哪一个钻石,对于小于 $ \lfloor c \rfloor $ 的可以用另一个线段树维护。
考虑对于不同的 $ c \(,\) \lfloor c \rfloor $ 会不同,难以预处理。直接按二进制按位预处理即可。
My Submission

昨天CF有点摆。。。周末还有icpc网络赛。。。
晚上打了把ABC,状态极度不佳,明天靠队友。。。

2022.9.25

dbq QAQ,我是罚时机器。。。
今天状态很不对,很多莫名其妙的错误同一天犯(数组开小、忘记取min,题意看错),好在队友发挥了作用,最后八题垫底(我的锅)(但我还是写了七道)

2022.9.28

技能CD了一下,稍微暖一下手感~
Check,Check,Check one two!
用后缀自动机维护parent树,任意两个endpos的lca的len是它们的最长公共前缀。
对于点对 $ (i, j) $ , $ s[i - a + 1, i + b - 1] = s[j - a + 1, j + b - 1] $ ,则贡献为 $ a \times b $ 。我们现在很容易地维护了前缀,考虑后缀如何处理。由于每个点对 $ (i, j) $ ,它们会在 $ (i + 1, j + 1) $ 至 $ (i + b - 1, j + b - 1) $ 都计算一边,故每次加上贡献 $ a $ 即可。
考虑 $ k1, k2 $ 的限制。对 $ (i, j) $ 已知的前缀进行约束,即直接统计点对在该前缀子串上都合法的情况。此外,对于 $ s[m, m + k1] $ (举个栗子),之前在 $ m $ 处的贡献应减去,且减去后不会对此再有影响。
My Submission
PS: LJ不在QQ群里供题了啊QAQ,日常口胡断粮了
最近要期中考,考虑先放一放ACM,先苟住学分绩。。。

2022.10.3

> Here <

2022.10.4

CF1734F Zeros and Ones
为什么我想不到QAQ
Solution from Zhihu

2022.10.5

CF1712F Triameter
My Submission

2022.10.8

AGC009D Uninity
题意实际上是求最大深度最小的点分树的深度。
考虑正常点分治下层数已经是 $ \mathcal{O}(\log n) $ 的,那么最优状态下一定小于正常点分治的深度,即深度状态可以状态压缩。
将节点按 $ 0, 1, 2, \dots, k $ 编号表示节点的Uninity值,其中叶子节点编号为 $ 0 $ 。
根据点分树的性质,任意两个编号相同的节点路径上一定存在编号比它们大的节点。
每个节点存状态数组 $ ned[u] $ ,表示 $ u $ 节点的子树内未完成成对匹配的编号,按位存储。对于 $ u $ ,假设有两个不同的子节点 $ v, w $ ,若 $ \exist x, 2^{x} \in ned[v] \and ned[w] $ ,则 $ u $ 节点编号要大于 $ x $ ,否则 $ u $ 子树下编号为 $ x $ 将无法完成匹配。同时,若 $ \exist x, 2^{x} \in ned[v] $ ,则 $ u $ 也不能选 $ x $ ,否则 $ u $ 会与 $ v $ 子树内的同编号点无法匹配。
$ u $ 的编号从小到大贪心取即可。通过位运算骚操作可以让复杂度变为 $ \mathcal{O}(n) $ 。
[My Submission])(https://atcoder.jp/contests/agc009/submissions/35453858)

2022.10.9

突然发现自己构造能力很差,再不补就是弱鸡水平了。
今天看到一个构造,要求构造一个 不存在长度大于等于3的等差子序列 的排列。方法大概是先将奇偶分开,奇数在前,偶数在后,这样不存在既有奇数又有偶数的等差子序列。再将奇数列和偶数列递归构造。这种方法同样适用于构造已知元素的数列,使它等差子序列个数尽可能少。
补了一下ICPC2022网络赛第一场的K题(可以在pintia上看)。可以发现最多不能击败 $ 2 \sqrt{\max{x_i}} $ ,因为可以先花 $ \sqrt{max{x_i}} $ 的时间叠buff,再花同样的时间将buff叠战力,然后无敌。同样,buff最多叠 $ \sqrt{max{x_i}} $ 层,因为多叠的一层的时间将它用来叠战力,到无敌时始终更优。然后dp,$ f[i][j][k] $ 表示干了第i个,没干掉j个,buff层数为k的最大战力。
这周戒题,准备期中考。

2022.10.18

AGC023F 01 on Tree
观察不难发现,父亲节点一定先于儿子节点取,对于每个儿子向父亲合并时,最优策略一定是儿子的序列进行归并(每个儿子的子序列保持不变)。这有了递归的基础。
此外,我们还可以发现,假如当前有0,则能取尽取;如果有1,则取尽可能少的1去获得足量的0。考虑对于一个01序列,假如取了前面的一串1,则后面紧跟着的一串0都要跟着取,也就是类似11...100...0这样的取法是绑定的,不会在归并时改变。考虑取法的优先级。设这样的序列\(a, b\) ,其中 \(a_0, a_1, b_0, b_1\) 分别表示各自0、1的个数,比较相对位置,若$ a_1 \times b_0 < b_1 \times a_0 $ ,则 $ a $ 在前更优。
此时已经可以直接dfs并用set维护11...100...0序列并暴力启发式合并了,不过这代码难度。。。
与其直接dfs,不如考虑一个序列如何直接接上父亲。如果这个序列是整棵树上最优的,那他可以直接接在父亲所在的序列后,然后合并成新的序列,虽然不满足11...100...0的形式,但是合并的贡献计算方式一致。用并查集和优先队列维护即可。
My Submission
(啊,这是凌晨写的)
PAM(回文自动机)

#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
using namespace std;
typedef long long ll;
const int N = 2100010;
int n, id[N];
char s[N]; int len[N], fail[N], tot, sz[N], ch[N][26], cur;

void init() {
	len[0] = 0, len[1] = -1, fail[0] = 1, fail[1] = 0, tot = 1, cur = 0;
}
int gfail(int x, int now) {
	for(; now - len[x] - 1 < 1 || s[now - len[x] - 1] != s[now]; x = fail[x]);
	return x;
}
void insert(int now, int c) {
	int pos = gfail(cur, now);
	if(!ch[pos][c]) {
		++tot;
		fail[tot] = ch[gfail(fail[pos], now)][c];
		ch[pos][c] = tot, len[tot] = len[pos] + 2, sz[tot] = sz[fail[tot]] + 1;
	}
	cur = ch[pos][c];
}
int main() {
	scanf("%s", s + 1), n = strlen(s + 1);
	init();
	int ans = 0;
	rep(i, 1, n) {
		s[i] = (s[i] - 97 + ans) % 26 + 97;
		insert(i, s[i] - 97), ans = sz[cur];
		printf("%d ", ans);
	}
	return 0;
}

2022.10.26

少年不知mt19937 rnd(time(0))贵,错把srand(time(0)) 当宝贝。

2022.11.6

被各种事情搞得焦头烂额,又要大一年度项目又要思政实践项目又要考试又要竞赛,感觉再搞下去离大学ICPC/CCPC退役都不远了。
今天下午是我的第一场ICPC,不奢求有多好的成绩吧,只希望能够尽可能好地发挥吧,最近状态极度不稳,水平在幼儿园和红名之间剧烈波动,构造题、思维题依旧是我的弱项。
铁了

2022.11.9

G. Shinyruo and KFC 值域根号分治
M. 810975 隔板法

2022.11.12

关于某个质数的剩余系的题原根是真的好用。原根可以把数的乘法变成原根上指数的加法,这样也可以快速计算二次剩余。对于每个质数都有原根。
C. Assign or Multiply利用原根把乘法变加法,用数组标记某个数是否出现过,每加入一个数,进行循环移位,找到循环移位后值不同的位置并修改,这个操作总共是不超过n次的,利用二分和树状数组维护的哈希来找到这些位置并修改。

2022.11.13

假如不能比较两个数的两两关系(拓扑图而非竞赛图)的话还是不要用sort了吧。。。
Ex - Constrained Sums
约束 $ L \leq a + b, a \in [0, M], b \in [0, M] $ 等价于 $ \forall x \in [0, M], x \leq a \or L - x + 1 \leq b $ 成立,证明显然。如果是 $ a + b \leq R $ 的用互补律即可 $ (a \or b = \overline{\overline{a} \and \overline{b}}) $ 。
然后2-sat,按照关系连边,详见代码My Submission

2022.11.14

不会treap了QAQ

2022.11.15

C++14有一些骚操作:
原本写

set<int>::iterator it = s.lower_bound(x);

现在可以写

auto it = s.lower_bound(x);

原本写排序的比较函数要写在外面,现在:

sort(pr + 1, pr + lp + 1, [&](pii x, pii y) { return x.snd < y.snd; });

原本要在一个函数外定义一个函数,现在可以在函数内定义函数:

function<bool(pii, pii)> cmp = [&](pii x, pii y) { return x < y; };

D. Permutation for Burenka
这道题标算用的是set维护,按值域从左往右找第一个无法完成匹配的区间,再反着做一遍。
我一开始的做法是对于删除其中一个区间后,每个区间的右端点,它的左边一定可以找到匹配,左端点同理。用值域动态开点线段树维护,wa了,应该是算法假了,但是不会证伪(浇浇我)。
My Code wa on Test 3

2022.11.16

vp了一遍abc,发现以前的题真简单。
不过最后一题挺有意思。F - XOR Matching
做法大致是M为0,1是特判,否则 $ 0 xor 1 xor ... xor 2^{M}-1 = 0 $ 。意味着取出一些数,集合为 $ S $ ,使 $ XOR_{u \in S} u = K $ ,那么剩下的数的异或也为K,直接用两个交叉的区间构造即可。
My Submission
还是太菜了,其实只要取一个数就行了。

2022.11.18

高维前缀和就是每一维依次进行前缀和,这样得到的是所有维的前缀和。

2022.11.20

开题不稳,后劲不足。

2022.11.26

\[\large{x \bigoplus y \le x + y} \]

2022.12.02

CF1707C DFS Trees
树上差分经典题。差分可以是向上和向下。
My Submission

2022.12.05

C. Iahub and Permutations
要填的数分为两类:一类没有约束,一类有约束。先填有约束的位置,填完后没约束的位置随便填。填完后有约束位置的个数和没约束的位置的个数会发生改变,DP即可。

2022.12.11

CF1054D Changing Array
变换前后每个下标的前缀异或和只有两种情况,贪心即可。

2022.12.12

并查集求LCA:

int father[N], lca[N][N]; bool vis[N];
int find(int x) { return x == father[x] ? x : father[x] = find(father[x]); }
void dfs(int u, int ff) {
	vis[u] = 1; for(auto v : e[u]) if(v != ff) dfs(v, u), father[v] = u;
	for(int i = 1; i <= n; i++) if(vis[i]) lca[u][i] = lca[i][u] = find(i);
}

2022.12.14

CF258D Little Elephant and Broken Sorting
$ f[i][j] $ 表示数列中第i个大于第j个的概率。

2022.12.16

CF1762D GCD Queries
很好的交互题。
考虑对于三个位置$ i, j, k $,询问 $ i, j $ 和 $ j, k $ 得到 $ x, y $ ,通过 $ x, y $ 的三个大小关系可以将 $ i, j, k $ 中的一个排除,$ n - 2 $ 次操作后剩下两个。
还有一种做法是对于其中一个位置向其他位置都询问一遍,得到的结果最大是这个位置上的数(假如是0要单独考虑)。但这个位置上是1的话就搞不定了。

2022.12.18

WQS二分,大概就是n个物品强制选m个的最优化问题,假如选强制k个的最优答案为$ a_k \(,那么数列\) a_k \(具有凸的性质。二分差分结果d,可以找到斜率为d且与\)a_k\(的折线图像相切的位置,再通过这个位置与m比较,即可得到\)a_m - a_{m-1}\(,那么再做一次就可以知道强制选m的答案。(就是二分答案\) a_m - a_{m+1} $)。
模拟费用流,用堆维护反悔或增广,对于每个从原点连出去的边,考虑堆顶是反悔还是增广,进行网络流和增加反悔操作。
为什么总是错失绝杀QAQ

2022.12.19

CF1033F Boolean Computer
两个二进制数按位相加(不进位),每一位是0/1/2中的一个。对于每种操作,将合法的情况下的数位和比较一下有惊喜(例,异或合法的充要条件是和为1,或合法的充要条件是和为0)。

2022.12.21

CF1033G Chip Game
博弈论
CF1774F. Magician and Pigs
在有操作2的情况下有效的3操作数最多只有log级别。在没有操作2的情况下操作3用2的幂计数。操作3可以简化为做一个背包问题,有巧妙的性质(背包的一个元素至少是另一个比它小的元素的两倍),每次从大到小枚举,如果一个能取那么在不取这个的情况下剩下的可以任意取。

2022.12.28

C. Goodbye Souvenir
把每个点的权值拆成 $ i - pre[i] $ ,只要 $ pre[i] $ 在询问的区间这个点的权值就可以加入答案。cdq分治。

2023.1.1

H. Equal LCM Subsets
先全部取了,再将不能取的一个个去掉。不能取当且仅当它存在一个质因子的指数比另一个数组里这个质因子指数的最大值要大。设当前要去掉的数是 $ x $ ,另一个数组有 $ a[1 \dots n] $ ,令 $ b[i] = \frac{x}{\gcd (x, a[i])} $ ,表示 $ a[i] $ 较 $ x $ 差一个 $ b[i] $ ($ b[i] $ 是最小满足 $ a[i] * b[i] = x $ 的数),当 $ \gcd_{1 \leq i \leq n}(b[i]) > 1 $ 时 $ x $ 应被去掉。

2023.1.8

M. Tower of the Sorcerer
对于一些特殊的单点修改(修改的点的下标具有单调性)和区间询问的dp可以用rmq优化。

posted @ 2022-11-13 18:05  daniel14311531  阅读(85)  评论(0编辑  收藏  举报