zoukankan      html  css  js  c++  java
  • 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]

  • 相关阅读:
    支持向量机通俗导论(理解SVM的三层境地)
    ComponentName的意思
    图像切割之(五)活动轮廓模型之Snake模型简单介绍
    TraceView总结
    Redis:百科
    Redis:目录
    Redis: temple
    软件-操作系统-服务器:Nginx(engine X)
    软件-数学软件:Maple
    软件-数学软件:Mathematica
  • 原文地址:https://www.cnblogs.com/wmrv587/p/6265818.html
Copyright © 2011-2022 走看看