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;
    }
    
  • 相关阅读:
    jQuery..1..基本使用..选择
    ORZ各路神犇
    马上搞定Android平台的Wi-Fi Direct开发
    Linux环境下搭建Android开发环境
    笑谈接口回调
    AIDL通信原理
    某个Java面试题
    直接下载SpringBoot项目本地的Excel文件
    用JSP做后台管理系统
    Singleton
  • 原文地址:https://www.cnblogs.com/mollnn/p/14659067.html
Copyright © 2011-2022 走看看