题目描述

NOI2130 即将举行。为了增加观赏性,CCF 决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为 w%,即当前排名前 w% 的选手的最低成绩就是即时的分数线。

更具体地,若当前已评出了 p 个选手的成绩,则当前计划获奖人数为max(1,⌊p∗w%⌋)。如有选手成绩相同,则所有成绩并列的选手都能获奖,因此实际获奖人数可能比计划中多。

作为评测组的技术人员,请你帮 CCF 写一个直播程序。

输入格式

第一行有两个整数 n,w。分别代表选手总数与获奖率。
第二行有 n 个整数,依次代表逐一评出的选手成绩。

输出格式

只有一行,包含 n 个非负整数,依次代表选手成绩逐一评出后,即时的获奖分数线。相邻两个整数间用一个空格分隔。

看到这道题,第一反应是用Splay,因为这道题支持两个操作:插入元素和查询第k大元素,套模板就行了。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1e5+5;
4 int n,w;
5 int fa[N],lc[N],rc[N],vi[N],sze[N];
6 int rt,T;
7 bool Wrt(int x){
8 return rc[fa[x]]==x;
9 }
10
11 void pushup(int x){//更新子树大小
12 sze[x]=sze[lc[x]]+sze[rc[x]]+1;
13 }
14
15 void rot(int x){
16 int y=fa[x],z=fa[y];
17 int b=(lc[y]==x)?rc[x]:lc[x];
18 fa[x]=z,fa[y]=x;
19 if(b) fa[b]=y;
20 if(z) (y==lc[z]?lc[z]:rc[z])=x;
21 if(x==lc[y]) rc[x]=y,lc[y]=b;
22 else lc[x]=y,rc[y]=b;
23 pushup(y);pushup(x);
24 }
25
26 void Splay(int x,int tar){
27 while(fa[x]!=tar){
28 if(fa[fa[x]]!=tar)
29 Wrt(x)==Wrt(fa[x])?rot(fa[x]):rot(x);
30 rot(x);
31 }
32 if(!tar) rt=x;
33 }
34
35 void ins(int v){//插入元素
36 int x=rt,y=0,dir;
37 while(x){
38 ++sze[y=x];
39 if(v<=vi[x]) dir=0,x=lc[x];
40 else dir=1,x=rc[x];
41 }
42 fa[x=++T]=y,vi[x]=v,sze[x]=1;
43 if(y) (dir==0?lc[y]:rc[y])=x;
44 Splay(x,0);
45 }
46
47 int query(int x,int k){//查找第k个数
48 while(1){
49 int s=lc[x]?sze[lc[x]]+1:1;
50 if(k==s) return vi[x];
51 if(k>s) k-=s,x=rc[x];
52 else x=lc[x];
53 }
54 }
55
56 int main(){
57 scanf("%d%d",&n,&w);
58 for(int i=1;i<=n;i++){
59 int x;
60 scanf("%d",&x);
61 int k=max(1,i*w/100);
62 ins(x);
63 cout<<query(rt,i-k+1)<<" ";
64 }
65 return 0;
66 }

当然,本题还有更简单的方法,代码量也更小。

就是用桶排序,因为分数的范围非常小,只有600;(桶的下标就是元素的值)

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int t[N],n,w; int main(){
scanf("%d%d",&n,&w);
for(int i=1;i<=n;i++){
int x,sum=0;
scanf("%d",&x);t[x]++;
for(int j=600;j>=0;j--){
sum+=t[j];
if(sum>=max(1,i*w/100)){
cout<<j<<" ";
break;
}
}
}
return 0;
}

之前好像没太多接触过桶,今天又学到了,像这种题目值域比较小的,可以考虑用桶。

