题目描述

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. Object类中wait代餐方法和notifyAll方法和线程间通信

    Object类中wait代餐方法和notifyAll方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 进入 ...

  2. 7 行代码搞崩溃 B 站,原因令人唏嘘!

    前不久,哔哩哔哩(一般常称为 B 站)发布了一篇文章<2021.07.13 我们是这样崩的>,详细回顾了他们在 2021.07.13 晚上全站崩溃约 3 小时的至暗时刻,以及万分紧张的故障 ...

  3. Nuget打包并上传教程

    一.准备 1 . 下载 Download NuGet.exe 2 . windows 系统下设置环境变量 path中 或者 在dos 命令窗口下cd转到 nuget.exe 所在目录,这里为了每次使用 ...

  4. php static 和self区别

    static(关键字) 类似于 self(关键字) , 但它指向的是被调用的类(Document) 而不是包含类(DomainObject) , static 和 self 的区别: <?php ...

  5. 使用 Vagrant 在 VirtualBox 安装 Linux 虚拟机

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 导入 2.工具介绍 3.通过Vagrant为VirtualBox安装CentOS 7 4.总结 文章推荐: 关 ...

  6. 超全selenium元素定位XPath、CSS

    说明:在HTML页面中,<p> 是一个标签,<p>hello</p> 是一个元素,元素由一个开始的标签和结束的标签组成.<font color="r ...

  7. 【PHP库】phpseclib - sftp远程文件操作

    需求场景说明 对接的三方商家需要进行文件传输,并且对方提供的方式是 sftp 的服务器账号,我们需根据他们提供的目录进行下载和上传指定文件. 安装 composer require phpseclib ...

  8. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(12)-Fiddler设置IOS手机抓包,你知多少???

    1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求,也可以截获各种智能手机发出的HTTP/ HTTPS 请求. Fiddler 能捕获Android 和 Windows Phone 等 ...

  9. 记录第一次给开源项目提 PR

    本文是深入浅出 ahooks 源码系列文章的第八篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 本篇文章算是该系列的一个彩蛋篇,记录一下第一次给开源项目提 PR ...

  10. C++ 炼气期之结构体

    1. 前言 随着计算机向着不同领域的延伸,数据的概念已经不仅局限于数值型数据,计算机需要处理大量的非数值.且复杂的类型数据. 为了能抽象地描述这些非数值.复杂类型的数据,C++引入了复合数据类型的概念 ...