题目描述

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;
}

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

最新文章

  1. springmvc的类型转换
  2. html/css 钢琴黑白格布局
  3. html css javascript 加载的顺序
  4. js call apply
  5. Java-ios推送
  6. details和summary
  7. Mvc下异步断点续传大文件
  8. java 线程---成员变量与局部变量
  9. 264. Ugly Number II
  10. Config the Android 5.0 Build Environment
  11. Omnithreadlibary学习(1)-异步执行
  12. hdoj1072 Nightmare bfs
  13. JavaScript 动态添加div 绑定点击事件
  14. 为Markdown文件生成目录
  15. golang接口三个特性
  16. 使用clipBoard.js进行页面内容复制
  17. cf1000F One Occurrence (线段树)
  18. Python学习笔记:Flask-Migrate基于model做upgrade的基本原理
  19. 如何理解Minkowski不等式
  20. linux系统下载pycharm

热门文章

  1. openstack 虚拟机网卡被重名为cirename0
  2. 注解_概念和注解_JDK内置注解
  3. 【Azure 应用服务】部署Kafka Trigger Function到Azure Function服务中,解决自定义域名解析难题
  4. 皮皮调度(1)——从Airflow到DolphinScheduler,以及“皮皮调度”的来历
  5. 用HTTP服务的方式集成learned cardinality estimate方法进 Postgresql
  6. 痞子衡嵌入式:浅析IAR下调试信息输出机制之半主机(Semihosting)
  7. 如何在 HTML 中调整图像大小?
  8. 小A的树 - 树形DP
  9. cobaltstrike进行局域网远控
  10. Helm安装ingress-nginx-4.1.4