Teza Round 1 (Codeforces Round 1015, Div. 1 + Div. 2)
打得不是很好的一把,做出C题的人一大半都做出了D,我没写出来。这个D确实挺简单的。
比赛链接: https://codeforces.com/contest/2084
A
直接猜就行,
cpp
void ChatGptDeepSeek()
{
int n;
cin >> n;
if (n & 1)
{
// n 1 2
cout << n << " ";
for (int i = 1; i <= n - 1; i++)
cout << i << " ";
cout << '\n';
}
else
cout << "-1\n";
}B
我们可以取所有的最小值的倍数的
cpp
void ChatGptDeepSeek()
{
int n;
cin >> n;
vector<ll> a(n + 1);
for (int i = 1; i <= n; i++)
cin >> a[i];
sort(a.begin() + 1, a.end());
ll g = 0;
for (int i = 2; i <= n; i++)
if (a[i] % a[1] == 0)
g = __gcd(g, a[i]);
if (g == a[1])
cout << "Yes\n";
else
cout << "No\n";
}C
发现如果有 $a_i=x $ ,
只有
cpp
void ChatGptDeepSeek()
{
int n;
cin >> n;
vector<int> a(n + 1), b(n + 1);
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = 1; i <= n; i++)
{
cin >> b[i];
}
/*
必然是有 x y
就會有 y x 不然就不行
若n為奇數 則肯定會有一個位置兩邊是相同的 這個一定要放在中間
*/
vector<int> p1(n + 1), p2(n + 1);
for (int i = 1; i <= n; i++)
{
p1[a[i]] = i;
p2[b[i]] = i;
}
{
int cnt = 0;
for (int i = 1; i <= n; i++)
{
if (a[i] == b[i])
cnt++;
if (p1[b[i]] != p2[a[i]])
{
cout << "-1\n";
return;
}
}
if ((n & 1) && cnt > 1)
{
cout << "-1\n";
return;
}
if ((n % 2 == 0) && cnt)
{
cout << "-1\n";
return;
}
}
vector<pair<int, int>> ans;
if (n & 1)
{
for (int i = 1; i <= n; i++)
{
if (a[i] == b[i])
{
if (i != (n + 1) / 2)
{
ans.push_back({i, (n + 1) / 2});
swap(a[i], a[(n + 1) / 2]);
swap(b[i], b[(n + 1) / 2]);
p1[a[i]] = i;
p2[b[i]] = i;
break;
}
}
}
}
for (int i = 1; i <= n / 2; i++)
{
int j = n - i + 1;
if (b[j] != a[i])
{
int k = p1[b[i]];
// swap(k,j)
swap(a[j], a[k]);
swap(b[j], b[k]);
ans.push_back({k, j});
p1[a[k]] = k;
p2[b[k]] = k;
}
// for (int j = 1; j <= n; j++)
// cerr << a[j] << " \n"[j == n];
// for (int j = 1; j <= n; j++)
// cerr << b[j] << " \n"[j == n];
}
// {
// vector c = a;
// reverse(c.begin() + 1, c.end());
// assert(c == b);
// }
cout << ans.size() << '\n';
for (auto [l, r] : ans)
cout << l << " " << r << '\n';
}D
我们如果能将数组分成
cpp
void ChatGptDeepSeek()
{
int n, m, k;
cin >> n >> m >> k;
for (int i = 0; i < n; i++)
cout << i % (n - m * k < k ? k : n / (m + 1)) << " \n"[i + 1 == n];
}