Codeforces Round 939 (Div. 2) D. Nene and the Mex Operator 题解 二进制枚举+递归

飞书日历同步Outlook翻车?我踩过的坑和最终用Google Calendar成功的完整配置记录 本文详细记录了从Outlook日历同步到飞书时遇到的常见问题及解决方案,特别是通过Google Calendar实现稳定同步的完整配置流程。文章揭示了Outlook同步方案易翻车的原因,并提供了Google Calendar的避坑指南、高级技巧和企业级部署建议,帮助用户高效实现日历同步。 阅读详情

Nene and the Mex Operator

题目描述

Nene给了你一个长度为 n n n 的整数数组 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1​,a2​,…,an​ 。

你可以执行以下操作不超过 5 ⋅ 1 0 5 5\cdot 10^5 5⋅105 次(可能为零):

  • 选择两个整数 l l l 和 r r r ,使得 1 ≤ l ≤ r ≤ n 1 \le l \le r \le n 1≤l≤r≤n ,计算 x x x 为 MEX ⁡ ( { a l , a l + 1 , … , a r } ) \operatorname{MEX}(\{a_l, a_{l+1}, \ldots, a_r\}) MEX({al​,al+1​,…,ar​}) ,同时设置 a l = x , a l + 1 = x , … , a r = x a_l=x, a_{l+1}=x, \ldots, a_r=x al​=x,al+1​=x,…,ar​=x 。

这里,整数集合 { c 1 , c 2 , … , c k } \{c_1, c_2, \ldots, c_k\} {c1​,c2​,…,ck​} 中的 MEX ⁡ \operatorname{MEX} MEX 被定义为在集合 c c c 中不出现的最小非负整数 m m m 。

你的目标是最大化数组 a a a 中元素的和。找出最大和,并构建一个操作序列来实现这个和。需要注意的是,你不需要最小化这个序列中的运算次数,你只需在解决方案中使用不超过 5 ⋅ 1 0 5 5\cdot 10^5 5⋅105 的运算。

输入描述

第一行包含一个整数 n n n ( 1 ≤ n ≤ 18 1 \le n \le 18 1≤n≤18 )- 数组 a a a 的长度。

第二行包含 n n n 个整数 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1​,a2​,…,an​ ( 0 ≤ a i ≤ 1 0 7 0\leq a_i \leq 10^7 0≤ai​≤107 )。

输出描述

在第一行中,输出两个整数 s s s 和 m m m ( 0 ≤ m ≤ 5 ⋅ 1 0 5 0\le m\le 5\cdot 10^5 0≤m≤5⋅105 ) - 数组 a a a 元素的最大和以及解决方案中的操作数。

在下面 m m m 行的 i i i -th 中,输出两个整数 l l l 和 r r r ( 1 ≤ l ≤ r ≤ n 1 \le l \le r \le n 1≤l≤r≤n ),代表 i i i -th 运算的参数。

可以证明,数组 a a a 元素的最大和总是可以通过不超过 5 ⋅ 1 0 5 5 \cdot 10^5 5⋅105 次的运算得到。

样例输入1

2
0 1

样例输出1

4 1
1 2

样例输入2

3
1 3 9

样例输出2

13 0

样例输入3

4
1 100 2 1

样例输出3

105 2
3 3
3 4

样例输入4

1
0

样例输出4

1 1
1 1

原题

CF Round 939——传送门

思路

