星感代码求调焦(团队题,玄关)
  • 板块学术版
  • 楼主___STAR___
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/9/18 18:31
  • 上次更新2024/9/18 21:06:13
查看原帖
星感代码求调焦(团队题,玄关)
947848
___STAR___楼主2024/9/18 18:31

比赛(gaming)

题目描述

⼀年⼀度的校园歌⼿⼤赛开始了,今年⼀共有nn个选⼿参与了⽐赛,分别编号为1n1到n ,每 个⼈的唱功可以⽤数字aia_i来量化,保证a1ana_1到a_n互不相同。

今年赛事委员会决定让⽐赛变得更刺激⼀点,于是采⽤了以下的赛制:

编号为2d+12d+1的选⼿和编号为2d+22d+2的选⼿会通过对唱来PK(dd 为整数),唱功更 ⾼的选⼿(即aia_i更⼤的选⼿)获胜,晋级下⼀轮。如果nn为奇数,则编号为nn的选⼿ 轮空,直接晋级。这⼀轮所有淘汰的选⼿,其最终名次就是第n2+1\left \lceil \frac{n}{2}+1 \right \rceil 名。

所有晋级的选⼿重新编号1n21到\left \lceil \frac{n}{2}\right \rceil ,继续下⼀轮。

直到剩下⼀个选⼿,Ta就是歌⼿⼤赛的冠军,其名次也就是第11 名。

唱功不错的⼩ B 却惨遭⼀轮游,原因是第⼀轮遇到的对⼿最后获得了冠军。 所以他为了向赛事委员会说明这个⽐赛规则的不合理性,他想对于每⼀个ii,求出如果初始编 号为ii的选⼿能在第⼀次被淘汰的那⼀场⽐赛获胜晋级,他最终能得到什么名次。

输入格式

第 ⾏包含⼀个正整数nn,表⽰选⼿数量。

第 ⾏包含nn个正整数a1,a2,...,ana_1,a_2,...,a_n 表⽰每⼀位选⼿的唱功。

输出格式

包含⼀⾏nn个整数,含义如题。

样例 #1

样例输入 #1

10
3 9 6 12 15 24 30 18 27 21

样例输出 #1

4 3 4 2 4 2 1 4 1 2

提示

样例解释

第⼀轮选⼿[39612152430182721]\left [ 3,9,6,12,15,24,30,18,27,21 \right ]

第⼆轮[912243027]\left [ 9,12,24,30,27\right ]

第三轮[123027]\left [ 12,30,27 \right ]

第四轮[3027]\left [ 30,27 \right ]

第五轮[30]\left [ 30 \right ]

对于选⼿22,他第⼀次被淘汰在第⼆轮,若获胜,则第三轮选⼿是[9,30,27]\left [ 9,30,27\right ] ,所以选⼿22 最后的名次变成了33

数据范围 对于所有数据 n5×105,ai109n≤5×10^5,a_i≤10^9,并且互不相同。

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n;
int a[N],b[N];
map<int,int> mp,mp1;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		mp[a[i]]=i;
	}
	for(int i=1;i<=n;i++) b[i]=a[i];
	for(int i=1;i<=n;i++)
	{
		int num=n;
		bool pd=false;
		for(int j=1;j<=n;j++)
		{
			a[j]=b[j];
		}
		bool pd1=false;
//		cout<<a[i]<<"---\n";
		while(num>1)
		{
			int cnt=0;
			pd1=false;
			for(int j=1;j<=num;j+=2)
			{
				if(a[j]==b[i]||a[j+1]==b[i])
				{
//					cout<<pd<<"\n";
					if(b[i]>a[j]||b[i]>a[j+1])
					{
						a[++cnt]=b[i];
					}
					else if(!pd)
					{
							pd=true;
							a[++cnt]=a[j];
							a[++cnt]=a[j+1];
					}
					else
					{
						pd1=true;
						cout<<num/2+1<<" ";
						break;
					}
				}
				else
				{
					a[++cnt]=max(a[j],a[j+1]); 
				}
			}
//			cout<<"\n";
//			for(int j=1;j<=cnt;j++) cout<<a[j]<<" ";
//			cout<<"\n";
			if(pd1)
			{
				break;
			}
			if(num%2==1) a[++cnt]=a[num];
			num=cnt;
		}
		if(!pd1) cout<<1<<" ";
	}
}
2024/9/18 18:31
加载中...