Codeforces Round #553 (Div. 2)

怎么这个 \(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\n", (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)\) 扫一遍即可

posted @ 2019-04-19 16:15  harryhqg  阅读(202)  评论(0编辑  收藏  举报