zoukankan      html  css  js  c++  java
  • [BZOJ5249][九省联考2018]IIIDX(线段树)

    5249: [2018多省省队联测]IIIDX

    Time Limit: 40 Sec  Memory Limit: 512 MB
    Submit: 32  Solved: 17
    [Submit][Status][Discuss]

    Description

    【题目背景】
    Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏。现在
    ,他在世界知名游戏公司KONMAI内工作,离他的梦想也越来越近了。这款音乐游戏内一般都包含了许多歌曲,歌曲
    越多,玩家越不易玩腻。同时,为了使玩家在游戏上氪更多的金钱花更多的时间,游戏一开始一般都不会将所有曲
    目公开,有些曲目你需要通关某首特定歌曲才会解锁,而且越晚解锁的曲目难度越高。
    【题目描述】
    这一天,Konano接到了一个任务,他需要给正在制作中的游戏《IIIDX》安排曲目的解锁顺序。游戏内共有n首曲目
    ,每首曲目都会有一个难度d,游戏内第i首曲目会在玩家Pass第trunc(i/k)首曲目后解锁(x为下取整符号)若tru
    nc(i/k)=0,则说明这首曲目无需解锁。举个例子:当k=2时,第1首曲目是无需解锁的(trunc(1/2)=0),第7首曲
    目需要玩家Pass第trunc(7/2)=3首曲目才会被解锁。Konano的工作,便是安排这些曲目的顺序,使得每次解锁出的
    曲子的难度不低于作为条件需要玩家通关的曲子的难度,即使得确定顺序后的曲目的难度对于每个i满足Di≥Dtrun
    c(i/k)。当然这难不倒曾经在信息学竞赛摸鱼许久的Konano。那假如是你,你会怎么解决这份任务呢

    Input

    第1行1个正整数n和1个小数k,n表示曲目数量,k其含义如题所示。
    第2行n个用空格隔开的正整数d,表示这n首曲目的难度。
    1 ≤ n ≤ 500000
    1 < k ≤ 10^9
    1 < d ≤ 10^9

    Output

    输出1行n个整数,按顺序输出安排完曲目顺序后第i首曲目的难度。
    若有多解,则输出d1最大的;若仍有多解,则输出d2最大的,以此类推。

    Sample Input

    4 2.0
    114 514 1919 810

    Sample Output

    114 810 514 1919

    HINT

    Source

    [Submit][Status][Discuss]

    首先有一个显然的贪心,把树建出来然后后序遍历从大到小填数即可。

    但是这样在有重复数字的情况下是不行的,如:

     4 2

    1 1 1 2

    这样贪心答案是1 1 1 2,但正确答案是1 1 2 1。

    这就需要对每个数进行“预订”操作。考虑将数从小到大填进树里,显然当前可能填进的节点一定与已经填过的节点相邻,所以我们把这些节点子树都“预订”好,然后找到最靠后的,且不造成上面那个错误的节点填入,最终整棵树就填好了。

    具体实现很难讲清楚,还是看代码吧。

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #define N 500010
     5 #define lson l ,mid ,x << 1
     6 #define rson mid + 1 ,r ,x << 1 | 1
     7 #define rep(i,l,r) for (int i=l; i<=r; i++)
     8 using namespace std;
     9 int a[N] ,ans[N] ,head[N] ,to[N] ,nxt[N] ,cnt ,si[N] ,sum[N << 2];
    10 
    11 void add(int x ,int y){ to[++cnt] = y ,nxt[cnt] = head[x] ,head[x] = cnt ,si[x] += si[y]; }
    12 
    13 void update(int p ,int a ,int l ,int r ,int x){
    14     sum[x] += a;
    15     if(l == r) return;
    16     int mid = (l + r) >> 1;
    17     if(p <= mid) update(p ,a ,lson);
    18     else update(p ,a ,rson);
    19 }
    20 
    21 int find(int k ,int l ,int r ,int x){
    22     if(l == r) return l;
    23     int mid = (l + r) >> 1;
    24     if(sum[x << 1 | 1] < k) return find(k - sum[x << 1 | 1] ,lson);
    25     else return find(k ,rson);
    26 }
    27 
    28 int main(){
    29     int n ,i ,j ,t ,l ,last = 1;
    30     double k; scanf("%d%lf" ,&n ,&k);
    31     rep(i,1,n) scanf("%d" ,&a[i]) ,si[i] = 1;
    32     sort(a + 1 ,a + n + 1);
    33     for(i = n ; i ; i -- ) add((int)floor(i / k) ,i);
    34     for(i = head[0] ; i ; i = nxt[i]) update(to[i] ,si[to[i]] ,1 ,n ,1);
    35     for(i = 1 ; i <= n ; i = last){
    36         while(last <= n && a[i] == a[last]) last ++ ;
    37         for(j = last - i ; j ; j -- ){
    38             t = find(j ,1 ,n ,1) ,ans[t] = a[i] ,update(t ,-si[t] ,1 ,n ,1);
    39             for(l = head[t] ; l ; l = nxt[l]) update(to[l] ,si[to[l]] ,1 ,n ,1);
    40         }
    41     }
    42     rep(i,1,n) printf("%d " ,ans[i]);
    43     return 0;
    44 }
  • 相关阅读:
    初识HTML
    django中这是登录过期时间
    linux之几个重要性能指标
    linux之查看端口占用
    python目录操作整理
    jmeter用户自定义变量的实际使用
    ubuntu安装mysql与配置外网访问
    ubuntu 16.04部署python项目(Nginx+uwsgi+django)
    selenium脚本奇怪报错
    在Ubuntu云服务上部署jenkins
  • 原文地址:https://www.cnblogs.com/HocRiser/p/8742680.html
Copyright © 2011-2022 走看看