对于任意一段区间 [ l , r ] [l,r] [l,r],我们总能进行一系列操作,使该区间的和为 ( r − l + 1 ) ∗ ( r − l + 1 ) (r-l+1)*(r-l+1) (r−l+1)∗(r−l+1)。所以,由于数组的长度最大为 18 18 18,我们可以通过二进制枚举所有对区间操作的方案数,找到使得和最大的其中一种方案。找到了使和最大的方案后,需要输出对于各个区间的操作。那么我们考虑任意一段区间 [ l , r ] [l,r] [l,r],先将其中所有元素置 0 0 0,因为需要将该区间转化为 { r − l + 1 , r − l + 1 , … , r − l + 1 } \{r-l+1, r-l+1, \ldots, r-l+1\} {r−l+1,r−l+1,…,r−l+1},所以先递归得到 { r − l , r − l , … , r − l , r − l , 0 } \{r-l, r-l, \ldots, r-l , r-l,0\} {r−l,r−l,…,r−l,r−l,0},然后将 [ l , r − 2 ] [l,r-2] [l,r−2]的部分置 0 0 0,进行不断递归,直至区间转化为 { 1 , 2 , 3 , … , r − l , 0 } \{1, 2, 3, \ldots, r-l,0\} {1,2,3,…,r−l,0},然后再对整个区间进行一次操作,即可得到 { r − l + 1 , r − l + 1 , … , r − l + 1 } \{r-l+1, r-l+1, \ldots, r-l+1\} {r−l+1,r−l+1,…,r−l+1}。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

void set_zero(int l, int r, vector<int> &a, vector<pair<int, int>> &ans)
{
    for (int i = l; i <= r; i++)
    {
        if (a[i] != 0)
        {
            ans.push_back({i, i});
        }
    }
}

void set_max(int l, int r, vector<pair<int, int>> &ans)
{
    if (l == r)
    {
        ans.push_back({l, r});
        return;
    }
    for (int k = r - 1; k >= l; k--)
    {
        set_max(l, k, ans);
        if (k != l)
            ans.push_back({l, k - 1});
    }
    ans.push_back({l, r});
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    // 对于任意一段区间[l,r],我们总能进行一系列操作,使该区间的和为 (r-l+1)*(r-l+1)
    // 所以,由于数组的长度最大为18,我们可以通过二进制枚举所有对区间操作的方案数,找到使得和最大的其中一种方案
    int n;
    cin >> n;
    vector<int> a(n);
    for (auto &x : a)
        cin >> x;
    vector<pair<int, int>> op;         // 记录和最大时需要操作的区间
    int max_sum = 0;                   // 记录最大和
    for (int i = 0; i < (1 << n); i++) // 二进制枚举所有区间操作方案,连续的一段1是需要进行区间操作的
    {
        ll sum = 0;                 // 当前方案的总和
        vector<pair<int, int>> tmp; // 当前方案需要操作的区间
        for (int j = 0; j < n;)
        {
            if ((i >> j) & 1)
            {
                int l = j;
                int r = j;
                r++;
                while (r < n && ((i >> r) & 1)) // 找到连续的一段1
                {
                    r++;
                }
                tmp.push_back({l, r - 1});
                sum += (r - l) * (r - l); // 找到的区间为[l,r)
                j = r;
            }
            else
            {
                sum += a[j];
                j++;
            }
        }
        if (sum > max_sum)
        {
            op = tmp;
            max_sum = sum;
        }
    }
    cout << max_sum << ' '; // 输出最大和

    // 那么下面的任务就是输出实现这种方案的所需操作
    vector<pair<int, int>> ans; // 记录所需操作
    // 先将区间元素全部置0
    for (int i = 0; i < op.size(); i++)
    {
        set_zero(op[i].first, op[i].second, a, ans);
    }
    // 再将区间元素全部化为r-l+1
    for (int i = 0; i < op.size(); i++)
    {
        set_max(op[i].first, op[i].second, ans);
    }
    // 输出操作
    cout << ans.size() << '\n';
    for (int i = 0; i < ans.size(); i++)
    {
        cout << ans[i].first + 1 << ' ' << ans[i].second + 1 << '\n';
    }

    return 0;
}
半车(前后、左右)、整车悬架详细推导建模和simulink仿真分析 用达朗贝尔定理依据悬架数学模型,得到悬架模型微分方程,分别用simulink建立前后半车、左右半车悬架;结合转向2自由度模型与半车侧倾模型,对模型考虑相干性、延时性的C级随机路面下,仿真分析给定角阶跃输入下的侧倾稳定性。 阅读详情

