Codeforces Round #388(div 2)

A

=w=

B

QvQ

C

题意:给定一个长度为n的D/R序列,代表每个人的派别,然后进行发表意见,顺序是从1到n。每个人到他的回合可以踢掉一个人。被踢掉的人不能参与发表直接跳过他的回合。如此知道剩下一个人。输出那个人所在的派别。

分析:贪心

  对于一个人来说,踢掉的人当然是敌方阵营即将发话的人,因为这样可以减少对方一次发话权,于是可以用两个队列表示D和R发话人的顺序

  两个队列队头比较,位置大的那个队头pop,位置小的那个队头拿出来放到队尾(循环唱票),注意放到队尾时候要将位置+n

  哪一个队列先空则哪个队输

D

题意:有许多人参加拍卖,问当假定某些人不参加的时候剩余的人当中谁是最终的赢家,输出他的编号和最终竞价,注:每个人都不能和自己竞价,即若某人连续竞价两次,以第一次价格为准。输入数据保证竞价递增

分析:set模拟

  将每个人的竞价序列存入各自的vector中

  将每个人的id和最高出价放入set中排序

  对于每个询问,先将那些人从set中删除,那么set中留下的最大的那个元素对应的id就是赢家了

  若此时set中只有一个元素,那么竞价就是赢家的最低出价

  若有多个元素,那么是赢家的某个出价(此出价刚好大于set中第二大元素的最高出价),这里只需要取出第二大元素的money在赢家的vector里二分就行了

  每次询问完记得将删除的元素再加入set中

E

题意:给出一个n的排列(n<=1e5),从n*(n+1)/2个区间中任意取一个区间,将其中元素随机打乱,问整个序列的逆序对的期望

分析:数学分析+BIT

  对于一个长度为len的区间,若数字互不相同,那么打乱顺序后逆序对期望是len(len-1)/4

  因为一共有n!种可能,考虑一种乱序,那么将其反过来写的对应的那种乱序,两者逆序对和是互补的,和是len(len-1)/2

  所以总的期望就是[len(len-1)/2*n!/2]/n!==len(len-1)/4

  对于某个区间,它内部的逆序对期望我们已经搞定了,那么接下来的问题就是外部的逆序对个数了

  容易发现其实顺序的打乱对于外部没有影响

  设sum表示初始序列的逆序对的总数,sum[i][j]表示区间[i,j]

  那么E(i,j)=len(len-1)/4+sum-sum[i][j]

  所以ans=ΣE(i,j)/[n(n+1)/2]

  len(len-1)/4那个式子有求和公式,sum可以用BIT求,问题关键就是如何求Σsum[i][j]

  直接跑是n^2的

  考虑f[i]表示以i为左区间的所有区间逆序对的个数

  这个类似求逆序对的,考虑新加的a[i]对逆序对数的贡献,用权值下标BIT来,每个位置上的权值不再是1,而是该权值对应位置到序列末尾的距离

  从右往左扫一遍,计算出每个f[i]相加,就是Σsum[i][j]

 

posted @ 2017-01-09 16:52  Chellyutaha  阅读(199)  评论(0编辑  收藏  举报