CSP-J2020 洛谷P7072 直播获奖(Splay/桶排序)
题目描述
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/桶排序)的更多相关文章
- [洛谷P3809]【模板】后缀排序
[洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛& ...
- BZOJ3224/洛谷P3391 - 普通平衡树(Splay)
BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- 括号树 noip(csp??) 2019 洛谷 P5658
洛谷AC通道 本题,题目长,但是实际想起来十分简单. 首先,对于树上的每一个后括号,我们很容易知道,他的贡献值等于上一个后括号的贡献值 + 1.(当然,前提是要有人跟他匹配,毕竟题目中要求了,是不同的 ...
- 洛谷.2596.[ZJOI2006]书架(Splay)
题目链接 /* 五个操作: 1.将某元素置顶.删掉这个数,插入最左 2.将某元素置底.同样 3.旋到根后,直接将这个数与前驱/后继交换所有信息 不是左右子节点! 4.5.裸平衡树 ps:1.用pos[ ...
- 洛谷 P2596 [ZJOI2006]书架 (splay)
题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些 ...
- 洛谷P3871 [TJOI2010]中位数(splay)
题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...
- [洛谷P1168]中位数(Splay)/(主席树)
Description 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[2], -, A[2k - 1]的中位数.即前1,3,5,--个数的 ...
- 洛谷P3960 列队(Splay)
传送门 感觉自己好久不打数据结构已经完全不会了orz…… 据说正解树状数组?然而并不会 首先考虑一下每一次操作,就是把一个人从这一行中取出并放到行的最后,再从最后一列取出放到列的最后 那么这两种操作其 ...
随机推荐
- 同时安装py2和py3-安装多版本python
遇到问题和需求 我的电脑环境:先安装py2再安装py3,平时我工作中是使用python2,如何保证两个版本共存且让代码来选择要使用的版本. 遇到问题 在cmd中输入python,进入的是py2的环境, ...
- 原生js也可以自定义组件
Web Components 是一套不同的技术,允许您创建可重用的定制元素(它们的功能封装在您的代码之外)并且在您的web应用中使用它们. 它由三项主要技术组成,它们可以一起使用来创建封装功能的定制元 ...
- 如何实现 System.out.println("a") 显示 b
今天看到一篇文章不用反射,能否交换两个字符串的值. 心想字符串常量在常量池里面,是在就算用了反射也交换不了吧.转念一想,不对,字符串常量虽然本身在常量池里面,但是它依然是个对象,那么 private ...
- 记录一个i变量引发的事故
概述 近期开发中遇到一个特别的问题,觉得很有必要与你下来.就是由于在开发中一个很小的疏忽,导致了很大的问题,是什么呢? 现象 我的程序突然引发了v8内部的错误,提示都是c++的,如下.程序一启动就直接 ...
- 一文带你认知定时消息发布RocketMQ
摘要:DMS任意时间定时消息能力发布. DMS是华为云的分布式消息中间件服务.适用于解决分布式架构中的系统解耦.跨系统跨地域数据流通.分布式事务协调等难题,协助构建优雅的现代化应用架构,提供可兼容 K ...
- Fiddler抓包工具下载安装及使用
一.Fiddler简介 简介: Fiddler是一款强大的Web调试工具,他能记录所有客户端和服务器的HTTP/HTTPS请求 工作原理: Fiddler是以代理web服务器的形式工作的,它使用代理地 ...
- 分布式id生成器,雪花算法IdWorker
/** * <p>名称:IdWorker.java</p> * <p>描述:分布式自增长ID</p> * <pre> * Twitter的 ...
- Java精进-20分钟学会mybatis使用
文字分享 希望现在的你无论有明确具体的目标还是没有,都能重视自己的需求和目标,并且常常回顾,或许可以找一个你习惯的方式写出来,挂在哪里,电脑或日记本都好.当你疲惫或迷茫的时候拿出来看一下,这在情怀领域 ...
- 第二十八篇:关于node.js连接数据库
好家伙,这个不难,但是也不简单. $ cnpm install mysql 教程里是带美元符的,但是我打的时候加上美元符用不了,所以我就没用美元符了,一样能行. 还有,淘宝镜像,yyds, var m ...
- JMeter测试dubbo接口总结
Jmeter 测试dubbo 接口 1. 安装JMeter 安装到/usr/local下 2. github上下载 jmeter-plugins-dubbo-x.x.x-jar-with-depend ...