Codeforces TypeDB Forces 2023
https://codeforces.com/contest/1787
E. The Harmonization of XOR
问 [1,2,3,…,n] 能否拆成k个非空序列(不一定连续), 且每个序列内的数字xor为x
如果可以给具体方案
范围
n 2e5
x [1,1e9]
1s
256mb
我的思路
想了很久线性基, 没啥办法, 感觉都是O(n^2)以上
然后 显然 如果 k为奇数那么 x = xor[1..n], 如果k为偶数, 0 = xor[1…n]
然后n%4==3 的时候 xor[1..n] = 0
然后n%4==0 的时候 xor[1..n] = n
然后n%4==1 的时候 xor[1..n] = 1
然后n%4==2 的时候 xor[1..n] = n+1
其中 n%4==1 很好做, 相邻取偶数和偶数+1 就能构成
n%4==0和n%4==2没有什么办法, 但是这个如果暴力出来,是可以打表的
但是n%4==3 就连打表都不行
题解
显然 3个一样的能合并成一个, 那么其实需要考虑的是最多能拆成多少个
然后是贪心 尽量 [a, a^x] 成一组, 显然 不妨设 a < a^x, 那么 a0!=a1 则 a0^x != a1^x, 所以两两不等
问题是 有没有可能 不能构成的 部分 可以 >=2 个一组得到x?
令B是x最高位bit
B一定是要存在
M = 1~n 中B是1的个数
那么 组数一定<=M (因为至少需要一个提供)
val的B位有1, 那么 val^x < val, 所以M个有1的都能找到一个比它小而且没1的, 所以剩下的一定B位都没有1, xor=0
代码
https://codeforces.com/contest/1787/submission/191286044
1 |
|
F. Inverse Transformation
给一个排列, 经过一轮就会让 a[i] = a[a[i]]
现在给你a经过k轮后的 a’
又定义 f(i) = 一个排列中第i个位置跳转几次回到自己
求一个初始a 要 sum_{i=1..n} 1/f(i) 最小
范围
n 2e5
k [1,1e9]
1s
256mb
我的思路
排列经典就是构成环, 稍微画一下就会发现, 如果当前长度是偶数, 那么 经过一轮就会被拆成两个圈(奇偶交错)
如果当前是奇数,那么只是错位圈不会被拆
而要达到最小值的就是, 1/f(i) 也就是每个点所在的圈尽量大
不可行状态就是, 一个偶圈不能向上k次偶数操作
所以找相同长度的,尽量去2的幂次个的合并, 比如7个长度3的, 那么就合并出 1个4 * 3的, 1个2 * 3的,1 个 1 * 3的
然后虽然拆环,但是结果依然是 2^k % (环长)
还原的部分 写吐了
代码
https://codeforces.com/contest/1787/submission/191295693
1 |
|
G. Colorful Tree Again
n点,有边权wi的树, 每个边有颜色ci, 每个点可以是 block/unblocked, 初始都unblocked
path length = 简单路径边权和
good path 边同色 + 点全部unblocked, (且所有这个颜色的都在这个path上)
q个询问, 需要处理2种操作
block点
unblock点
每次操作后, 返回最大good path
如果没有good path ,返回0
范围
n 2e5
q 2e5
w,ci 2e5
2s
512mb
我的思路
读错题了
颜色不会变, 所以对于同色的联通块 单独考虑
每个边属于一个连通块, 每条边最多两个点, 所以最多2(n-1)个点
那么问题变成 在某个联通块的某个 点block/unblock 以后最长的变化
但这里有问题在于, 不同色的边可以共点, 于是上面的点操作就可能一次影响很多个联通块
先考虑说一个联通块里增加block/unblock 怎么办
如果 当前最长的和点无关, 那么block不影响, 否则需要重新计算? 重新计算就是 算分割后的几个块的直径
如果是树状dp
f[u] 表示子树到u 最长的距离
dp[u] = 子数u中最长的路径
dp[u] = max(dp[v0,v1,v2], f[vi]+f[vj]+1)
要求的的dp[root]
那么每次block 一个点
就是它的子树不影响
f[u] = 0
dp[u] = max(dp[v0,v1,v2])
然后向上所有它提供的 dp都要改,感觉会影响一条到root的链(但是注意到它在变小,所以如果没有影响最长可以提前break,但是对于造数据可以影响来说没有意义)
题解
好家伙, 读错题了, 题目里有一个所有颜色也在这个path上的
那么也就是 所有能成为good path的需要成一条线
而所有good path不会变长度,只会选中和不选
那么block一个点, 就是这个点上所有颜色 都变为不选计数+1
unblock 一个点, 就是 所有这个点上的颜色 不选的计数-1, 不选计数为0的才会选
总结
E
想过贪心, 但是一眼不知道怎么证明
感觉是xor相关的性质不熟悉,数学推理也拉跨, 我看noimi只用了9min 就做了E
F
赛内看题晚+编码慢,但是想出了解法, 本身从逻辑上没任何难度(比E需要数学证明一下 简单太多), 就是写着恶心, noimi妹妹写了1小时零5分钟, 虽然jiangly和tourist只花了不到20min
看来以后打Div1可能要是要先读一下后面的题, 过了F也不至于掉分