因为太菜不会写P1310 表达式的值,就只能过来水两篇博客啦qwq

另外这个题我是开o2才过的(虽然是写了归并排序)(可能我太菜写的归并不是还可以“剪枝”吧qwq)哎,果真还是太菜啦qwq

所以准备写归并然后去题解学习正确的不用开O2就可以过的算法;

咱好像忘记添加链接了qwq:

瑞士轮【题目链接】


其实这个题打眼一看可以直接sort来做,但是这个题用sort还是太慢了qwq、开o2都只有70pts,因此这是逼着我重新复习一遍归并排序啊qwq:

About归并:

注意归并排序要开一个辅助数组f[k],k从1开始~n记录了排好序的数组,然后为了保证每次排序都有效所以最后要重新将f数组的值赋给a数组,归并排序的思想是把一个排序区间分成两个大概等长(因为会出现奇数个元素所以并不是一定完全等长)的区间,然后接着再分,直到每个区间都只剩一个元素,接下来合并两个区间,分别设指针i和j指向要合并的两个区间的头,然后进行比较,如果a[i]<a[j](假设从小到大排),那么令i++,同时k++,f[k]=a[i];否则的话,令j++,同时k++,f[k]=a[j];结束的条件是i>mid或j>end(排序的末端点),然后将i之后和j之后没有进行比较的数(因为归并是从最小区间(1)开始排序,因此当我们排一个区间长度时,它的左边部分和右边部分已经都是有序的啦)复制到f数组中。

CODE:(归并)

void msort(int str,int end){//from big to smasll
if(str==end) return;
int mid=(str+end)>>;
msort(str,mid);
msort(mid+,end);
int i=str,j=mid+,k=str;
while(i<=mid&&j<=end){
if(p[i]>p[j]){
r1[k]=p[i];
k++;i++;
}
else {
r1[k]=p[j];
k++;j++;
}
}
while(i<=mid){r1[k]=p[i];k++;i++;}
while(j<=end){r1[k]=p[j];k++;j++;}
for(int i=str;i<=end;i++){
p[i]=r1[i];
}
}

以下是朴素归并排序的瑞士轮CODE:

#include<bits/stdc++.h>

using namespace std;

int n,r,q;
struct node{
int num,s,w;
}p[],r1[]; bool cmp(node x,node y){
if(x.s==y.s) return x.num<y.num;
return x.s>y.s;
} void msort(int str,int end){//归并:from big to smasll
if(str==end) return;
int mid=(str+end)>>;
msort(str,mid);
msort(mid+,end);
int i=str,j=mid+,k=str;
while(i<=mid&&j<=end){
if(cmp(p[i],p[j])){
r1[k].s=p[i].s;
r1[k].num=p[i].num;
r1[k].w=p[i].w;
k++;i++;
}
else {
r1[k].s=p[j].s;
r1[k].num=p[j].num;
r1[k].w=p[j].w;
k++;j++;
}
}
while(i<=mid){r1[k].s=p[i].s;r1[k].num=p[i].num;r1[k].w=p[i].w;k++;i++;}
while(j<=end){r1[k].s=p[j].s;r1[k].num=p[j].num;r1[k].w=p[j].w;k++;j++;}
for(int i=str;i<=end;i++){
p[i].s=r1[i].s;
p[i].num=r1[i].num;
p[i].w=r1[i].w;//好像结构体可以整体赋值但这不是咱菜吗qwq
}
} int main(){
scanf("%d %d %d",&n,&r,&q);
for(int i=;i<=*n;i++)
scanf("%d",&p[i].s),p[i].num=i;
for(int i=;i<=*n;i++)
scanf("%d",&p[i].w);
sort(p+,p+*n+,cmp);
for(int i=;i<=r;i++){
for(int j=;j<=*n;j+=){
if(p[j].w>p[j+].w) p[j].s++;else p[j+].s++;//进行两两比较
}
msort(,*n);
}
cout<<p[q].num<<endl;
}

