山东省acm省赛 D题Swiss-system tournetment

来源:互联网 发布:信捷触摸屏编程手册 编辑:程序博客网 时间:2024/05/04 14:09
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> using namespace std; struct node{int index,score,rank;}*a=(node *)malloc(sizeof(node)*200005),*b=(node *)malloc(sizeof(node)*200005); int num,r,q,num1[100005],num2[100005]; bool cmp(node a,node b) {  if(a.score==b.score)   return a.rank<b.rank;  else   return a.score>b.score; } void mergearray(node a[], int first,int last,node temp[]) {  int i = 0,j =0;  int m =num>>1,   n = num>>1;  int k = 0;  while (i <m && j <n)  {   if (cmp(a[num1[i]],a[num2[j]]))       temp[k++] = a[num1[i++]];   else       temp[k++]=a[num2[j++]];  }  while (i <m)   temp[k++] = a[num1[i++]];  while (j <n)   temp[k++] = a[num2[j++]]; } void mergesort(node a[], int first, int last, node temp[]) {  int i,k=0;     for(i=0;i<num;i+=2)  {   if(a[i].index>a[i+1].index)   {       a[i].score++;    num1[k]=i;    num2[k++]=i+1;   }   else   {       a[i+1].score++;    num1[k]=i+1;    num2[k++]=i;   }  }  /*for(i=0;i<k;i++)    cout<<num1[i]<<endl;  for(i=0;i<k;i++)    cout<<num2[i]<<endl;*/  mergearray(a, first,last, temp); } void solve() {  mergesort(a,0,num-1,b);  swap(a,b); } int main() {  int i,t;     scanf("%d",&t);     while(t--&&scanf("%d%d%d",&num,&r,&q)!=EOF)     {   memset(a,0,sizeof(a));         num<<=1;         for(i=0;i<num;i++)         {             scanf("%d",&a[i].score);    //a[i].score=i+1;             a[i].rank=i+1;         }         for(i=0;i<num;i++)   {             scanf("%d",&a[i].index);    //a[i].index=i+1;   }   sort(a,a+num,cmp);   /*for(i=0;i<num;i++)                printf("%d ",a[i].score);             printf("\n");*/         while(r--)         {             memset(b,0,sizeof(b));             solve();            /* for(i=0;i<num;i++)                printf("%d ",a[i].score);             printf("\n");*/         }         printf("%d\n",a[q-1].rank);     }     return 0; }

0 0