首页 > 其他分享 >CF1876D Lexichromatography记录

CF1876D Lexichromatography记录

时间:2023-12-17 20:45:46浏览次数:37  
标签:记录 ++ 染色 equal CF1876D times int Lexichromatography 序列

CF1876D Lexichromatography

题目链接:https://codeforces.com/problemset/problem/1876/D

题意

给一个 $n$ 个数的数组 $a$ 染色,每个元素被染为红色或蓝色。求满足下面两个条件的染色方案数:

  1. 将蓝色和红色的数分别取出成为两个数列,则蓝色序列字典序小于红色序列。
  2. 任意一个子数组中,任意一个数 $x$ 被染色为蓝色和红色的次数相差不大于 $1$。

解法(官解)

首先分析第二个条件,不难发现它等价于条件“任意一个数 $x$ 被交替染色”。则任意一个数第一次出现时的颜色决定了之后所有出现的颜色,因此满足第二个条件的方案数为 $2^c$ ($c$ 为数组中不同元素的个数)。

下面在满足第二个条件的前提下讨论第一个条件。对于任意一个染色方案,将染色对调,仍然满足第二个条件;因此“蓝色序列字典序小于红色序列”和反之的方案数有一一对应关系。由于字典序是全序,答案就等于 $\dfrac{2^c - equal}{2}$,$equal$ 为“蓝色序列字典序等于红色序列”,即两序列相同的方案数。

下面考虑如何计算 $equal$。

首先构造一种两序列相同的方案。对每次加入一个数,模拟两个序列的变化:

  • 如果这个数不是待匹配的数,将这个数放在更长的序列中,作为待匹配的数(否则,若将其放在较短的序列中,它一定无法与对应的数匹配)。
  • 否则将其放在较短序列中,尝试与较长序列对应的数匹配。若匹配失败,说明不存在合法的构造。

考虑如何对合法构造进行计数。在上面的构造中,我们始终把待匹配的数放在更长的序列中。但当两个序列的长度相等时,将数放在两个序列均可以(当然,若这个数在前面存在,只能放在上一次出现的相反序列中)。因此,以两序列长度相同为分界点,对数组分段;构造一个图,每一段与其中出现过的数字连边,就有 $equal = 2^d$($d$ 为连通分量数)。

代码实现(C++)

constexpr int M = 200000;
void solve() {
    int n;
    cin >> n;
    vector<int> vis(M + 1), a, b;
    UnionFindSet ufs(n + M + 1);
    int cnt = 0, times = 0, block_idx = 1;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        if (!vis[x]++) { cnt++, times++; }
        ((vis[x] % 2) ? a : b).push_back(x);
        times -= ufs.merge(block_idx + M, x);
        if (a.size() == b.size()) times++, block_idx++;
    }
    Z res = Z(2).pow(cnt);
    if (a == b) { res -= Z(2).pow(times); }
    cout << res / 2 << "\n";
}

标签:记录,++,染色,equal,CF1876D,times,int,Lexichromatography,序列
From: https://www.cnblogs.com/cpchenpi/p/17909737.html

相关文章

  • C#读写SQL Server的操作,仅作为记录
    publicstaticstringconnStr="Server=127.0.0.1;Database=WJB;UserId=sa;Password=XXXXXX";///<summary>///根据SQL语句返回所查询的DataTable对像,有参数///</summary>///<paramname="sql">SQL语句</param>///<paramname=&qu......
  • CF1906K Deck-Building Game记录
    CF1906KDeck-BuildingGame题目链接:https://codeforces.com/problemset/problem/1906/K题意有大小为$n$的多重集$A$。求找到两个不相交子集,使它们各自的异或和相等的方案数。很容易将其转换为求如下值:$$\sum_{S\subsetA}2^{|S|}\cdot[\oplus_{x\inS}x=0]$$......
  • CF1879F Last Man Standing记录
    CF1879FLastManStanding题目链接:https://codeforces.com/problemset/problem/1879/F题意简述有$n$位英雄,每位英雄都有护甲值$a$和生命值$h$。对一次伤害值为$x$的游戏,每位英雄的存活时间为$t=\lceila/x\rceil\cdoth$。游戏进行无数次,伤害值从$1$到无穷。......
  • 训练属于自己的大模型LM Studio使用记录
    LMStudio支持本地运营大模型下载地址: https://lmstudio.ai/一搜索下载管理安装之后打开,搜索对应大模型,下载,举例:baichuan点击左侧菜单栏文件夹图标进行管理二聊天点击左侧菜单栏聊天图标,新建聊天,输入框输入内容可能对回答的结果并不满意,我们可以点击结果后面的......
  • 【电子公文系统】维护和更新记录
    更新记录更新版本发布日期更新内容更新类型1.0.12023-11-15修复登录模块的安全漏洞。安全修复1.1.02023-11-20添加文档共享功能。功能添加1.1.12023-11-30优化页面设计页面优化1.2.02023-12-05更新用户界面设计。功能更新1.2.12023-12-12修......
  • 个人优化 Github Pages 博客网站访问速度记录
    使用GithubPages可以方便地搭建自己的静态网站,详细过程参考我的这篇文章。使用hugo和GithubPages搭建个人博客但由于众所周知的原因,此方法搭建的博客在国内访问速度不佳。因此考虑采用一些方法来加速访问,主要思路是使用CDN加速网站的静态资源。对于不同的静态资源,......
  • 2023最新中级难度CSS面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-中级难度CSS面试题合集问:描述一下CSS的作用和重要性。CSS(CascadingStyleSheets)是一种用于定义网页元素外观和表现的样式表语言,它对于网页设计至关重要。CSS的主要作用有以下几点:样式控制:通过CSS,开发者可以为网页上的文本、图像和其......
  • 2023最新高级难度CSS3面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-高级难度CSS3面试题合集问:解释一下CSS3中的动画关键帧(@keyframes)和它们是如何工作的。CSS3中的动画关键帧(@keyframes)是一个强大的特性,它允许开发者创建复杂的动画效果。通过定义一组关键帧,可以控制元素在动画过程中的不同状态。工作原......
  • 2023最新中级难度CSS3面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-中级难度CSS3面试题合集问:描述一下你对CSS盒模型的理解。CSS盒模型是一种用于描述元素布局和大小的方式。在HTML中,每个元素都可以看作是一个矩形框,这个框由内容(content)、填充(padding)、边框(border)和外边距(margin)组成。内容(Content):这......
  • 在星光2使用RTL8811CU无线网卡的记录
    在星光2使用RTL8811CU无线网卡的记录1.硬件和软件基础条件硬件:StarFiveVisionFive2v1.3BCPU:JH71104CoresRISCV64GCMEM:4GBDisk:SandiskUltra32GBMicro-SDCard无线网卡:COMFASTCF-811AC802.11ac无线网卡无线网卡芯片:RTL8811CU无线网卡USB信息:0bda:c811Linu......