以下是大概是算了我去测试一下(逃 亲测可以不开o2就ac的思路

首先进行一遍sort,然后优化在于这里的思路只需要进行一次归并排序:

将比赛的输赢分别记录在一个数组中,赢的人记录在一起(win),输的人记录在一起(lose),并记录人数。因为一次比赛最多对每个人的成绩更改1,因此整个序列的顺序的波动(尤其当序列很长的时候)不会特别大,这样我们需要排序的数据就少了。对于每次比赛后,我们进行一次优化的归并排序:

  • 两个指针i和j,分别指向的是赢的所有人和输的所有人,当赢的人加上赢得的这一分比分后顺序发生改变,我们就更改这两个数组的顺序,然后将分数较低的继续与下一个比较。直到全部比较完成。
  • 这样归并就省去了排子区间的时间,而是直接对这一个区间进行排序,就不会T掉了;

以下附链接吧(咱也不能投人家的代码是吧,但是咱也不想写自己的代码)

关于瑞士轮(P1309)以及引申出来的种种问题

end-

【洛谷p1309】瑞士轮的更多相关文章

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

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

  2. 洛谷 P1309 瑞士轮 解题报告

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

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

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

  4. 洛谷 P1309 瑞士轮

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

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

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

  6. 洛谷P1309 瑞士轮

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

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

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

  8. 洛谷 P1309 瑞士轮 题解

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

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

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

  10. P1309 瑞士轮 (吸氧了)

    P1309 瑞士轮 题解 1.这题可以模拟一下 2.sort吸氧可以过(可能是排序有点慢吧,不开会T) sort排序时注意: return 1 是满足条件,不交换 return 0是不满足,交换 代码 ...

随机推荐

  1. 【leetcode】838. Push Dominoes

    题目如下: 解题思路:本题题目中有一点要求很关键,“we will consider that a falling domino expends no additional force to a fa ...

  2. rocketmq特性(features)

    # 特性(features) 1 订阅与发布 消息的发布是指某个生产者向某个topic发送消息:消息的订阅是指某个消费者关注了某个topic中带有某些tag的消息,进而从该topic消费数据. 2 消 ...

  3. HDU 3613 Best Reward ( 拓展KMP求回文串 || Manacher )

    题意 : 给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串,那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果不是回文串,那么这串价值就为0.问 ...

  4. linux ubantu php composer安装

    root@iZwz93telmwbh624e5zetqZ:~# php -v PHP 5.6.40-14+ubuntu16.04.1+deb.sury.org+1 (cli) Copyright (c ...

  5. 【CF1249D】Too Many Segments(贪心,set,vector)

    题意:给定n条线段和覆盖上限k,每条线段都覆盖了区间内的整点 问最少删掉几条线段能使所有的整点都被覆盖不超过k次 k<=n<=2e5,l[i],r[i]<=2e5 思路:比赛时候不会 ...

  6. Miniprofiler在目中使用报 mini-profiler-resources/includes.js 404错误

    原因,没有配置webconfig <system.webServer> <modules> <remove name="FormsAuthentication& ...

  7. 3D Computer Grapihcs Using OpenGL - 04 First Triangle

    本节将绘制一个三角形 先看最终代码: MyGlWindow.cpp: #include <gl\glew.h> #include "MyGlWindow.h" void ...

  8. D - Cheerleaders(第三周)

    D - Cheerleaders 题目链接:https://vjudge.net/contest/154063#problem/D 题目大意: 给你一个 n∗m 的方格,现在有 k 个相同石子,我们要 ...

  9. which statement is true for the class java.util.ArrayList?

    A.集合中的元素是有序的   对 B.集合被保证为不可变的  错 C.集合中的元素被保证为唯一的  错  有序的 所以不唯一 D.集合中的元素使用一个唯一的键来存取   错   没有键 E.集合中的元 ...

  10. 使用java操作elasticsearch之与es简历连接

    Elasticsearch 的 Java 客户端非常强大:它可以建立一个嵌入式实例并在必要时运行管理任务. 运行一个 Java 应用程序和 Elasticsearch 时,有两种操作模式可供使用.该应 ...