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

相关文章:

  • 2022-12-23
  • 2021-08-23
  • 2021-10-25
  • 2021-06-12
  • 2021-06-14
  • 2022-12-23
  • 2021-08-18
  • 2022-12-23
猜你喜欢
  • 2021-12-12
  • 2022-12-23
  • 2021-07-10
  • 2022-12-23
  • 2022-12-23
  • 2021-09-10
  • 2021-08-31
相关资源
相似解决方案