相关推荐

手把手教你用TP4056和PMOS管搭建锂电池自动切换电路(含元器件选型指南)

本文详细介绍了如何使用TP4056和PMOS管搭建锂电池自动切换电路,包括核心架构设计、元器件选型指南和PCB布局优化。通过智能充电算法和电源路径切换模块,实现外部供电与锂电池的无缝切换,提升便携式设备的电源管理效率。

julia4scientist的博客 888

Codeforces Round 939 D. Nene and the Mex Operator 【构造、思维、状压】

个人练习记录

m0_73500785的博客 843

maya权重拷贝一对一,一对多

是不是有时候盔甲很多很碎头很大,用代理一个个拷贝很麻烦吧 用下面代码直接运行进行一对多或者一对一拷贝 第一个先选择参考物体,加选其他一堆有的没的有权重或没权重的物体执行一键拷贝,就可以啦 以下是源码送上,带走吧 ------------------------ #! -*- coding:utf -8 -*- #author:liubingdong #date:20...

weixin_30852367的博客 1532

D. Nene and the Mex Operator

mex性质,可以有限步数构造出区间值全为r-l+1

Xing_ke的博客 601

3D Slicer肺部CT病灶体积测量:阈值法实操全流程

在医学影像分析中,病灶体积的精准测量是肿瘤评估、疗效随访和科研统计的重要基础。传统逐层手动勾画不仅耗时,且主观差异大,而基于CT值的阈值分割技术,通过设定灰度区间自动提取目标体素,能够快速生成三维分割结果,具有高效、可重复、边界标准统一的优势,尤其适用于肺部实性结节这类与周围肺实质对比度高的病灶。理解体素与CT值的关系,掌握阈值范围的设定逻辑,并配合连通域分析、边缘修正等工程化操作,即可在3D Slicer中稳定获得可靠的体积数据。本文从技术原理出发,系统梳理了DICOM导入、窗宽窗位调节、阈值选择、三维重

weixin_29050271的博客 251

C语言|深入浅出讲解int转换为float全过程(附2017年统考大题案例)

int转换为float类型为什么会发生精度损失? 精度损失的详细过程究竟是什么样的? 什么样情况float会发生精度损失?没有弄懂2017年浮点数统考大题? 这一篇用2017年统考大题案例帮你更深的理解浮点数的存储规则。

DADONGOOO的博客 1万+

Codeforces1401D题解

题目描述 D. Maximum Distributed Tree time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output You are given a tree that consists of n nodes. You should label each of its n−1 edges with an integer in such way tha

李田所的博客 571

Unity嵌套ScrollView滑动冲突解决方案:ExecuteEvents.Execute事件透传

在Unity UGUI中,竖向与横向ScrollView嵌套时出现滑动失效,本质是EventSystem事件分发机制的拦截限制。其原理在于PointerDown被外层捕获后,后续PointerMove默认不向下透传;ExecuteEvents.Execute提供了一条绕过常规冒泡流程的官方事件旁路,支持低延迟、方向自适应的精准透传。该技术具备高兼容性与零侵入特性,广泛应用于电商商品页、内容流卡片组、多级导航等需‘列表中嵌套轮播/标签’的真实场景,是解决UGUI嵌套滚动问题的核心工程实践方案。

weixin_33164198的博客 632

D. Nene and the Mex Operator - dfs + 位运算枚举

.

m0_75129175的博客 503

二维紧束缚模型求解程序

假如我们已经推导出了二维紧束缚模型的哈密顿量矩阵H(kx,ky)的解析形式,那么在整个布里渊区对角化矩阵就可以得到能带。从技术上说这里面有以下几个问题。 1. 缺少实空间和倒空间的坐标,使得能带难以和布里渊区高对称点对应。 2. 最容易处理的布里渊区是矩形,对于其他多边形,如果全布里渊区mesh画费米面有一定技术困难。 因此一个好的处理框架是首先给出实空间原子坐标,给出实空间哈密顿量,...

