逐渐智障
B.so easy
并查集,可能会卡掉map,建议使用unordered_map。
1 |
|
C.Buy Watermelon
签到,大于2的偶数都可以被拆分成两个偶数和。
1 | #include<bits/stdc++.h> |
D. Carneginon
KMP,懒得写了(狗头)。。
E. XKC’s basketball team
对于每个i查找最右的大于等于ai+m的位置。线段树维护区间最大值优先查右子树即可。
1 |
|
I. query
对于[1,n],枚举它们所有的倍数,总对数也就大概只有O(n⋅log(n)),因此转化为一个正方形,每次查询[l,l]到[r,r]之间点的个数即可。接下来直接离线然后用树状数组维护前缀和即可。
1 |
|
J. Random Access Iterator
首先预处理出每个点所能到达的最大深度和子节点的数量,令dp[x]表示能到达叶子节点的概率,当从u向v转移时,只有v能到达的的最大深度等于树的深度时才能转移。对于叶子节点:dp[x]=1,向上转移即可。
dp[u]=1−(1−∑dp[v]|siz[u]|)|siz[u]|1 |
|
M. Longest subsequence
在S中找到最长的子序列使其字典序大于T,输出长度即可。
假设子序列为T′,如果T′>T,则T′一定存在某个位置p使得T′[1…p−1]=T[1…p],而T′[p]>T[p],枚举p,利用序列自动机计枚举T′[p]并快速求的位置,计算答案即可。
1 |
|