洛谷 P1309 瑞士轮 解题报告
P1309 瑞士轮
题目背景
在双人对决的竞技性比赛,如乒乓球、羽毛球、国际象棋中,最常见的赛制是淘汰赛和循环赛。前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高。后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长。
本题中介绍的瑞士轮赛制,因最早使用于 18951895 年在瑞士举办的国际象棋比赛而得名。它可以看作是淘汰赛与循环赛的折中,既保证了比赛的稳定性,又能使赛程不至于过长。
题目描述
\(2×N\)名编号为\(1-2N\)的选手共进行\(R\)轮比赛。每轮比赛开始前,以及所有比赛结束后,都会按照总分从高到低对选手进行一次排名。选手的总分为第一轮开始前的初始分数加上已参加过的所有比赛的得分和。总分相同的,约定编号较小的选手排名靠前。
每轮比赛的对阵安排与该轮比赛开始前的排名有关:第1名和第2名、第3名和第4名、……、第2K - 1名和第2K名、…… 、第2N−1名和第2N名,各进行一场比赛。每场比赛胜者得1分,负者得0分。也就是说除了首轮以外,其它轮比赛的安排均不能事先确定,而是要取决于选手在之前比赛中的表现。
现给定每个选手的初始分数及其实力值,试计算在R轮比赛过后,排名第Q的选手编号是多少。我们假设选手的实力值两两不同,且每场比赛中实力值较高的总能获胜。
输入输出格式
输入格式:
第一行是三个正整数N,R,Q ,每两个数之间用一个空格隔开,表示有2×N名选手、R轮比赛,以及我们关心的名次Q 。
第二行是2×N 个非负整数\(s_1, s_2, …, s_{2N}\) ,每两个数之间用一个空格隔开,其中\(s_i\),表示编号为\(i\)的选手的初始分数。 第三行是\(2×N\)个正整数\(w_1 , w_2 , …, w_{2N}\),每两个数之间用一个空格隔开,其中\(w_i\)表示编号为\(i\)的选手的实力值。
输出格式:
一个整数,即\(R\)轮比赛结束后,排名第\(Q\)的选手的编号。
数据范围
对于30%的数据,\(1≤N≤100\) ;
对于50%的数据,\(1≤N≤10,000\) ;
对于100% 的数据, \(1 ≤ N ≤ 100,000,1 ≤ R ≤ 50,1 ≤ Q ≤ 2N,0 ≤ s_1, s_2, …, s_{2N}≤10^8,1 ≤w_1, w_2 , …, w_{2N}≤ 10^8\)
一上来估计了一下复杂度看看高性能的标签,\(O(2*N*Q*log_2(2*N))\),直接一顿sort上去。。额60分呢。。
抱怨了一下想了一会儿点开了题解。。
注意到胜利的人分数加了只后属于胜利的人的一方的相对位置不会改变,同理失败的一方也是。
联想到归并排序的合并,我们这时候只需要\(O(N)\)的复杂度就可以重新拍好序了。
#include <cstdio>
#include <algorithm>
const int N=100010;
struct node
{int num,score,w;bool friend operator <(node n1,node n2){if(n1.score==n2.score) return n1.num<n2.num;return n1.score>n2.score;}bool friend operator >(node n1,node n2){if(n1.score==n2.score) return n1.num<n2.num;return n1.score>n2.score;}
}a[N<<1],b[N<<1];
int n,r,q;
void merge()
{int l1=1,l2=(n>>1)+1,cnt=0;while(l1<=(n>>1)&&l2<=n){if(b[l2]>b[l1])a[++cnt]=b[l2++];elsea[++cnt]=b[l1++];}while(l1<=(n>>1))a[++cnt]=b[l1++];while(l2<=n)a[++cnt]=b[l2++];
}
int main()
{scanf("%d%d%d",&n,&r,&q);n<<=1;for(int i=1;i<=n;i++){scanf("%d",&a[i].score);a[i].num=i;}for(int i=1;i<=n;i++)scanf("%d",&a[i].w);for(int i=1;i<=r;i++){if(i==1) std::sort(a+1,a+1+n);else merge();int cnt1=0,cnt2=n>>1;for(int j=1;j<=n;j+=2){if(a[j].w>a[j+1].w)a[j].score++,b[++cnt1]=a[j],b[++cnt2]=a[j+1];elsea[j+1].score++,b[++cnt2]=a[j],b[++cnt1]=a[j+1];}}merge();printf("%d\n",a[q].num);return 0;
}
2018.6.18
转载于:https://www.cnblogs.com/butterflydew/p/9196679.html
洛谷 P1309 瑞士轮 解题报告相关推荐
- 洛谷 P1309 瑞士轮 归并
洛谷 P1309 瑞士轮 https://www.luogu.com.cn/problem/P1309 每一轮快排,超时: # include<iostream> # include< ...
- 洛谷P1309 瑞士轮【归并排序】
题目链接:P1309 瑞士轮 程序说明: 卡了一个晚上,思路比较简单但是细节很多,有很多大坑! 每轮比赛结束后都需要对选手的成绩进行排序,这道题不能用STL的sort()或者手写快排进行排序,否则会超 ...
- 洛谷 P1309 瑞士轮
题目链接:https://www.luogu.org/problemnew/show/P1309 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特 ...
- 洛谷排序--瑞士轮(归并排序)
洛谷排序–瑞士轮(归并排序) 题目背景: 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平 ...
- 洛谷1309 瑞士轮
洛谷1309 瑞士轮 本题地址: http://www.luogu.org/problem/show?pid=1309 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘 ...
- 洛谷1056 排座椅 解题报告
洛谷1056 排座椅 本题地址: http://www.luogu.org/problem/show?pid=1056 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头 ...
- 洛谷1067 多项式输出 解题报告
洛谷1067 多项式输出 本题地址: http://www.luogu.org/problem/show?pid=1067 题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i ...
- 洛谷 P4475 巧克力王国 解题报告
P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...
- 洛谷 P4706 取石子 解题报告
P4706 取石子 题目描述 现在 Yopilla 和 yww 要开始玩游戏! 他们在一条直线上标记了 \(n\) 个点,从左往右依次标号为 \(1, 2, ..., n\) .然后在每个点上放置一些 ...
最新文章
- 英特尔与京东联合强化AI武器:让创新更专注
- 1.虚拟化的历史和定义
- DataBind 踩坑事件
- input must have last dimension = k = 3 but is 2 for 'TopKV2_这种错误是怎么产生的
- django中的项目使用mysql中的配置新建用户授予权限
- 使用WGAN生成手写字体
- 2018计算机河北省高考试题,2018年河北高考物理压轴试题【含答案】
- A股收盘:深证区块链50指数跌3.80%,爱迪尔等9股涨停
- mysql xp系统时间_【MySQL】时间函数
- atitit uke企业行政部 世界行政区域划分表 与邮政编码规划 v5 r88.xlsx
- 尚学堂的J2EE教程免费下载(非常经典的JAVA教程)
- QQ和微信一键加群加好友链接代码实现
- python读取手机通讯录_利用python解析手机通讯录
- windows虚拟化服务器搭建,windows虚拟化服务器搭建
- 期货用期权对冲(期货用期权对冲吗)
- 怎么用ping命令测试网速
- 【机器学习】完整的机器学习项目演练:第一部分
- 天选三超频实战/适用于所有AMD笔记本的全面超频指南:CPU频率,功耗墙,Infinity Fabric总线(FCLK),内存时序,CPU电压,核显频率,核显电压......
- iOS_实现类似蒲公英、fir等发包平台 通过URL分发内测APP
- Java入门之7:Java中的float和double类型的浮点数是怎么按照IEEE 754标准存储的?