首页 > 其他分享 >[ARC187B] Sum of CC

[ARC187B] Sum of CC

时间:2024-11-18 16:29:18浏览次数:1  
标签:连通 le CC Sum ans int ARC187B include mod

题意

给定一个长为 \(n\) 的序列,\(a_i \in [1, m]\) 对于所有 \(1 \le i < j \le n\) 且 \(a_i \le a_j\) 则对 \((i, j)\) 连无向边。

求对于给定序列 \(b\) 所有的 -1 替换为 \([1, m]\) 的所有情况所连成的图连通块个数之和。

\(n, m \le 2000\)。

Sol

唐完了。

首先注意到连通块都是区间,不会证。

所以显然只需要考虑每个相邻的两个点没有边时连通块增加的贡献即可。

考虑 \((i, i + 1)\) 什么情况下没有边,注意到当前当且仅当: \(\min_{l = 1} ^ {i - 1} > \max_{l = i + 1} ^ n\)。

然后你直接枚举分界点,枚举前面一段的最小值,剩下的直接组合算出来就做完了。

复杂度:\(O(n m \log)\)。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
    int p = 0, flg = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-') flg = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        p = p * 10 + c - '0';
        c = getchar();
    }
    return p * flg;
}
void write(int x) {
    if (x < 0) {
        x = -x;
        putchar('-');
    }
    if (x > 9) {
        write(x / 10);
    }
    putchar(x % 10 + '0');
}
bool _stmer;

const int N = 2e3 + 5, mod = 998244353;

int pow_(int x, int k) {
    int ans = 1;
    while (k) {
        if (k & 1) ans = 1ll * ans * x % mod;
        x = 1ll * x * x % mod;
        k >>= 1;
    }
    return ans;
}

void Mod(int &x) {
    if (x >= mod) x -= mod;
    if (x < 0) x += mod;
}

array <int, N> s, pre, suf, isl;

bool _edmer;
int main() {
    cerr << (&_stmer - &_edmer) / 1024.0 / 1024.0 << "MB\n";
    int n = read(), m = read();
    pre[0] = 2e9;
    for (int i = 1; i <= n; i++) {
        s[i] = read(), isl[i] = isl[i - 1];
        if (~s[i]) pre[i] = min(pre[i - 1], s[i]);
        else pre[i] = pre[i - 1], isl[i]++;
    }
    for (int i = n; i; i--)
        suf[i] = max(suf[i + 1], s[i]);
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        if (pre[i] <= suf[i + 1])
            continue;
        for (int j = suf[i + 1] + 1; j <= min(pre[i], m); j++) {
            if (j == pre[i])
                ans += 1ll * pow_(m - j + 1, isl[i]) * pow_(j - 1, isl[n] - isl[i]) % mod, Mod(ans);
            else if (isl[i])
                ans += 1ll * (pow_(m - j + 1, isl[i]) - pow_(m - j, isl[i]) + mod) % mod * pow_(j - 1, isl[n] - isl[i]) % mod, Mod(ans);
        }
    }
    write(ans), puts("");
    return 0;
}

标签:连通,le,CC,Sum,ans,int,ARC187B,include,mod
From: https://www.cnblogs.com/cxqghzj/p/18552980

相关文章

  • MFC CChartCtrl 滚轮缩放
    原文来自:MFC그래프라이브러리,ChartCtrl마우스휠기능추가BOOLCChartCtrl::OnMouseWheel(UINTnFlags,shortzDelta,CPointpt){ScreenToClient(&pt);doubleMinVal=0;doubleMaxVal=0;doublerate=0.1;if(m_bZoomEnabled){......
  • gcc/g++ 使用技巧
    使用技巧常用选项MakeFileGDB调试多进程调试多线程调试常用选项1.基本编译选项-o<output_file>指定输出文件名(可执行文件或目标文件)。g++-omy_programmain.cpp→生成名为my_program的可执行文件-c只编译源代码为目标文件(不链接)。g++-cmain.cpp......
  • wincc 7.5SP2下VBA编程学习练习15:批量删除变量
    在前面练习的基础上学习批量删除变量。新建下面的脚本:SubDeleteTags()'批量删除变量DimhmigoAshmigoDimstrTagNameAsStringDimiAsIntegerSethmigo=NewhmigoFori=1To5strTagName="Real"&CStr(i)hmigo.DeleteTagstrTagNameNextSethmigo=Nothin......
  • [ARC187B] Sum of CC 题解
    若\(i\)与\(j\)有边,也就是\(a_i<a_j\),那么对于一个\(i<k<j\),会发现\(a_k>a_i\)和\(a_k<a_j\)至少满足一个。也就是说\(k\)也一定和\(i,j\)联通。于是我们发现了一个关键性质:所有联通块都为一个区间。那我们考虑\(i\)和\(i+1\)什么时候不联通:\(i\)之前的任......
  • MoD:轻量化、高效、强大的新型卷积结构 | ACCV'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:CNNMixture-of-Depths论文地址:https://arxiv.org/abs/2409.17016创新点提出新的卷积轻量化结构MoD,在卷积块(Conv-Blocks)内通过动态选择特征图中的关键通道进行集中处理,提高效率。CNNMoD保留了静态计算图,这提高了训......
  • HarmonyOS Next 椭圆曲线密码学应用:ECC 与 SM2 深入剖析
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、引言在现代密码学领域,椭圆曲线密......
  • WINCC 7.5SP2下VBA创建变量组、变量1
    今晚继续学习Wincc下面使用VBA创建变量分组,分组下创建多个变量。新浪审核有点慢,我在这里先发表了。在变量管理中新建一个S7连接,配置好连接参数,这个不能通过VBA创建。 打开wincc页面,在VBA编辑器下写下面的脚本: Subaddtags()DimhmigoAshmigoDimstrTagGroupAsStringD......
  • neovim 配置 LSP(ccls)
    本文主要介绍如何在nvim中配置使用ccls。安装与配置首先安装LSP管理插件:...--省略其他行require("lazy").setup({ --LSPmanager "williamboman/mason.nvim", "williamboman/mason-lspconfig.nvim", "neovim/nvim-lspconfig",...--省略其他行})其......
  • R语言数据分析可视化——summarytools包的使用
    R语言中的summarytools包通过提供能够用最少的代码生成数据全面摘要的功能,使数据分析更加简单。summarytools包提供了一种简单的方法来生成数据集的摘要统计信息,包括描述性统计、频率表、交叉表、缺失值、异常值、相关性、线性回归、ANOVA、卡方检验等。本文将介绍如何使用......
  • 2024.11.16 2024 CCPC济南站
    Solved:5/13Penalty:707Rank:101Rank(ucup):200比赛链接A.TheFool题意:给一个\(n\timesm\)的字符串矩阵,有一个字符串和其他不同,求这个字符串的位置。直接模拟即可。#include<bits/stdc++.h>usingnamespacestd;constintN=205;stringa[N];intmain(){ios::s......