8月11日 Codeforces Round #503 题目链接:http://codeforces.com/contest/1020
A - New Building for SIS & B - Badge
过水,不说。。
C - Elections
思路: 算是一个比较简单的模拟(但是好像有大佬有$O(nlogn)$的做法)。。。枚举要得到多少选票,设为$x$,如果有其他党的选票大于x,就直接花钱买直到那个党选票小于x,如果这样最后选票不够x的话,就随便买选票直到有x张。这里买选票当然是尽可能买便宜的,然后总复杂度是$O(n^3)$的。
比赛时T了一发,然后大力卡了一下常数过了pretest。结果就很愉快地的因为TLE FST了….后面把最外层循环从1-n改为1-n/2+1就A了,想想自己真TM傻,卡常时这个都没有注意到。
代码:
1 |
|
D - The hat
思路: 交互题,比赛时少看到一个条件连题目都没有弄懂。菜死了QWQ
相邻的同学手上数字不会相差超过1,这是一个很神奇的条件。我们设数组$b[i]=a[i]-a[i+n/2]$,根据上面的条件可以发现$b[i]-b[i+1]$只能为$\lbrace -2, 0, 2 \rbrace$,在某种意义下我们可以把数组$b$的取值视为是连续的,这个性质也很有意思。
显然有$b[i]=-b[i+n/2]$,答案也就是求一点$i$使得$b[i]=0$。因为上面的性质,我们就可以使用二分求解。有一点要注意的是如果$b$中有一个元素为奇数时,那么$b$中的所有元素都是奇数,这样就直接输出-1。
代码:
1 |
|
E - Sergey’s problem
思路: 神题啊。。。首先有一个很简单的思路,假设一个确定了$1~i-1$号节点的集合,那么对于$i$号节点,如果集合中的点不与节点$i$相邻,那么就把$i$号节点加入集合中。
那么这样就会有一个问题,就是可能会有节点无法加入集合,并且集合中的点无法到达它(CF上第三个点就能够HACK掉)。于是我们先从小到大扫一遍确定出一个集合,集合内编号小的点不会向编号大的点连边。然后从大到小扫一遍这个集合,如果编号大的点有一条边连向了集合内编号小的点,那就把编号小的点移除集合。这样就可以保证满足题目的条件,因为第二遍移出集合的点一定能一步内到达,第一遍移出集合的点一定能两步内到达。
代码:
1 |
|