首页 > 其他分享 >AT_jsc2019_qual_c Cell Inversion

AT_jsc2019_qual_c Cell Inversion

时间:2024-12-04 15:23:03浏览次数:9  
标签:Inversion 那么 int sum Cntl Cell qual 端点 ans

算法

场上也是把所有需要的性质全部都推出来了, 但是计数类型的底子太差, 直接也是没把答案式子表示出来啊

容易的, 我们可以知道, 对于一个长度为 \(n\) 的序列, 其中每一个 \([l_i, r_i]\) 确定, 那么不管怎样排列, 最终都是合法的
我们还可以知道, 如果每一个点, 作为左端点还是右端点, 那么不管左右端点如何组合, 最终也都是合法的

无论怎样, 就算想的是歪解, 也会在操作过程中发现这两个性质, 这是简单的

那么考虑接下来怎么做, 考场上我的想法是, 令 \(1\) 表示当前点为左端点, \(-1\) 表示当前点为右端点, 那么这个点是白色还是黑色相当于限制了前缀的奇偶性, 特别的, 如果当前点是 \(-1\) , 那么这个点的前缀和不计算这个 \(-1\) , 原因是显然的, 就算这是右端点, 你也还是被取反了一次是吧

那么对于每个点, 取 \(1\) 和 \(-1\) 会产生奇偶性的变化, 显然的, 这样可以确定每个点应该填 \(1\) 还是 \(-1\) , 这以后我的做法就偏差很多了, 当时我在想记忆化搜索??? 本质上是因为没有考虑到这里可以确定 \(1\) 和 \(-1\) 的取值

那么好, 现在我们知道每个点应当取左端点还有右端点, 那么怎么计算一共有多少种配对方式呢?

然后场上的我就开始 \(\rm{dfs}\) 了, 糖

显然的, 我们可以用组合数学的方法来解决这个问题,

记 \(Cntl_i\) 表示 \([0, i]\) 中左端点的出现次数, \(Cntr_i\) 表示 \([0, i]\) 中右端点的出现次数, \(pos_i\) 表示第 \(i\) 个右端点的位置
对于每一个右端点, 我们显然可以取 \({Cntl}_{i - 1} - {Cntr}_{i - 1}\) 种左端点

那么显然的, 最终的答案式子可以写成:

\[n! \times \prod_{i = 1}^{{Cntr}_{n}} \left(Cntl_{pos_i - 1} - i + 1\right) \]

至此, 可以通过本题

代码

#include <bits/stdc++.h>
const int MOD = 1e9 + 7;
const int MAXN = 1e5 + 20;

int n;

int main()
{
    int t;
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
        std::string Col;
        std::cin >> Col;

        long long ans = 1;
        for (int i = 1; i <= n; i++)
            ans = ans * i % MOD;

        std::vector<int> a(2 * MAXN);
        for (int i = 0; i < 2 * n; i++)
            a[i] = (Col[i] == (i % 2 ? 'B' : 'W'));
        int sum = 0;
        for (int i = 0; i < 2 * n; i++) {
            if (!a[i])
                ++sum;
            else {
                ans = ans * sum % MOD;
                --sum;
            }
        }
        if (sum != 0) // 左右端点数量不等
            ans = 0;
        printf("%lld\n", ans);
    }
}

总结

推了很多, 卡在一个地方, 可以考虑统筹所有信息再来一遍

组合数学要多练

标签:Inversion,那么,int,sum,Cntl,Cell,qual,端点,ans
From: https://www.cnblogs.com/YzaCsp/p/18586408

相关文章

  • javabean重写equals和hashcode方法的作用
    Javabean重写equals()方法主要是为了实现自定义的对象比较。这个方法在Java集合框架和双列集合中扮演了关键角色;HashMap和HashSet底层原理是哈希表结构,依赖hashcode方法和equals方法保证键的唯一没有重写equals和hashcode方法:实体类比较的是地址值,map集合是根据地址值判断......
  • aspose.cells java导出pdf 所有列打印在一页上
    importcom.aspose.cells.PdfSaveOptions;//importcom.aspose.pdf.PdfSaveOptions;importlombok.val;importjava.io.InputStream;publicclassPdfHelper{publicstaticvoidConvertXlsxToPdf(StringsourceFileName,StringtargetFileName,StringtargetFil......
  • [Design Pattern] Encapsulate a network request lib - 1. DIP: Dependence Inversio
    ThreelayersdesignLowlevelimplementationLayer:usinglowlevelimplementationtocompletebasicoperation.Forthenetworkrequest,wecanusethelibsuchasaxios,whichinternallyusing xhr,orwecanalsouse fetchdirectlyfromnode.jsreque......
  • 用什么代替html5中不再支持table的cellspacing和cellpadding属性?
    在HTML5中,cellspacing和cellpadding属性确实不再被支持。要用CSS来实现相同的效果,主要依靠border-spacing和padding属性。1.cellspacing的替代方案:border-spacingcellspacing控制表格单元格之间的间距。在CSS中,可以使用border-spacing属性应用于<table>元素......
  • Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    CellebriteUFED4PC7.71(Windows)-Android和iOS移动设备取证软件TheIndustryStandardforLawfullyAccessingandCollectingDigitalData请访问原文链接:https://sysin.org/blog/cellebrite-ufed/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgC......
  • Cellebrite UFED 4PC 7.70 (Windows) - Android 和 iOS 移动设备取证软件
    CellebriteUFED4PC7.70(Windows)-Android和iOS移动设备取证软件TheIndustryStandardforLawfullyAccessingandCollectingDigitalData请访问原文链接:https://sysin.org/blog/cellebrite-ufed/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgC......
  • Let'sGoFurther - Chapter 19: Building, Versioning and Quality Control
     $makemigrationname=create_example_table run:gorun./cmd/apipsql:psql${GREENLIGHT_DB_DSN}migration:@echo'Creatingmigrationfilesfor${name}...'migratecreate-seq-ext=.sql-dir=./migrations${name}up:......
  • AT_nikkei2019_2_qual_d Shortest Path on a Line 题解
    洛谷题目传送门AT题目传送门博客园可能食用更佳学校内部模拟赛出了这题,顺便来写下题解。惊奇的发现题解区居然全是建图跑最短路,这怎么行,所以这一篇题解并没有跑任何最短路,而是使用了线段树优化DP。考虑将建边区间按右端点从小到大排序,每次以右端点为枚举编号,记作\(x\),发......
  • CF2039E - Shohag Loves Inversions
    CF2039E-ShohagLovesInversions题面有一个整数数组\(a=[0,1]\),可以重复执行以下操作任意多次:假设\(k\)是当前数组\(a\)中的逆序对的个数。将\(k\)插入\(a\)中的任意位置,包括开头或结尾。例如,如果是\(a=[4,6,2,4]\),那么逆序对数就是\(k=3\)。因此,......
  • C# ClosedXML 导出 Excel 添加下拉选项 CellDropdown
    注意string左右两边引号不能省略privatevoidAddCellDropdown(stringpath){//使用ClosedXML打开Excel文件using(varworkbook=newXLWorkbook(path)){//Shee1页面varworksheet1=workbook.Worksh......