首页 > 其他分享 >题解 CF1742G

题解 CF1742G

时间:2023-02-16 16:58:49浏览次数:39  
标签:int 题解 long CF1742G 二进制位 max 序列 我们

题目描述:

给你一个序列 \(A\),要求将 \(A\) 重新排序,使得序列 \(A\) 的前缀或和序列 \(B\) 的字典序最大。

题目分析:

这道题我们首先考虑一个性质,就是前缀或和序列 \(B\) 总是存在一个位置 \(j\),使得 \(j\) 前面形成的子序列单调递增,\(j\) 及其后面形成的子序列保持不变。

此时,我们根据上面的性质,不难得出如下结论:

  1. \(j\) 前面的序列我们只需要保证它们或起来是不断变大的就行
  2. \(j\) 后面的序列我们可以随便乱放,因为此时它们不改变或起来的值。

那么,这个神奇的位置 \(j\) 应该为多少呢,根据上述结论,我们不难看出,\(j\) 的最大值应为 \(\lceil \lg a_{\max} \rceil\),这一条结论的证明是显然的,理由如下:

因为算术操作“按位或”是没有进位的,且保证两个数按位或起来一定大于等于原先的两个数,故两个数按位或起来,其结果的二进制位数取决于两个数中较长的那个数的位数。并且,我们无法找出一个二进制位数比另个一大但数值比另一个小的两个数。所以我们可以证明,序列 \(A\) 中的最大值 \(a_{\max}\) 的二进制位数,就是我们要找的 \(j\) 的最大值。

然后就是对于 \(b_1\) 的讨论了,如果我们想要保证其字典序最大,则我们就需要保证 \(0 \operatorname{or} a_i\) 最大。我们运用大眼观察法,不难看出,\(b_1\) 的值为 \(a_{\max}\)。

根据上述内容,我们不难得出以下贪心算法:

  1. 对原数组进行降序排序,将降序排序后的最大值(也就是 \(a_1\) )直接加入答案中。
  2. 循环 \(\lceil \lg a_{\max} \rceil\) 次,每次遍历序列 \(A\),将此时 \((now \operatorname{or} a_i)_{\max}\) 中的 \(a_{\max}\) 加入答案,并将 \(a_{\max}\) 删除(也就是标记为已使用)。
  3. 将剩下还没有删除的 \(a_i\) 直接加入到答案中。

此时,我们不难看出,该方法的时间复杂度为 \(O(n\lg a)\),可以通过此题。

代码实现:

#include <bits/stdc++.h>
#define dbg(x) cerr<<#x<<": "<<x<<endl;
#define int long long
#define MAX_SIZE (int)2e5
using namespace std;

signed main() {
    ios::sync_with_stdio(false);
#ifdef LOCAL
    freopen("in.in", "r", stdin);
    freopen("out.out", "w", stdout);
    double c1 = clock();
#endif
    //============================================
    int T;
    cin >> T;

    while (T--) {
        int n;
        cin >> n;
        int a[MAX_SIZE] = {};

        for (int i = 1; i <= n; i++)
            cin >> a[i];

        sort(a + 1, a + 1 + n, [](int a, int b) {
            return a > b;
        });
        vector <int> ans;
        unsigned long long now = a[1];
        ans.push_back(a[1]);
        a[1] = -1;

        for (int i = 30; i >= 1; i--) {
            unsigned long long maxnow = now;
            int nowpos = 1;

            for (int j = 2; j <= n; j++) {
                if (maxnow < (now | a[j]) && a[j] != -1) {
                    nowpos = j;
                    maxnow = now | a[j];
                }
            }

            if (a[nowpos] != -1) {
                now = maxnow;
                ans.push_back(a[nowpos]);
                a[nowpos] = -1;
            }
        }

        for (int i = 2; i <= n; i++)
            if (a[i] != -1)
                ans.push_back(a[i]);

        for (auto v : ans)
            cout << v << ' ';

        cout << endl;
    }

    //============================================
#ifdef LOCAL
    double c2 = clock();
    cerr << "Used Time: " << c2 - c1 << "ms" << endl;

    if (c2 - c1 > 1000)
        cerr << "Warning!! Time Limit Exceeded!!" << endl;

    fclose(stdin);
    fclose(stdout);
#endif
    return 0;
}

标签:int,题解,long,CF1742G,二进制位,max,序列,我们
From: https://www.cnblogs.com/larry76/p/17127347.html

相关文章

  • 题解 CF1739B
    题目大意:有一个非负整数序列\(A\),定义序列\(D\)是序列\(A\)的绝对值差分序列,问给定序列\(D\),能否求出唯一的序列\(A\),若不能,输出\(-1\),否则输出序列\(A\)。题目......
  • 题解 CF1401C
    题目大意:给定一序列\(A\),定义当且仅当\(\gcd(a_i,a_j)=a_{min}\)时,元素\(a_i\)和\(a_j\)可以交换。问当前给定的序列\(A\)能否转化为非严格单调递增的序列。题......
  • 题解 CF1292A
    题目大意:给你\(2\timesn\)的迷宫,初始时没有任何障碍,给定\(q\)次询问,每次询问给予坐标\((x,y)\),问将坐标\((x,y)\)反转状态(即无障碍变有障碍,有障碍变无障碍)后,该迷......
  • 题解 CF916C
    题目大意:要求构造一张图,并让该图满足以下条件:有\(n\)个点,\(m\)条边。每条边的边权范围是\([1,10^9]\)。图中从\(1\)到\(n\)的最短路径长度是个质数。最小生......
  • 题解 CF277A
    题目大意:有\(n\)名员工,一共有\(m\)种语言,每名员工都会其中\(k_i\)种语言(\(m\ge\boldsymbol{k_i\ge0}\)),现规定两名员工可以交流的条件如下:两名员工会一种及以......
  • 题解 CF980B
    前言:关于原题目中的“旅馆”这一用词,个人感觉用起来十分不畅,于是下文中将会用“障碍物”一词来代指旅馆。题目大意:有一座\(4\timesn\)的矩阵,然后让你放置障碍物......
  • MASA Stack 1.0 发布会 —— 社区问题解答
    MASAStack1.0圆桌讨论Q1: 全职开源的团队,你们的收入是什么?1.首先感谢我们的金主朗诗德公司,朗诗德是一家大型的净水器研发、生产、销售的公司,我们的产品也在朗诗德公......
  • ABC222H 题解
    很久之前我问joke3579有没有什么水黑,然后他给我了这个题。小推一波。题解看到这种东西首先找找有没有什么性质。简单分析可以得出一棵美丽的\(n\)阶二叉树一定满足如......
  • zfs 之 `label is missing` 问题解决方法.
    具体报错信息status:Oneormoredevicescouldnotbeusedbecausethelabelismissingorinvalid.Sufficientreplicasexistforthepooltocontinue......
  • abc289F 题解
    某人vp时10min口胡了这道题,然后调了两天,第一天卡在WA4,第二天WA7WA10交相辉映,心态快崩了,因此写了这篇题解。\(a=b\)处理有借鉴这篇题解。firstobservation......