题目背景

Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏。现在,他在世界知名游戏公司KONMAI 内工作,离他的梦想也越来越近了。

这款音乐游戏内一般都包含了许多歌曲,歌曲越多,玩家越不易玩腻。同时,为了使玩家在游戏上氪更多的金钱花更多的时间,游戏一开始一般都不会将所有曲目公开,有些曲目你需要通关某首特定歌曲才会解锁,而且越晚解锁的曲目难度越高。

题目描述

\(这一天,Konano 接到了一个任务,他需要给正在制作中的游戏《IIIDX》安排曲目 的解锁顺序。游戏内共有n 首曲目,每首曲目都会有一个难度d,游戏内第i 首曲目会在玩家Pass 第\lfloor \frac{i}{k} 首曲目后解锁(\lfloor x 为下取整符号)若\lfloor \frac{i}{k} = 0,则说明这首曲目无需解锁\)

\(举个例子:当k = 2 时,第1 首曲目是无需解锁的(\lfloor \frac{1}{2} \rfloor = 0),第7 首曲目需要玩家Pass 第\lfloor \frac{7}{2} \rfloor = 3 首曲目才会被解锁。\)

\(Konano 的工作,便是安排这些曲目的顺序,使得每次解锁出的曲子的难度不低于作为条件需要玩家通关的曲子的难度,即使得确定顺序后的曲目的难度对于每个i 满足\)

\(d_i \geq d_{\lfloor \frac{i}{k} \rfloor}\)

\(当然这难不倒曾经在信息学竞赛摸鱼许久的Konano。那假如是你,你会怎么解决这份任务呢?\)

输入输出格式

输入格式:

从文件iiidx.in 中读入数据。

第1 行1 个正整数n 和1 个小数k,n 表示曲目数量,k 其含义如题所示。

第2 行n 个用空格隔开的正整数d,表示这n 首曲目的难度。

输出格式:

输出到文件iiidx.out 中。

输出1 行n 个整数,按顺序输出安排完曲目顺序后第i 首曲目的难度。

若有多解,则输出d1 最大的;若仍有多解,则输出d2最大的,以此类推。

输入输出样例

输入样例#1: 复制

4 2.0

114 514 1919 810

输出样例#1: 复制

114 810 514 1919

说明

题解

如果第三题暴力不能水过去的话,这道题应该算还好吧。

