[CF1408F] Two Different - 构造
Description
你需要选择 \(q\) 个二元组 \((x_i,y_i)\),每次使得 \(a_{x_i}\) 和 \(a_{y_i}\) 的值变为 \(f(a_{x_i},a_{y_i})\)。\(f(x,y)\) 的值为任意值,对于相同的 \(x,y\),\(f(x,y)\) 的值相同,请你找出一种可能使得对于任意函数 \(f\) 经过 \(q\) 次操作后数列中最多只有 \(2\) 个不同的数。
Solution
推平一个长度为 \(2^k\) 的区间,可以简单递归构造
若 \(n \neq 2^k\),我们先推平前 \(2^k\) 个,再推平后 \(2^k\) 个
#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<pair<int, int>> ans;
void solve(int l, int r)
{
if (r - l + 1 == 2)
{
ans.push_back({l, r});
}
else
{
int len = r - l + 1;
solve(l, (l + r) / 2);
solve((l + r) / 2 + 1, r);
for (int i = l; i < l + len / 2; i++)
ans.push_back({i, i + len / 2});
}
}
signed main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
if (n == 1)
{
cout << 0 << endl;
return 0;
}
int lg = log2(n);
int k = 1 << lg;
solve(1, k);
if (n > k)
{
solve(n - k + 1, n);
}
cout << ans.size() << endl;
for (auto [x, y] : ans)
cout << x << " " << y << endl;
}