A. Find Array
题目描述
给定 n,找到满足以下所有条件的任何整数数组 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an:
- 对于从 1 到 n 的每个 i,
- 1 ≤ a i ≤ 1 0 9 1≤a_i≤10^9 1≤ai≤109。
-
a
1
<
a
2
<
…
<
a
n
a_1<a_2<…<a_n
a1<a2<…<an 对于从 2 到 n 的每个 i,
a
i
a_i
ai 不能被
a i − 1 a_i−1 ai−1 整除。
可以证明这样的数组在问题的约束下总是存在的。
输入
第一行包含测试用例数 t (1≤t≤100)。 测试用例的描述如下。
每个测试用例的唯一一行包含一个整数 n (1≤n≤1000)。
保证所有测试用例的 n 之和不超过 1 0 4 10^4 104。
输出
对于每个测试用例,打印 n 个整数 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an——你找到的数组。 如果有多个数组满足所有条件,则打印其中任何一个。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
const int maxn=1e6+5;
void solve(){
int n;
cin >> n;
int a[n];
for (int i = 2; i < n + 2; i++)
{
a[i - 1] = i;
cout << a[i - 1] << " ";
}
cout << endl;
}
int main(){
ios::sync_with_stdio(0);
int t;
cin >> t ;
while(t--){
solve();
}
return 0;
}
B. Build the Permutation
题目描述
给定三个整数 n,a,b。 确定是否存在从 1 到 n 的整数的置换 p 1 , p 2 , . . . , p n p_1,p_2,...,p_n p1,p2,...,pn,使得:
恰好存在一个整数 i,其中 2 ≤ i ≤ n − 1 2≤i≤n-1 2≤i≤n−1,使得 p i − 1 < p i > p i + 1 p_{i-1}<p_i>p_{i+1} pi−1<pi>pi+1(换句话说,恰好有一个局部最大值)。
正好有 b 个整数 i,其中 2 ≤ i ≤ n − 1 2≤i≤n−1 2≤i≤n−1,使得 p i − 1 > p i < p i + 1 p_{i-1}>p_i<p_{i+1} pi−1>pi<pi+1(换句话说,正好有 b 个局部最小值)。
如果存在这样的排列,请找出任何这样的排列。
输入
输入的第一行包含一个整数 t (1≤t≤104)——测试用例的数量。 测试用例的描述如下。
每个测试用例的唯一一行包含三个整数 n、a 和 b( 2 ≤ n ≤ 1 0 5 , 0 ≤ a , b ≤ n 2≤n≤10^5,0≤a,b≤n 2≤n≤105,0≤a,b≤n)。
所有测试用例的 n 之和不超过 1 0 5 10^5 105。
输出
对于每个测试用例,如果请求的属性没有排列,则输出 -1。
否则,打印您找到的排列。 如果有多个这样的排列,您可以打印其中的任何一个。
code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
const int maxn = 1e6 + 5;
int p[100010];
ll a, b, n;
void solve(){
cin >> n >> a >> b;
for (int i = 1; i <= n; i++)
p[i] = i;
if (abs(a - b) > 1 || a + b > n - 2){
cout << "-1\n";
return;
}
if (a == b)
for (int i = 1; i <= a; i++)
swap(p[2 * i], p[2 * i + 1]);
else if (a < b)
for (int i = 1; i <= b; i++)
swap(p[2 * i - 1], p[2 * i]);
else
for (int i = 1; i <= a; i++)
swap(p[n - 2 * i + 2], p[n - 2 * i + 1]);
for (int i = 1; i <= n; i++)
cout << p[i] << ' ';
cout << '\n';
}
int main(){
ios::sync_with_stdio(0);
int t;
cin >> t;
while (t--){
solve();
}
return 0;
}
C. Game Master
题目描述
n n n 个玩家正在玩游戏。
游戏中有两张不同的地图。对于每个玩家,我们都知道他在每张地图上的实力。当两个玩家在特定地图上战斗时,该地图上实力较高的玩家总是获胜。没有两个玩家在同一张地图上拥有相同的实力。
您是游戏大师并想组织一场比赛。总共会有 n − 1 n-1 n−1场战斗。当锦标赛中的玩家不止一名时,选择任意一张地图和任意两名剩余玩家在该地图上进行战斗。失败的玩家将被淘汰出比赛。
最后,只剩下一名球员,他将被宣布为锦标赛的获胜者。为每个玩家确定他是否能赢得比赛。
输入
第一行包含一个整数 t ( 1 ≤ t ≤ 100 ) t (1≤t≤100) t(1≤t≤100)——测试用例的数量。测试用例的描述如下。
每个测试用例的第一行包含一个整数 n ( 1 ≤ n ≤ 1 0 5 ) n (1≤n≤10^5) n(1≤n≤105)——玩家数量。
每个测试用例的第二行包含 n 个整数 a 1 , a 2 , … , a n ( 1 ≤ a i ≤ 1 0 9 , a i ≠ a j f o r i ≠ j ) a_1,a_2,…,a_n (1≤a_i≤10^9, a_i≠a_j for i≠j) a1,a2,…,an(1≤ai≤109,ai=ajfori=j),其中 a i a_i ai 是第 i i i个玩家在第一张地图上的实力。
每个测试用例的第三行包含 n 个整数 b 1 , b 2 , … , b n ( 1 ≤ b i ≤ 1 0 9 , b i ≠ b j f o r i ≠ j ) b_1,b_2,…,b_n(1≤b_i≤10^9,b_i≠b_j for i≠j) b1,b2,…,bn(1≤bi≤109,bi=bjfori=j),其中 b i b_i bi 是第二张地图上第 i i i 个玩家的实力。
保证所有测试用例的 n n n 之和不超过 1 0 5 10_5 105。
输出
对于每个测试用例打印一个长度为 n n n 的字符串。如果第 i i i 个玩家可以赢得比赛,第 i i i 个字符应为“1”,否则为“0”。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
const int N=1e5+10;
struct point {
int x,y;
int id;
int type;
}a[N];
bool cmp(point a,point b){
return a.x<b.x;
}
bool cmp2(point a,point b){
return a.id<b.id;
}
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x;
a[i].id=i;
a[i].type=0;
}
for(int i=1;i<=n;i++){
cin>>a[i].y;
}
sort(a+1,a+1+n,cmp);
int temp=a[n].y;
int minn=temp;
int ans=n;
for(int i=n-1;i>=1;i--){
minn=min(minn,a[i].y);
if(a[i].y>=temp){
temp=min(minn,temp);
ans=i;
}
}
for(int i=n;i>=ans;i--){
a[i].type=1;
}
sort(a+1,a+1+n,cmp2);
for(int i=1;i<=n;i++) cout<<a[i].type;
cout<<endl;
}
int main(){
ios::sync_with_stdio(0);
int t;
cin >> t ;
while(t--){
solve();
}
return 0;
}