CSP模拟50联测12

CSP模拟50联测12

T1

∑ i = 0 n − 1 p o p c o u n t ( i ⊕ ( i + 1 ) ) \sum\limits_{i=0}^{n-1}popcount(i\oplus(i+1)) i=0n1popcount(i(i+1))

分类讨论。

第一种情况, i i i为偶数则值为1,可以 O ( 1 ) \mathcal O(1) O(1)求出来。

第二种情况, i i i为奇数,容易发现答案为末尾值连续为 1 1 1的长度。考虑

枚举 1 1 1的个数,统计所有末尾为 0 0 0 i i i 1 1 1组成的二进制数并求和。因为 1 ≤ n ≤ 1 0 18 1\le n\le10^{18} 1n1018所以 1 1 1的个数不会超过 60 60 60,时间复杂度为 O ( log ⁡ 2 n ) \mathcal O(\log^2n) O(log2n)

T2、T3

暂时还不是很能理解,先挖个坑。

T4

先求出 d f s dfs dfs序,然后将修改分为 x > n x\gt\sqrt{n} x>n x ≤ n x\le\sqrt{n} xn 两种询问离线下来用分块维护。

总时间复杂度为 O ( q n ) \mathcal O(q\sqrt{n}) O(qn )

总结

今天 T 1 T1 T1耗时较长,导致后面该骗的分没有拿到手,平时应该提高代码实现能力。

你可能感兴趣的:(模拟赛,c++)