wwxy1995的博客 4083

图像标注神器:完全开源免费的多功能标注工具Labelme详解

Labelme是MIT开发的免费开源图像标注工具,支持多边形、矩形等多种标注类型,适用于目标检测、分割等计算机视觉任务。提供Windows可执行文件和Python安装两种方式,可输出JSON格式并转换为COCO等标准数据集。具有跨平台、功能全面、社区活跃等优势,能显著提升标注效率,是AI视觉项目的重要数据准备工具。

数字人生 528

Codeforces Round 939 (Div. 2)D. Nene and the Mex Operator 状压 ,难搞的递归

推荐阅读。

JK01WYX的博客 748

基于Python的IMF经济数据爬取与分析:从入门到实战

本文详细介绍了如何使用Python爬取国际货币基金组织(IMF)的经济数据,包括最新的爬虫技术、反反爬策略、数据解析与存储方法。文章从IMF数据源分析开始,逐步讲解如何构建一个完整的爬虫系统,并提供了详细的代码实现和优化建议。通过本文,读者将掌握爬取复杂国际组织数据的关键技术,并能将这些技术应用于其他类似的数据获取场景。关键词:Python爬虫、IMF数据、经济数据获取、数据清洗、反爬策略IMF Data (data.imf.org) - 主要数据门户。

2201_76125261的博客 1439

Codeforces Round 939 (Div. 2) D. Nene and the Mex Operator

题目求的是你可以得到的最大的数组a的和,操作数,以及具体的操作。举个列子,对于样例3,a数组为:1 100 2 1,我们dfs得到的最佳选择方法为0,0,1,1,就是只对[3,4],这个区间进行mex,最终得到了1,100,2,2。然后,我们可以看到这个题目的n特别小,我们直接暴力求解,2^18才只有262144,用dfs找选择进行mex操作所有区间,每一个元素选与不选,0表示不选,1表示选。注意,如果dfs得到的选择数组是1,0,1,1,那么要进行的mex操作的区间为[1,1],[3,4]。

m0_74123546的博客 755

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Math master (爆搜二进制枚举)

Math master [Link](Problem - D - Codeforces) 题意 给你p,qp,qp,q分别是分子和分母,请你从分子和分母中删除一些数,保证分子和分母删除的数一样且删除完以后的数x/yx/yx/y和原来的数最简形式一样,求这样操作后分子最小的数是什么。 题解 数据范围是2632^{63}263,因此不超过191919位。我们可以二进制暴力枚举分子xxx每一位选不选,再通过最简形式一样搞出来分母yyy,如果$x,y $符合删除的数一样,就判断一下是否可以更新答案即可。 Code

