洛谷P1309 瑞士轮——题解



思路非常简单,只要开始时把结构体排个序,每次给赢的加分再排序,共r次,最后再输出分数第q大的就行了。
(天真的我估错时间复杂度用每次用sort暴力排序结果60分。。。)实际上这道题估算时间复杂度时O括号里的n并不是输入的n,而是输入的n乘2,这就要求我们精准地估算时间复杂度以采取合适的算法来解题。显然sort时不行的。为什么sort这么强都会TLE?考虑不行的原因,找找有用的教训:(先普及一下:sort是冒泡排序的改进版,平均时间复杂度为O(n log n),最坏情况下会退化成O(n2)。)
从sort的原理开始考虑:sort排序时会有两个指针分别从头到尾相向而行直到相遇后的分手。然后再分别对左右两部分递归,直到递归的区间长度为1。这样发现,就算这个序列已经有序(或基本有序)时,sort会造成大量的时间浪费。这时同时O(n log n)级别的归并排序就不同了。当序列基本有序时,归并排序会造成更少的时间浪费,因为序列基本有序时,“并”操作左右两区间中的左区间应该是主要都小于右区间的,这样就会使左区间更早地并入答案数组,剩下的右区间的长度相应地更长,用个memcpy就完事了,结果是使使左右区间的开头端点比较的次数减少,进而减少了时间浪费。
发现把一个大轮回比赛里的所有赢家单独拿出来后他们的顺序都是合法且不变的(因为都是从原来的序列中的相应值加1);所有输家的大小顺序也是合法的(因为值都没有改变)。这样可以直接用归并排序的思想,把赢家都放在一个区间、输家放在另一个区间中,两个区间只要归并一次就能得到有序的数列了,无需再各种递归费解合并。
见AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cctype>
#include<cstring> using namespace std; struct hum{
int num,s,w;
}a[],win[],lose[];//赢的放一起,输的放一起 int n,r,q,ans,lw,ll; char ch; bool cmp(hum a,hum b)
{
return a.s>b.s||(a.s==b.s&&a.num<b.num);
} inline int read()
{
ans=;
ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
return ans;
} int main()
{
n=(read())<<,r=read(),q=read();
for(int i=;i<=n;i++)
{
a[i].num=i;
a[i].s=read();
}
for(int i=;i<=n;i++) a[i].w=read();
sort(a+,a+n+,cmp);
for(int k=;k<=r;k++)
{
for(int i=;i<=n;i+=)
{
if(a[i].w>a[i+].w)
{
a[i].s++;
win[++lw]=a[i];
lose[++ll]=a[i+];
}
else
{
a[i+].s++;
win[++lw]=a[i+];
lose[++ll]=a[i];
}
}
int l=,r=,len=;//往下都是并的过程
while(l<=lw&&r<=ll)
{
if(win[l].s>lose[r].s)
a[len++]=win[l++];
if(win[l].s<lose[r].s)
a[len++]=lose[r++];
if(win[l].s==lose[r].s)
{
if(win[l].num<lose[r].num) a[len++]=win[l++];
else a[len++]=lose[r++];
}
}
if(l<=lw) memcpy(a+len,win+l,sizeof(hum)*(lw-l+));
if(r<=ll) memcpy(a+len,lose+r,sizeof(hum)*(ll-r+));//并的过程结束
lw=;ll=; //因为是由前缀++维护,所以要初始化为1
}
cout<<a[q].num;
return ;
}
还是要做好时间复杂度估计的说!
洛谷P1309 瑞士轮——题解的更多相关文章
- 洛谷 P1309 瑞士轮 题解
每日一题 day4 打卡 Analysis 暴力+快排(其实是归并排序) 一开始天真的以为sort能过,结果光荣TLE,由于每次只更改相邻的元素,于是善于处理随机数的快排就会浪费很多时间.于是就想到归 ...
- 洛谷P1309 瑞士轮(归并排序)
To 洛谷.1309 瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平, ...
- 洛谷 P1309 瑞士轮 解题报告
P1309 瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低 ...
- NOIP2011 普及组 T3 洛谷P1309 瑞士轮
今天题做太少,放道小题凑数233 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公 ...
- 洛谷 P1309 瑞士轮
题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低,但比赛过程往往十分 ...
- 洛谷P1309——瑞士轮(归并排序)
https://www.luogu.org/problem/show?pid=1309#sub 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点 ...
- 洛谷P1309 瑞士轮
传送门 题目大意: 2*n个人,有初始的比赛分数和实力值. 每次比赛前总分从大到小排序,总分相同编号小的排在前面. 每次比赛是1和2比,3和4比,5和6比. 实力值大的获胜得1分. 每次比赛前排序确定 ...
- 洛谷 - P1309 - 瑞士轮 - 归并排序
https://www.luogu.org/problemnew/show/P1309 一开始写的直接快排没想到真的TLE了. 想到每次比赛每个人前移的量不会很多,但是不知从哪里开始优化. 搜索一下原 ...
- P1309 瑞士轮 (吸氧了)
P1309 瑞士轮 题解 1.这题可以模拟一下 2.sort吸氧可以过(可能是排序有点慢吧,不开会T) sort排序时注意: return 1 是满足条件,不交换 return 0是不满足,交换 代码 ...
随机推荐
- hdu5993/2016icpc青岛L
zz:https://www.cnblogs.com/ytytzzz/p/9674661.html 题意:给一棵树,每次询问删掉两条边,问剩下的三棵树的最大直径点10W,询问10W,询问相互独立 So ...
- 【Qt开发】Qt标准对话框之QMessageBox
好久没有更新博客,主要是公司里面还在验收一些东西,所以没有及时更新.而且也在写一个基于Qt的画图程序,基本上类似于PS的东西,主要用到的是Qt Graphics View Framework.好了,现 ...
- 前端 CSS 盒子模型 边框 border属性
边框 border:边框的意思,描述盒子的边框 边框有三个要素: 粗细 线性样式 颜色 border: solid border特性 如果颜色不写,默认是黑色.如果粗细不写,不显示边框.如果只写线性样 ...
- 虚拟机上首次安装Ubuntu后 root密码设置
虚拟机下安装ubuntu后root密码设置 问题描述: 在虚拟机下安装了ubuntu中要输入用户名,一般情况下大家都会输入一个自己的网名或绰号之类的,密码也在这时设置过了. 但是当安装成功之后,使用命 ...
- netstat -anop|more 查看网络队列
nux下netstat --timers / -o详解及keepalive相关 第一列,一般有一下几种状态: keepalive - #表示是keepalive的时间计时 on - #表示是重发(re ...
- 【转】centos7安装
转自:https://blog.csdn.net/qq_42570879/article/details/82853708 1.CentOS下载CentOS是免费版,推荐在官网上直接下载,网址:htt ...
- IntelliJ IDEA 2019.3 这回真的要飞起来了,新特性抢先看!
IntelliJ IDEA 才公布下一个主要版本 2019.3 的 Roadmap,近日就发布了 IntelliJ IDEA 2019.3 的首个早期访问版本(即 EAP 版本),版本号为 2019. ...
- P1141零一迷宫
这是一道对于除了我之外其他人都十分简单的搜索题,我终于在这个夜里搞会了. 首先其问可以到达多少个点,并不是走一次可以最多经过几个点,这就解释了为什么不需要回溯,并且递归边界则是让其全部走完即可.于是便 ...
- Paper Reading_ML for system
最近(以及预感接下来的一年)会读很多很多的paper......不如开个帖子记录一下读paper心得 SysML相关的文章很多来源于上学期的8980课.有些和具体field(比如DB/architec ...
- 小程序中页面兼容h5标签的解析
有时候当小程序向后台拿数据是一篇html标签的文章时,把它放进小程序会发现很多标签就不兼容,如果要一个个改又很麻烦,有没有方法可以很快地兼容html标签呢? 有个工具可以做到:wxParse 下载了它 ...