CSP-J2020 洛谷P7072 直播获奖(Splay/桶排序)的更多相关文章

  1. [洛谷P3809]【模板】后缀排序

    [洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛& ...

  2. BZOJ3224/洛谷P3391 - 普通平衡树(Splay)

    BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...

  3. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

  4. 括号树 noip(csp??) 2019 洛谷 P5658

    洛谷AC通道 本题,题目长,但是实际想起来十分简单. 首先,对于树上的每一个后括号,我们很容易知道,他的贡献值等于上一个后括号的贡献值 + 1.(当然,前提是要有人跟他匹配,毕竟题目中要求了,是不同的 ...

  5. 洛谷.2596.[ZJOI2006]书架(Splay)

    题目链接 /* 五个操作: 1.将某元素置顶.删掉这个数,插入最左 2.将某元素置底.同样 3.旋到根后,直接将这个数与前驱/后继交换所有信息 不是左右子节点! 4.5.裸平衡树 ps:1.用pos[ ...

  6. 洛谷 P2596 [ZJOI2006]书架 (splay)

    题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些 ...

  7. 洛谷P3871 [TJOI2010]中位数(splay)

    题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...

  8. [洛谷P1168]中位数(Splay)/(主席树)

    Description 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[2], -, A[2k - 1]的中位数.即前1,3,5,--个数的 ...

  9. 洛谷P3960 列队(Splay)

    传送门 感觉自己好久不打数据结构已经完全不会了orz…… 据说正解树状数组?然而并不会 首先考虑一下每一次操作,就是把一个人从这一行中取出并放到行的最后,再从最后一列取出放到列的最后 那么这两种操作其 ...

随机推荐

  1. 基于Python3(Autosub)以及Ffmpeg配合GoogleTranslation(谷歌)为你的影片实现双语版字幕(逐字稿)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_169 为影片加字幕其实是一件非常耗费时间的事情,尤其是对于打字慢的朋友来说.当然不光为影片加字幕,在其他领域,类似的逐字稿也是工作 ...

  2. SkiaSharp 之 WPF 自绘 粒子花园(案例版)

    此案例包含了简单的碰撞检测,圆形碰撞检测方法,也可以说是五环弹球的升级版,具体可以根据例子参考. 粒子花园 这名字是案例的名字,效果更加具有科技感,很是不错,搞搞做成背景特效也是不错的选择. Wpf ...

  3. DolphinScheduler 线上 Meetup 视频回放(07.25)

    上周六下午 DolphinScheduler 社区联合 Doris 社区进行了 2020 年首次线上 Meetup,各位讲师都做了非常精彩的分享,也吸引了 1900 多位技术伙伴观看. 其中 Dolp ...

  4. Apache DolphinScheduler 使用文档(6/8):任务节点类型与任务参数设置

    本文章经授权转载,原文链接: https://blog.csdn.net/MiaoSO/article/details/104770720 目录 6. 任务节点类型和参数设置 6.1 Shell节点 ...

  5. 如何实现 System.out.println("a") 显示 b

    今天看到一篇文章不用反射,能否交换两个字符串的值. 心想字符串常量在常量池里面,是在就算用了反射也交换不了吧.转念一想,不对,字符串常量虽然本身在常量池里面,但是它依然是个对象,那么 private ...

  6. java-运算符以及简单运用

    运算符: 1)赋值运算符:= 2)算术运算符:+-*/%,++,-- 3)关系运算符:>,<,>=,<=,==,!= boolean 4)逻辑运算符:&&,|| ...

  7. 三道MySQL联合索引面试题,淘汰80%的面试者,你能答对几道

    众所周知MySQL联合索引遵循最左前缀匹配原则,在少数情况下也会不遵循(有兴趣,可以翻一下上篇文章). 创建联合索引的时候,建议优先把区分度高的字段放在第一列. 至于怎么统计区分度,可以按照下面这种方 ...

  8. 国家都给NISP证书的补贴了!关于NISP考试的政策有哪些?

    NISP证书由中国信息安全测评中心依据中编办赋予"信息安全服务和信息安全专业人员的能力评估与资质审核"的职能而推出的证书,是中国信息安全测评中心代表国家实施的信息安全人员能力评定证 ...

  9. [HNOI2010]弹飞绵羊 (平衡树,LCT动态树)

    题面 题解 因为每个点都只能向后跳到一个唯一的点,但可能不止一个点能跳到后面的某个相同的点, 所以我们把它抽象成一个森林.(思考:为什么是森林而不是树?) 子节点可以跳到父节点,根节点再跳就跳飞了. ...

  10. django_day02

    django_day02 外键 表示一对多 多对一 class Book(models.Model): name = models.CharField(max_length=32) publisher ...