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++];
else
a[++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];
else
a[j+1].score++,b[++cnt2]=a[j],b[++cnt1]=a[j+1];
}
}
merge();
printf("%d\n",a[q].num);
return 0;
}

2018.6.18

洛谷 P1309 瑞士轮 解题报告的更多相关文章

  1. 洛谷P1309 瑞士轮(归并排序)

    To 洛谷.1309 瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平, ...

  2. NOIP2011 普及组 T3 洛谷P1309 瑞士轮

    今天题做太少,放道小题凑数233 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公 ...

  3. 洛谷 P1309 瑞士轮

    题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低,但比赛过程往往十分 ...

  4. 洛谷P1309——瑞士轮(归并排序)

    https://www.luogu.org/problem/show?pid=1309#sub 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点 ...

  5. 洛谷P1309 瑞士轮

    传送门 题目大意: 2*n个人,有初始的比赛分数和实力值. 每次比赛前总分从大到小排序,总分相同编号小的排在前面. 每次比赛是1和2比,3和4比,5和6比. 实力值大的获胜得1分. 每次比赛前排序确定 ...

  6. 洛谷 - P1309 - 瑞士轮 - 归并排序

    https://www.luogu.org/problemnew/show/P1309 一开始写的直接快排没想到真的TLE了. 想到每次比赛每个人前移的量不会很多,但是不知从哪里开始优化. 搜索一下原 ...

  7. 洛谷P1309 瑞士轮——题解

    题目传送 思路非常简单,只要开始时把结构体排个序,每次给赢的加分再排序,共r次,最后再输出分数第q大的就行了. (天真的我估错时间复杂度用每次用sort暴力排序结果60分...)实际上这道题估算时间复 ...

  8. 洛谷 P1309 瑞士轮 题解

    每日一题 day4 打卡 Analysis 暴力+快排(其实是归并排序) 一开始天真的以为sort能过,结果光荣TLE,由于每次只更改相邻的元素,于是善于处理随机数的快排就会浪费很多时间.于是就想到归 ...

  9. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

随机推荐

  1. XSS跨站攻击(二)

    本人最近在学习XSS,想总结一下常见的XSS攻击的几种情况,刚好看到<防御 XSS 的七条原则>这篇文章,里面讲的七条防御原则不正是针对XSS的几种利用方式吗?于是,借来学习一下. 原则1 ...

  2. 数据库连接池DBUtils使用

    一.简介 DBUtils简单说python实现的线程化数据库连接(连接池),DBUtils支持所有遵循DP-API 2规范的数据库连接模块,例如:mysql.sqlserver.oracle.sqli ...

  3. Aspose.Cells.dll的用法

    public void OutExcel() { #region WorkbookDesigner designer = new WorkbookDesigner(); Worksheet sheet ...

  4. tkinter 对键盘和鼠标事件的处理

    鼠标事件 <ButtonPress-n> <Button-n> <n> 鼠标按钮n被按下,n为1左键,2中键,3右键 <ButtonRelease-n> ...

  5. Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries

    目录 上篇回顾 Building Queries 匹配所有的查询 全文查询 Full Text Queries 什么是全文查询? Match 全文查询 API 列表 基于词项的查询 Term Term ...

  6. BugkuCTF web2

    前言 写了这么久的web题,算是把它基础部分都刷完了一遍,以下的几天将持续更新BugkuCTF WEB部分的题解,为了不影响阅读,所以每道题的题解都以单独一篇文章的形式发表,感谢大家一直以来的支持和理 ...

  7. jmeter --http属性管理器

    1,http请求默认值 2,HTTP授权管理器 3,HTTP缓存管理 4,HTTP cookie 管理器 5,HTTP头文管理器

  8. 认识 Iconfont 以及什么是 .eot、.woff、.ttf、.svg

    一.Iconfont 1. 概述 在前端作业中,二十年前只有页面中铺满文字就算上线产品,现如今,不加点俏皮的“图标”会让页面显得很 Low 很 Low.   图标 在写这篇文章之前,我一直以为上图中的 ...

  9. Daily Scrum NO.5

    工作概况 符美潇 昨日完成的工作 1.Daily Scrum.日常会议及日常工作的分配和查收. 2.变更集461代码签入,主要与视频链接爬取有关. 今日工作 1.Daily Scrum.日常会议及日常 ...

  10. 20135337朱荟潼 Linux第二周学习总结——操作系统是如何工作的

    一.计算机是如何工作的--总结 三个法宝 存储程序计算机.函数调用堆栈.中断机制 二.堆栈 1.是c语言程序运行时必须的一个记录调用路径和参数的空间. 函数调用框架.传递参数.保存返回地址.提供局部变 ...