ABC353
抽象局。
AB一眼。
C
相当于求 \(\sum\sum (a_i+a_j)\bmod P\),等价于 \(\sum\sum (a_i+a_j)-\lfloor \frac{a_i+a_j}{P}\rfloor\times P\),由于 \(a_i,a_j<P\),得到 \(\sum\sum a_i+a_j-[a_i+a_j>=P]\times P\),把 \(a\) 排序后二分一下就行。
D
考虑每个 \(a_i\) 的贡献,为 \(a_i\times (i-1)+a_i\times \sum\limits_{i+1}^n 10^{s(j)}\),其中 \(s(j)\) 代表 \(a_j\) 的数位数。
E
观察到 \(\sum |S|\) 不大,考虑枚举每个字符串的前缀,计算这段前缀的贡献。
剩下就是哈希入门了。
被高爷爷安利了 trie。
考虑把每个字符串扔到 trie 上,统计一下即可。
F
很厉害的题。
一种显然的贪心就是尽量走大瓦片,于是如果 \((x,y)\) 是一个散点,我们就枚举该点走到上下左右的哪个瓦片上,然后暴力分类讨论。
现在重点是计算从一个大瓦片到另一个大瓦片的贡献。
对于 \(k\ne 2\),相邻两个瓦片可以花费 \(2\) 的代价。
对于 \(k=2\),如果要从一个瓦片走到 \(y\) 相同的另一个大瓦片,可以直接横穿,花费 \(3\) 的代价。
然后随便推一推式子就做完了。
G
很厉害的题。
考虑 dp,令 \(dp_i\) 代表现在停留第 \(i\) 个城镇能得到的最大收益,有转移:
显然可以把绝对值拆开分讨,然后上个线段树就做完了,但是我不太正常。
下面阐述一下抽象的赛时思路。
对于 \(t_i\),观察到 \(t_i-1\) 和 \(t_i+1\) 相较于 \(t_i\) 会 \(-c\),往后同理。
这是什么?等差数列啊!
于是直接扔棵线段树维护,本来应该用两棵,但是赛时只用了一棵,所以没调过。
现在问题就是,怎么维护呢?
回想一下我们的需求,单点修改,查询如果将某段区间加上等差数列后该段区间的最大值。
注意到公差 \(c\) 是确定的。
于是对于 \([l,r]\),我们在线段树上就维护 \(\max(v_l,v_{l+1}-c,v_{l+2}-2\times c,\cdots)\),这是好维护的。
然后查询时细节比较多,不太想写了。
两棵线段树维护一下就做完了。