NOIP 2011 普及組 複賽 swiss 瑞士輪
阿新 • • 發佈:2019-02-19
#include <stdio.h>
struct node{
int i;//序號
int f;//分數
int w;//實力
}p[200000+100],a[200000+100],b[200000+20],p_t;//此處p[100000+100]提交錯了後四個測試點。
int n;
void quicksort1(int left,int right){//f自大到小排序
int i=left,j=right;
int mid=p[(i+j)/2].f;
while(i<=j){
while(p[i].f>mid)
i++;
while(p[j].f<mid)
j--;
if(i<=j){
p_t=p[i];
p[i]=p[j];
p[j]=p_t;
i++;
j--;
}
}
if(left<j)
quicksort1(left,j);
if(i<right)
quicksort1(i,right);
}
void quicksort2(int left,int right){//i自小到大排序
int i=left,j=right;
int mid=p[(i+j)/2].i;
while(i<=j){
while(p[i].i<mid)
i++;
while(p[j].i>mid)
j--;
if(i<=j){
p_t=p[i];
p[i]=p[j];
p[j]=p_t;
i++;
j--;
}
}
if(left<j)
quicksort2(left,j);
if(i<right)
quicksort2(i,right);
}
void mergesort(){
int i,j,k,ai=1,bi=1;//筆誤,此處寫成bi=2查了會 ,此處筆誤提交10分
for(i=1;i<=2*n-1;i+=2)
if(p[i].w>p[i+1].w){
p[i].f+=1;
a[ai++]=p[i];//贏
b[bi++]=p[i+1];//輸
}else{
p[i+1].f+=1;
a[ai++]=p[i+1];//贏
b[bi++]=p[i];//輸
}
//歸併排序
i=1;
j=1;
k=1;
while(i<ai&&j<bi)
if(a[i].f>b[j].f)
p[k++]=a[i++];
else if(a[i].f<b[j].f)
p[k++]=b[j++];
else if(a[i].f==b[j].f)
if(a[i].i<b[j].i)
p[k++]=a[i++];
else
p[k++]=b[j++];
while(i<ai)
p[k++]=a[i++];
while(j<bi)
p[k++]=b[j++];
}
int main(){
int r,q;
int i,j,k;
scanf("%d%d%d",&n,&r,&q);
for(i=1;i<=2*n;i++){
p[i].i=i;
scanf("%d",&p[i].f);
}
for(i=1;i<=2*n;i++)
scanf("%d",&p[i].w);
//第一次排序,採用快速排序
quicksort1(1,2*n);
j=1;
while(j<=2*n){//同分,按序號由小到大排序
k=1;
while(j+1<=2*n&&p[j].f==p[j+1].f){
j++;
k++;
}
if(k>1)
quicksort2(j-k+1,j);
j++;
}
//r輪,採用歸併排序思想排序
for(i=1;i<=r;i++){//r輪
mergesort();
}
printf("%d\n",p[q].i);
return 0;
}
2017-3-28
struct node{
int i;//序號
int f;//分數
int w;//實力
}p[200000+100],a[200000+100],b[200000+20],p_t;//此處p[100000+100]提交錯了後四個測試點。
int n;
void quicksort1(int left,int right){//f自大到小排序
int i=left,j=right;
int mid=p[(i+j)/2].f;
while(i<=j){
while(p[i].f>mid)
i++;
while(p[j].f<mid)
j--;
if(i<=j){
p_t=p[i];
p[i]=p[j];
p[j]=p_t;
i++;
j--;
}
}
if(left<j)
quicksort1(left,j);
if(i<right)
quicksort1(i,right);
}
void quicksort2(int left,int right){//i自小到大排序
int i=left,j=right;
int mid=p[(i+j)/2].i;
while(i<=j){
while(p[i].i<mid)
i++;
while(p[j].i>mid)
j--;
if(i<=j){
p_t=p[i];
p[i]=p[j];
p[j]=p_t;
i++;
j--;
}
}
if(left<j)
quicksort2(left,j);
if(i<right)
quicksort2(i,right);
}
void mergesort(){
int i,j,k,ai=1,bi=1;//筆誤,此處寫成bi=2查了會 ,此處筆誤提交10分
for(i=1;i<=2*n-1;i+=2)
if(p[i].w>p[i+1].w){
p[i].f+=1;
a[ai++]=p[i];//贏
b[bi++]=p[i+1];//輸
}else{
p[i+1].f+=1;
a[ai++]=p[i+1];//贏
b[bi++]=p[i];//輸
}
//歸併排序
i=1;
j=1;
k=1;
while(i<ai&&j<bi)
if(a[i].f>b[j].f)
p[k++]=a[i++];
else if(a[i].f<b[j].f)
p[k++]=b[j++];
else if(a[i].f==b[j].f)
if(a[i].i<b[j].i)
p[k++]=a[i++];
else
p[k++]=b[j++];
while(i<ai)
p[k++]=a[i++];
while(j<bi)
p[k++]=b[j++];
}
int main(){
int r,q;
int i,j,k;
scanf("%d%d%d",&n,&r,&q);
for(i=1;i<=2*n;i++){
p[i].i=i;
scanf("%d",&p[i].f);
}
for(i=1;i<=2*n;i++)
scanf("%d",&p[i].w);
//第一次排序,採用快速排序
quicksort1(1,2*n);
j=1;
while(j<=2*n){//同分,按序號由小到大排序
k=1;
while(j+1<=2*n&&p[j].f==p[j+1].f){
j++;
k++;
}
if(k>1)
quicksort2(j-k+1,j);
j++;
}
//r輪,採用歸併排序思想排序
for(i=1;i<=r;i++){//r輪
mergesort();
}
printf("%d\n",p[q].i);
return 0;
}
2017-3-28