4 solutions

  • 1
    @ 2026-8-24 16:05:21

    100分写法:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+10;
    struct Node{
    	int sc;
    	int w;
    	int id;
    }s[N],q1[N],q2[N];
    bool cmp(Node a,Node b){
    	if(a.sc>b.sc) return 1;
    	if(a.sc==b.sc&&a.id<b.id) return 1;
    	return 0;
    }
    int main(){
    	int n,r,q;
    	cin>>n>>r>>q;
    	for(int i=1;i<=2*n;i++) cin>>s[i].sc;
    	for(int i=1;i<=2*n;i++){
    		cin>>s[i].w;
    		s[i].id=i;
    	}
    	sort(s+1,s+2*n+1,cmp);
    	while(r--){
    		for(int i=1;i<=2*n;i+=2){
    			if(s[i].w>s[i+1].w){
    				s[i].sc++;
    			}else{
    				s[i+1].sc++;
    			}
    		}
    		sort(s+1,s+2*n+1,cmp);
    	}
    	cout<<s[q].id;
    	return 0;
    }
    
    
    • 1
      @ 2024-6-11 13:33:24

      快排(RNlogNRNlog^N 60pts)

      • 进行瑞士轮模拟,每次比较以后调用快速排序规则进行排序。
      #include<bits/stdc++.h>
      using namespace std;
      const int N=2e5+10;
      struct Node{
          int sc;
          int w;
          int id;
      }s[N],q1[N],q2[N];
      bool cmp(Node a,Node b) //排序规则
      {
          if(a.sc>b.sc) return 1;
          if(a.sc==b.sc&&a.id<b.id) return 1;
          return 0;
      }
      int main()
      {
          int n,r,q;
          cin>>n>>r>>q;
          for(int i=1;i<=2*n;i++) cin>>s[i].sc;
          for(int i=1;i<=2*n;i++)
          {
              cin>>s[i].w;
              s[i].id=i;
          }
          sort(s+1,s+2*n+1,cmp); //排序
          while(r--)
          {
              for(int i=1;i<=2*n;i+=2) //按照瑞士轮规则进行比较
              {
                  if(s[i].w>s[i+1].w)
                  {
                      s[i].sc++;
                  }
                  else
                  {
                      s[i+1].sc++;
                  }
              }
              sort(s+1,s+2*n+1,cmp); //比较完了以后重新排名
          }
          cout<<s[q].id;
          return 0;
      }
      

      快排+归并(NlogN+RNNlogN+RN)

      • 首轮进行快速排序,然后在后面模拟瑞士轮的时候进行胜者组和败者组,然后对胜者组和败者组进行归并排序的归并过程。
      #include<bits/stdc++.h>
      using namespace std;
      const int N=2e5+10;
      struct Node{ //结构体
          int sc;
          int w;
          int id;
      }s[N],q1[N],q2[N]; //q1为胜者组,q2为败者组
      bool cmp(Node a,Node b) //排序
      {
          if(a.sc>b.sc) return 1;
          if(a.sc==b.sc&&a.id<b.id) return 1;
          return 0;
      }
      int main()
      {
          int n,r,q;
          cin>>n>>r>>q;
          for(int i=1;i<=2*n;i++) cin>>s[i].sc;
          for(int i=1;i<=2*n;i++)
          {
              cin>>s[i].w;
              s[i].id=i;
          }
          sort(s+1,s+2*n+1,cmp); //首轮排序
          while(r--)
          {
              int x=0,y=0; //生成组和败者组初始化
              for(int i=1;i<=2*n;i+=2) //模拟瑞士轮
              {
                  if(s[i].w>s[i+1].w)
                  {
                      s[i].sc++;
                      q1[++x]=s[i];
                      q2[++y]=s[i+1];
                  }
                  else
                  {
                      s[i+1].sc++;
                      q1[++x]=s[i+1];
                      q2[++y]=s[i];
                  }
              }
              x=1,y=1; //开始合并
              int k=1;
              while(x<=n&&y<=n) //合并
              {
                  if(cmp(q1[x],q2[y]))
                  {
                      s[k++]=q1[x++];
                  }
                  else s[k++]=q2[y++];
              }
              while(x<=n) s[k++]=q1[x++]; //合并剩余的胜者组
              while(y<=n) s[k++]=q2[y++]; //合并剩余的败者组
          }
          cout<<s[q].id;
          return 0;
      }
      
      • 0
        @ 2024-9-16 16:30:47
        #include<bits/stdc++.h>
        using namespace std;
        const int N=1e6+10;
        struct Participator{
        	int score,force,id;
        }p[N];
        bool cmp(Participator x,Participator y)
        {
        	if(x.score>y.score) return true;
        	return false;
        }
        int main()
        {
        	int n,r,q;
        	cin>>n>>r>>q;
        	for(int i=1;i<=n*2;i++)
        	{
        		cin>>p[i].score; 
        	}
        	for(int i=1;i<=n*2;i++)
        	{
        		cin>>p[i].force;
        		p[i].id=i;
        	}
        	sort(p+1,p+2*n+1,cmp);
        	while(r--)
        	{
        		vector<Participator> winner,loser;
        		for(int i=1;i<=2*n;i+=2)
        		{
        			if(p[i].force>p[i+1].force)
        			{
        				p[i].score++;
        				winner.push_back(p[i]);
        				loser.push_back(p[i+1]);
        			}
        			else
        			{
        				p[i+1].score++;
        				winner.push_back(p[i+1]);
        				loser.push_back(p[i]);
        			}
        		}
        		int cnt=1,cnt1=0,cnt2=0;
        		while(cnt1<n&&cnt2<n)
        		{
        			if(winner[cnt1].score>loser[cnt2].score)
        			{
        				p[cnt++]=winner[cnt1];
        				cnt1++;
        			}
        			else 
        			{
        				p[cnt++]=loser[cnt2];
        				cnt2++;
        			}
        		}
        		while(cnt1<n)
        		{
        			p[cnt++]=winner[cnt1];
        			cnt1++; 
        		}
        		while(cnt2<n)
        		{
        			p[cnt++]=loser[cnt2];
        			cnt2++; 
        		} 
        	}
        	cout<<p[q].id;
        	return 0;
        }
        
        • -2
          @ 2024-7-18 16:25:27
          #include<bits/stdc++.h>
          using namespace std;
          const int N=1e8+10;
          int n,r,q;
          struct PII{
          	int li;
          	int x;
          	int i;
          }a[N];
          void run(PII x,PII y){
          	if(x.li>y.li) x.x++;
          	else y.x++;
          }
          bool Sort(PII x,PII y){
          	if(x.x>y.x) return 1;
          	if(x.x==y.x && x.i<y.i) return 1;
          	return 0;
          }
          int main(){
          	cin>>n>>r>>q;
          	n*=2;
          	for(int i=1;i<=n;i++){
          		cin>>a[i].x;
          		a[i].i=i;
          	}
          	for(int i=1;i<=n;i++) cin>>a[i].li;
          	sort(a+1,a+1+n,Sort);
          	while(r--){
          		for(int i=1;i<=n;i+=2) run(a[i],a[i+1]);
          		sort(a+1,a+1+n,Sort);
          	}
          	cout<<a[q].i;
              return 0;
          }
          
          • 1

          Information

          ID
          435
          Time
          1000ms
          Memory
          128MiB
          Difficulty
          8
          Tags
          # Submissions
          72
          Accepted
          13
          Uploaded By