题目描述

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. 2022-07-10 第五小组 pan小堂 css学习笔记

    css学习笔记 什么是 CSS? CSS 指的是层叠样式表* (Cascading Style Sheets) CSS 描述了如何在屏幕.纸张或其他媒体上显示 HTML 元素 CSS 节省了大量工作. ...

  2. 2537-springsecurity系列--关于session的管理2-session缓存和共享

    版本信息 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...

  3. SpringBoot集成文件 - 如何基于POI-tl和word模板导出庞大的Word文件?

    前文我们介绍了通过Apache POI通过来导出word的例子:那如果是word模板方式,有没有开源库通过模板方式导出word呢?poi-tl是一个基于Apache POI的Word模板引擎,也是一个 ...

  4. 精心整理16条MySQL使用规范,减少80%问题,推荐分享给团队

    上篇文章介绍了如何创建合适的MySQL索引,今天再一块学一下如何更规范.更合理的使用MySQL? 合理规范的使用MySQL,可以大大减少开发工作量和线上问题,并提升SQL查询性能. 我精心总结了这16 ...

  5. JavaScript数组方法总结,本文是根据数组原型上的方法进行总结,由于方法太多将会分篇章发布

    通过浏览器控制台 console 可查看到 Array 数组上原型的所有方法(如下图).对于原型问题此文章暂不过多叙述,单针对对象中的方法进行自我看法的总结:细心的同学可以发现对象原型上所携带的方法基 ...

  6. 基于ABP和Magicodes实现Excel导出操作

      前端使用的vue-element-admin框架,后端使用ABP框架,Excel导出使用的Magicodes.IE.Excel.Abp库.Excel导入和导出操作几乎一样,不再介绍.文本主要介绍E ...

  7. 5.6 NOI模拟

    \(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...

  8. 解决ASP.NET Core在Task中使用IServiceProvider的问题

    前言 问题的起因是在帮同事解决遇到的一个问题,他的本意是在EF Core中为了解决避免多个线程使用同一个DbContext实例的问题.但是由于对Microsoft.Extensions.Depende ...

  9. 业界压测平台与JMeter的对比

    压测平台是什么? 压测,即压力测试,作用是对各种服务对象进行压力测试以获得该服务处于或超过预期负载时系统的运行情况,进而判断系统在峰值负载或超出最大负载情况下的处理能力. 压测工具,顾名思义,就是用来 ...

  10. Excel 数学函数(三):RAND 和 RANDBETWEEN

    Excel 主要有 RAND 和 RANDBETWEEN 这两个函数生成随机数.RAND 默认生成 0~1 的随机数:RANDBETWEEN 有两个参数:bottom 和 top,bottom 代表函 ...