[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 eq 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;
}