zoukankan      html  css  js  c++  java
  • [CF1408F] Two Different

    [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;
    }
    
  • 相关阅读:
    MongoVUE 使用教程
    Mongo
    thinkPHP
    从关系型数据库到非关系型数据库
    boost 文件系统
    boost 随机数发生器
    CString/string 区别及其转化
    boost uuid
    使用命令行解析php文件
    Log4PHP日志库使用
  • 原文地址:https://www.cnblogs.com/mollnn/p/14659067.html
Copyright © 2011-2022 走看看