但是现在看来这道题才是day1最难的一题吧。(巨佬请无视

所以这道题大概我是只能口胡的。

对于55分很显然我们直接dfs到叶子节点然后从大到小一一赋值。

对于满分我们要处理值相同的情况。

就需要我们预处理一个\(f[]\)数组来满足当前位置前面还有多少可以选。

通过线段树维护\(f[]\)数组来保证预留位置使前面的子节点可以选。

最主要的是我们要对于一个相同的值,减去相同值末尾的以后的\(f[]\),而不是从这个值开始往后减,这样就能避免重复带来的影响了。

至于道理我是不懂的。我只知道实现,反正在我看来这是一道贪心神仙题。

Code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. const int N=1e6+5;
  8. int sum[N<<2],lazy[N<<2];
  9. int a[N],n,ans[N],size[N],fa[N],nxt[N];
  10. double k;
  11. int read(){
  12. int x=0,w=1;char ch=getchar();
  13. while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
  14. while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
  15. return x*w;
  16. }
  17. void build(int root,int left,int right){
  18. int mid=(left+right)>>1;
  19. if(left==right){
  20. sum[root]=left;return ;
  21. }build(root<<1,left,mid);build(root<<1|1,mid+1,right);
  22. sum[root]=min(sum[root<<1],sum[root<<1|1]);
  23. }
  24. void push(int root,int left,int right){
  25. sum[root<<1]+=lazy[root];sum[root<<1|1]+=lazy[root];
  26. lazy[root<<1]+=lazy[root];lazy[root<<1|1]+=lazy[root];
  27. lazy[root]=0;
  28. }
  29. void update(int root,int left,int right,int l,int r,int v){
  30. if(left>r||right<l)return ;
  31. if(lazy[root])push(root,left,right);
  32. if(left>=l&&right<=r){
  33. sum[root]+=v;lazy[root]+=v;
  34. return ;
  35. }int mid=(left+right)>>1;
  36. if(mid>=l) update(root<<1,left,mid,l,r,v);
  37. if(mid<r) update(root<<1|1,mid+1,right,l,r,v);
  38. sum[root]=min(sum[root<<1],sum[root<<1|1]);
  39. }
  40. int query(int root,int left,int right,int k){
  41. if(left==right){
  42. return sum[root]>=k?left:left+1;
  43. }int mid=(left+right)>>1;
  44. if(lazy[root])push(root,left,right);
  45. if(sum[root<<1|1]>=k) return query(root<<1,left,mid,k);
  46. else return query(root<<1|1,mid+1,right,k);
  47. }
  48. bool cmp(int a,int b){return a>b;}
  49. int main(){
  50. n=read();cin>>k;
  51. for(int i=1;i<=n;i++)a[i]=read();sort(a+1,a+n+1,cmp);
  52. for(int i=n;i>=1;i--){
  53. nxt[i]=i;fa[i]=(1.0*i/k);
  54. size[i]++;size[fa[i]]+=size[i];
  55. if(a[i]==a[i+1])nxt[i]=nxt[i+1];
  56. }build(1,1,n);
  57. for(int i=1;i<=n;i++){
  58. if(fa[i]&&fa[i]!=fa[i-1])update(1,1,n,ans[fa[i]],n,size[fa[i]]-1);
  59. int tmp=nxt[query(1,1,n,size[i])];ans[i]=tmp;
  60. update(1,1,n,tmp,n,-size[i]);
  61. }
  62. for(int i=1;i<=n;i++)cout<<a[ans[i]]<<' ';
  63. return 0;
  64. }

[luogu]P4364 [九省联考2018]IIIDX的更多相关文章

  1. [luogu] P4364 [九省联考2018]IIIDX(贪心)

    P4364 [九省联考2018]IIIDX 题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI ...

  2. 洛谷P4364 [九省联考2018]IIIDX 【线段树】

    题目 [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在 ,他在世界知名游戏公司KONMAI内工作,离他的梦想也越来越近了.这款 ...

  3. p4364 [九省联考2018]IIIDX

    传送门 分析 我们先考虑如果所有数都不相同我们应该怎么办 我们可以直接贪心的在每个点放可行的最大权值 但是题目要求可以有相同的数 我们可以考虑每次让当前节点可发且尽量大的同时给兄弟节点留的数尽量大 我 ...

  4. 洛谷P4364 [九省联考2018]IIIDX(线段树)

    传送门 题解看得……很……迷? 因为取完一个数后,它的子树中只能取权值小于等于它的数.我们先把权值从大到小排序,然后记$a_i$为他左边(包括自己)所有取完他还能取的数的个数.那么当取完一个点$x$的 ...

  5. 洛谷 4364 [九省联考2018]IIIDX——“预留”的思路

    题目:https://www.luogu.org/problemnew/show/P4364 原来想了一个错误的思路,就是这样: solve( cr , l , r ) 表示 cr 为根的子树填 [ ...

  6. BZOJ5249:[九省联考2018]IIIDX——题解

    https://www.luogu.org/problemnew/show/P4364#sub https://www.lydsy.com/JudgeOnline/problem.php?id=524 ...

  7. [BZOJ5249][九省联考2018]IIIDX(线段树)

    5249: [2018多省省队联测]IIIDX Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 32  Solved: 17[Submit][Statu ...

  8. [九省联考2018]IIIDX

    题目描述 这一天,Konano接到了一个任务,他需要给正在制作中的游戏<IIIDX>安排曲目的解锁顺序.游戏内共有n首曲目 ,每首曲目都会有一个难度d,游戏内第i首曲目会在玩家Pass第t ...

  9. luogu P4365 [九省联考2018]秘密袭击coat

    luogu 这里不妨考虑每个点的贡献,即求出每个点在多少个联通块中为第\(k\)大的(这里权值相同的可以按任意顺序排大小),然后答案为所有点权值\(*\)上面求的东西之和 把比这个点大的点看成\(1\ ...

随机推荐

  1. [LUOGU]P3701 主席树(假的)

    有人恶意刷难度...就一个最大流模板... 但是题面吼啊2333 #include <iostream> #include <cstdio> #include <queu ...

  2. [读书笔记] Python数据分析 (一) 准备工作

    1. python中数据结构:矩阵,数组,数据框,通过关键列相互联系的多个表(SQL主键,外键),时间序列 2. python 解释型语言,程序员时间和CPU时间衡量,高频交易系统 3. 全局解释器锁 ...

  3. RabbitMQ学习总结(2)——安装、配置与监控

    一.安装 1.安装Erlang 1)系统编译环境(这里采用linux/unix 环境) ① 安装环境 虚拟机:VMware® Workstation 10.0.1 build Linux系统:Cent ...

  4. HDU 4301 Contest 1

    开始时设的是第一.二行前i,j列有k种的方法数,但是,这根本转移不了--! 难点在于1,2行的讨论啊... 设f[i][j][0]为前i列分成j个部分,且第i列的两个为同一部分的方法数. f[i][j ...

  5. glove入门实战

    前两天怒刷微博,突然发现了刘知远老师分享的微博,顿时眼前一惊.原Po例如以下: http://weibo.com/1464484735/BhbLD70wa 因为我眼下的研究方向是word2vec.暗自 ...

  6. javaWeb web.xml 配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

  7. 微软版UnityVs横空出世,究竟是谁成就了谁?

    在移动互联网浪潮持续发力下,手游行业也异常火热.在现在的手游行业,Unity3d无疑是最耀眼的哪颗星.一直觉得Unity面向设计师是友好的,对程序猿这边并非非常友好. 2012年用Unity时开发工具 ...

  8. poj_3468线段树成段更新求区间和

    #include<iostream> #include<string.h> #include<cstdio> long long num[100010]; usin ...

  9. JAVA设计模式之【职责链模式】

    职责链模式 专门处理请求链式传递的模式 角色 Handler抽象处理者 ConcreteHandler具体处理者 在职责链模式中,很多对象由每一个对象对其下家的引用而连接成一条链,请求在这条链上传递, ...

  10. nyoj--18--The Triangle(dp水题)

    The Triangle 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure ...