T1
有一个长为 n n n 的序列 { a i } \{a_i\} {ai},你可以操作若干次:选择一个 i i i,花费 c x c_x cx 元将 a i a_i ai 变为 ⌊ a i x ⌋ ⌊\frac{a_i}x⌋ ⌊xai⌋,你总共有 K K K 元。问最终序列的中位数最小是多少。保证 n n n 为奇数, 1 ≤ a i ≤ m , 1 ≤ n , m ≤ 5 × 1 0 5 , 1 ≤ c i , k ≤ 1 0 9 1≤a_i≤m,1\le n,m\le5\times10^5,1\le c_i,k\le10^9 1≤ai≤m,1≤n,m≤5×105,1≤ci,k≤109。
开始题面出问题了,就先去看T2。后面 T1 改好后又看回来。发现对每个 a i a_i ai 的操作本质上是除以一个数,就想怎么做代价最小,于是打了个 dp,求了后缀最小值。然后二分答案,就做完了。后面检查时发现当 a i a_i ai 除成 0 0 0 时不对,又对 dp 进行修改,手造了几组数据过了。
T2
给定 K K K,有 n n n 个点 m m m 条边,第 i i i 条边连接 u i , v i u_i, v_i ui,vi,有边权 c i c_i ci。有 q q q 次询问,每次给出一个 x x x,若 c i ⊕ x < K c_i⊕x<K ci⊕x<K,则这条边存在,否则不存在。其中 ⊕ ⊕ ⊕ 表示异或。对于每个询问,输出互相连通的点对个数。 n , m ≤ 1 0 5 , c i , x , K ≤ 1 0 9 n,m\le10^5,c_i,x,K\le10^9 n,m≤105,ci,x,K≤109
一开始以为 c i ⊕ x < K ⟺ c i < K ⊕ x c_i\oplus x<K\Longleftrightarrow c_i<K\oplus x ci⊕x<K⟺ci<K⊕x,就很兴奋,花5min打完发现样例不过,就假了。后面也没什么思路,就去打了50pts暴力。
正解是线段树分治,看不懂,去学习了trie 树的写法,可撤销并查集。
T3
你有一个键盘,上面共有n+ 1个按键,按下按键i≤n会打印出字符串Si,按下按键n+ 1会删掉结尾的K个字符,不足K个时全部删完,问打印出S最少要按几次。 n ≤ 5000 , ∣ S ∣ ≤ 5000 , ∑ ∣ S i ∣ ≤ 1 0 6 , K ≤ 2000 n\le5000,|S|\le5000,\sum |S_i|\le10^6,K\le2000 n≤5000,∣S∣≤5000,∑∣Si∣≤106,K≤2000
想打暴力,发现不会,就弃掉了。正解dp+trie+同余最短路。
T4
一棵树,每个点必须给它的一个祖先投一票,问对于每个点 i i i,是否存在一种投票方案,使得点 i i i 的票数严格大于其他点的票数。
多组数据, ∑ n ≤ 1 0 6 \sum n\le10^6 ∑n≤106
想了一会,分析了性质,投票肯定要尽可能投给深度最大的父亲,于是打了一个贪心,就暴力往上面跳,如果可以投票就投。然后链有5pts,想着麻烦就没去打。正解是二分最小票数 s s s,然后再判断 s z u − 1 = s sz_u-1=s szu−1=s。accoder这题卡常,服了。
总结
期望得分:100+50+0+20=170pts
实际得分:70+20+0+20=110pts
T1 挂分了,原因是 a i a_i ai 被除成 0 0 0 的情况没有完全考虑到;T2 的并查集混在一起写了,挂了 30pts。写代码时情况要讨论清楚,不能想当然。学习了可撤销并查集,异或操作可以往trie上面思考。