a12377978的博客 1679

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Devu and Flowers(母函数\生成函数-二进制枚举)(Codeforces Round #258-Div. 2-451E)

母函数好题

Mouse_liang的博客 804

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Codeforces 875D High Cry [枚举+二进制]

Codeforces 875D High Cry [枚举+二进制]

ACTerminate的博客 589

Hello 2019 B. Petr and a Combination Lock(二进制枚举 || dfs)

题目链接:http://codeforces.com/contest/1097/problem/B 题意:给你n个数字,让这n个数字相加减,如果是360的倍数或者是0就输出YES,否则输出NO。 思路:二进制枚举每一种状态,或者直接暴力搜索。 二进制枚举: #include&lt;bits/stdc++.h&gt; using namespace std; const int maxn=...

sugarbliss 765

Codeforces Round #772 (Div. 2) D 无限集 二进制枚举 思维

题面 给定一个由 n 个不同的正整数组成的数组 a。 让我们考虑一个无限整数集合 S,它包含所有满足以下条件之一的整数 x: x=ai 对于某些 1≤i≤n。 x=2y+1 且 y 在 S 中。 x=4y 并且 y 在 S 中。 例如,如果 a=[1,2],则 S 中的 10 个最小元素将是 {1,2,3,4,5,7,8,9,11,12}。 找出 S 中严格小于 2的p次方 的元素个数。 由于这个数字可能太大,所以以 109+7 为模打印。 输入 第一行包含两个整数 n 和 p (1≤n,p≤2⋅105)

从你的全世界路过 597

Codeforces - 1225C 二进制位的应用

<Codeforces - 1225C> 位运算 http://codeforces.com/contest/1225/problem/C 题意: 给定n,p,求满足n = (2^a1 + p) + (2^a2 + p) + (2^a3 + p) + ... + (2^ak + p)的最小的k值(a1 ~ ak可以有相等的值)。 例如,n = 24,p = -1,此时k = 4...

FrozenAllen的博客 423

Educational Codeforces Round 105 (Rated for Div. 2)Berland Crossword

一、题意: 有一个n*n的正方形,在四条边上有一定数量的黑点,问是否存在这样的正方形。 二、思路: 当黑点存在于正方形的四个角的位置时,这个黑点会被两条边所占用,所以他会被记录两次。 因为只有四个角,所以可以通过二进制枚举所有的情况,再判断是否存在这样的正方形。(应该可以暴力枚举所有情况,但是我不会QAQ) cpp代码 #include<iostream> #include<cstdio> #include<cstring> #include<string>

cyymeimie的博客 295

【Codeforces】Chloe and the sequence (递归)

题解: 将序列写出来可以发现规律,1 + 2x 的位置值都是 1,2 + 4x 的位置的值都是 2,4 + 8x 的位置的数都是 3,8 + 16x 的位置的数都是 4……,因此按照这个规律就可以知道第k个数是谁了。并且由题意可以知道n到1的数量是逐渐增加的,可以利用递归函数进行取余从n向下查找这个元素是什么。 AC: #include<iostream> #include<cmath> #include<algorithm> using namespace st

skill_Carney的博客 571

Codeforces Round 939 (Div. 2) C. Nene‘s Magical Matrix证明

原题 https://codeforces.com/contest/1956/problem/C官方证明 https://codeforces.com/blog/entry/128426官方的证明前面挺好的,但后面有点跳跃,我说说我的理解,建议结合官方证明看原问题可以转化为:对于一个n*n的矩阵,每次涂色能涂一整行或者一整列,这一行或者一列中必须包含x个白色的,(n-x)个黑色的。只能涂最多2n次,证明最终最多有(nn-xx)个黑块。

weixin_67870448的博客 749

问题描述: 蒜头君有一个长度为 n 的序列 a1,a2,⋯,an,现在他有 m 个问题要问你,每次给你一对 1≤l≤r≤n ,求 al,a(l+1),⋯,ar 的 mex 的值。 mex 的值定义为该...

这道题目需要我们求区间 mex 值,即区间中最小未出现过的自然数。我们可以使用线段树来解决这个问题。 思路如下: 首先建立线段树,对于每个节点维护一个桶,桶的下标为0 ~ n-1的整数,表示这个整数在当前区间中出现过的次数。 对于区间查询,遍历这个区间,找到第一个桶中值为0的整数,即为mex值。 这种算法的时间复杂度为O(nlog(n))。C语言实现代码可以参考给出的代码。 ...

weixin_42601547的博客 327

Codeforces Round 939

Codeforces Round 939

qq_41418557的博客 1123

Codeforces #306 (div2)

A. Two Substrings 题意: 找这个串是否有不重复覆盖的AB和BA 思路: 用AB枚举BA 然后倒过来再做一次 或者找出AB和BA的位置 匹配一下 参考code: 当时逗了 - - 然后就fst了 虽然一改过了 代码比较丑 // // Created by TaoSama on 2015-06-05 // Copyright (c) 2015 TaoSama. All

TaoSama's Microcosm 583
上一篇: Codeforces Round 940 (Div. 2) and CodeCraft-23 D. A BIT of an Inequality
下一篇: 洛谷 P3379 [模板] 最近公共祖先(LCA)
bbc_ouo
博客等级 码龄3年 2096粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值