怎么这个 (Div.2) 这么水啊,除了最后一题都是 (SB) 题
A
SB 题
B
先全部选择第一列,如果不行,随便找到一行一个不相等的位置即可
C
一眼就会
考虑分别记录奇偶枚举到多少,假如是 (a) 和 (b)
则奇数贡献即为 (a*2),偶数贡献 (b*(b+1))
倍增求出 (a) 和 (b)
没了
int l, r ;
int work(ll n) {
ll odd = 0, even = 0 ;
ll s = 0, i, j = 1 ;
for (i = 1; s < n; i *= 2) {
ll add = min(n - s, i) ;
s += add ;
if (j == 1) odd += add ;
else even += add ;
j ^= 1 ;
}
odd %= MOD ;
even %= MOD ;
ll ans = odd * odd + even * (even + 1) ;
return ans % MOD ;
}
signed main() {
scanf("%lld%lld", &l, &r) ;
printf("%lld
", (work(r) - work(l - 1) + MOD) % MOD) ;
}
D
你把那个式子展开
[a_i*(j-1)+b_i*(n-j)\
=a_i*j-a_i+b_i*n-b_i*j\
=j*(a_i-b_i)+b_i*n-a_i
]
直接按照 (a_i-b_i) 从大到小排序即可
E
稍微有点意思
开始以为是一棵树,后来发现就是链,那不就简单了
一看到这种求某一个函数值的和的问题就会想到算贡献
考虑两个位置对于答案的贡献
- (a_i > a_{i-1}),那么显然它对于 ([a_{i-1}, a_i]~...~[a_{i-1}, n]) 的区间都有了 (1) 的贡献
- (a_i < a_{i-1}),那么显然它对于 ([1, a_{i-1}]~...~[a_i, a_{i-1}]) 的区间都有了 (1) 的贡献
所以 (O(n)) 扫一遍即可