[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为下取整符号)若trunc(i/k)=0,则说明这首曲目无需解锁。举个例子:当k=2时,第1首曲目是无需解锁的(trunc(1/2)=0),第7首曲目需要玩家Pass第trunc(7/2)=3首曲目才会被解锁。Konano的工作,便是安排这些曲目的顺序,使得每次解锁出的曲子的难度不低于作为条件需要玩家通关的曲子的难度,即使得确定顺序后的曲目的难度对于每个i满足Di≥Dtrunc(i/k)。当然这难不倒曾经在信息学竞赛摸鱼许久的Konano。那假如是你,你会怎么解决这份任务呢Input
第1行1个正整数n和1个小数k,n表示曲目数量,k其含义如题所示。第2行n个用空格隔开的正整数d,表示这n首曲目的难度。1 ≤ n ≤ 5000001 < k ≤ 10^91 < d ≤ 10^9Output
输出1行n个整数,按顺序输出安排完曲目顺序后第i首曲目的难度。若有多解,则输出d1最大的;若仍有多解,则输出d2最大的,以此类推。Sample Input
4 2.0
114 514 1919 810Sample Output
114 810 514 1919HINT
Source
首先有一个显然的贪心,把树建出来然后后序遍历从大到小填数即可。
但是这样在有重复数字的情况下是不行的,如:
4 2
1 1 1 2
这样贪心答案是1 1 1 2,但正确答案是1 1 2 1。
这就需要对每个数进行“预订”操作。考虑将数从小到大填进树里,显然当前可能填进的节点一定与已经填过的节点相邻,所以我们把这些节点子树都“预订”好,然后找到最靠后的,且不造成上面那个错误的节点填入,最终整棵树就填好了。
具体实现很难讲清楚,还是看代码吧。
#include <cmath>
#include <cstdio>
#include <algorithm>
#define N 500010
#define lson l ,mid ,x << 1
#define rson mid + 1 ,r ,x << 1 | 1
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std;
int a[N] ,ans[N] ,head[N] ,to[N] ,nxt[N] ,cnt ,si[N] ,sum[N << ]; void add(int x ,int y){ to[++cnt] = y ,nxt[cnt] = head[x] ,head[x] = cnt ,si[x] += si[y]; } void update(int p ,int a ,int l ,int r ,int x){
sum[x] += a;
if(l == r) return;
int mid = (l + r) >> ;
if(p <= mid) update(p ,a ,lson);
else update(p ,a ,rson);
} int find(int k ,int l ,int r ,int x){
if(l == r) return l;
int mid = (l + r) >> ;
if(sum[x << | ] < k) return find(k - sum[x << | ] ,lson);
else return find(k ,rson);
} int main(){
int n ,i ,j ,t ,l ,last = ;
double k; scanf("%d%lf" ,&n ,&k);
rep(i,,n) scanf("%d" ,&a[i]) ,si[i] = ;
sort(a + ,a + n + );
for(i = n ; i ; i -- ) add((int)floor(i / k) ,i);
for(i = head[] ; i ; i = nxt[i]) update(to[i] ,si[to[i]] , ,n ,);
for(i = ; i <= n ; i = last){
while(last <= n && a[i] == a[last]) last ++ ;
for(j = last - i ; j ; j -- ){
t = find(j , ,n ,) ,ans[t] = a[i] ,update(t ,-si[t] , ,n ,);
for(l = head[t] ; l ; l = nxt[l]) update(to[l] ,si[to[l]] , ,n ,);
}
}
rep(i,,n) printf("%d " ,ans[i]);
return ;
}
[BZOJ5249][九省联考2018]IIIDX(线段树)的更多相关文章
- [九省联考2018] IIIDX 线段树+贪心
题目: 给出 k 和 n 个数,构造一个序列使得 d[i]>=d[i/k] ,并且字典序最大. 分析: 听说,当年省选的时候,这道题挡住了大批的高手,看上去十分简单,实际上那道弯段时间内是转不过 ...
- BZOJ5249 九省联考2018IIIDX(线段树+贪心)
显然这形成了一个树形结构.考虑这样一种贪心:按照曲目顺序,每次取消其父亲的预留,并选择当前可选择(保证其子树有合法选择且满足预留)的最大值,然后对其子树预留出大于等于他的一些值.这个做法显然是正确的. ...
- [BZOJ5249][九省联考2018]IIIDX:线段树+贪心
分析 GXZlegend orz 构造出一组合法的解并不是难事,但是我们需要输出的是字典序最大的解. 字典序最大有另一种理解方式,就是让越小的数尽量越靠后. 我们从树的根结点出发,从1开始填数,构造出 ...
- 省选九省联考T2 IIIDX(线段树)
题目传送门:https://www.luogu.org/problemnew/show/P4364 期中考后记:期中考刚考完,感觉不咋滴,年排第3.我抗压力太差了..期末得把rank1抢回来. 本来感 ...
- [luogu] P4364 [九省联考2018]IIIDX(贪心)
P4364 [九省联考2018]IIIDX 题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI ...
- [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树
[BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树 题意 给定一个 \(n\) 个点边带权的无根树, 要求切断其中恰好 \(k\) 条边再连 \(k\) 条边权为 \(0\) ...
- BZOJ5249:[九省联考2018]IIIDX——题解
https://www.luogu.org/problemnew/show/P4364#sub https://www.lydsy.com/JudgeOnline/problem.php?id=524 ...
- 洛谷P4364 [九省联考2018]IIIDX 【线段树】
题目 [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在 ,他在世界知名游戏公司KONMAI内工作,离他的梦想也越来越近了.这款 ...
- BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)
BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...
随机推荐
- 浏览器请求中文乱码(ISO-8859-1 to UTF-8)
String utfString=new String(param.getBytes("iso-8859-1"),"utf-8");
- 一个SQL调优/优化(SQL TUNING)“小把戏”“哄得”小朋友挺满意
前几天,去一个用户那里,解决完问题,和一个小朋友闲聊,他有点愁眉不展.郁郁寡欢的样子,似乎没心情和我说话,之前,他的话是最多的,见此状,我就问:怎么了?小朋友?,他说,这几天应用人员说他的某个模块的性 ...
- zk请求和响应对
zk的请求和响应是通过id对应上的: 请求头(RequestHeader)和响应头(ReplyHeader)共用一个xid,它的本质是ClientCnxn类中的一个计数器. 1. 首先看客户端: Pa ...
- 线程同步,条件变量pthread_cond_wait
与互斥锁不同,条件变量是用来等待而不是用来上锁的.条件变量用来自动阻塞一个线程,直到某特殊情况发生为止.条件变量使我们可以睡眠等待某种条件出现.条件变量是利用线程间共享的全局变量进行同步的一种机制,主 ...
- HTTP使用 multipart/form-data 上传多个字段(包括文件字节流 octet-stream)
自己用到的一个向服务器上传多个字段的实例,代码不全,仅做参考. 用的是WinINet,上传的字段中包括文件字节流 /* PHttpRequest中自行组装body之后,HttpSendRequest中 ...
- POJ 2251 bfs
DESCRIPTION:给你一个三维的迷宫.问你是否能从起点走到终点.如果能,输出最小步数.对我来说难得就是我没有想到怎么把他给你的三维图转换成map.恩..好像解题报告上说.只要是这种的最短路都要用 ...
- Openwrt WiFi Configure(1)
1 Scope of Document This document describes how to custom wifi option 2 Requiremen 2.1 ...
- IE11浏览器,按F12 检查元素,工具会出来,但是没法正常使用?
微软网站上找到IE11的累计安全更新,安装后就能正常使用了.https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=45154
- MS14-021: Internet Explorer 安全更新: 2014 年 5 月 1 日
微软推送全平台IE零日漏洞补丁 2014.05.2 3 Comments 207 views今天,微软正式发布IE安全补丁,修复4月底曝光的零日漏洞.用户可通过Windows Update自动更新服务 ...
- ios 从网络上获取图片
-(UIImage *) getImageFromURL:(NSString *)fileURL { NSLog(@"执行图片下载函数"); UIImage * result; N ...