首页 > 其他分享 >[ARC117E] Zero-Sum Ranges 2题解

[ARC117E] Zero-Sum Ranges 2题解

时间:2023-11-24 17:34:05浏览次数:40  
标签:ARC117E int 题解 sum 元素 Ranges leq MAXN

题解

前言

个人认为官方题解写得最为详细、干净、清楚,如果有意向阅读外文版的题解的话,还是推荐去读一读:

Editorial - AtCoder Regular Contest 117

本文属于转载(?),有一些自己的思考过程,希望有帮助。

题意

有多少个长度为 \(2N\) 的序列 \(A\) 满足:

  • 序列\(A\) 包含 \(N\) 个 \(+1\) 和 \(N\) 个 \(-1\)。
  • 刚好有 \(K\) 对下标 \(l,r(1\leq l<r\leq 2N)\),满足 \(\sum\limits_{i=l}^{r} = 0\),我们把形如 \([l,r]\) 这样的区间称为“零和区间”。

给出 \(N,K\),求满足条件的序列个数。

\(1\leq N\leq 30,1\leq K\leq N^2\)。

分析

Part 1

我们考虑用最暴力的做法,那就是二进制枚举 \(A\) 的状态。然后枚举 \(l,r\) 采用前缀和相减判断是否为零和区间。

时间复杂度:\(O(2^n)\),预计:34 pts。

Part 2

显然 Part 1 的做法超时,那我们能不能得到一些启发呢?

显然是前缀和。

我们期望得到的是 \(sum_r-sum_{l-1}=0\),实际上,我们也就是想得到 \(sum_r=sum_{l-1}\)。由于原数组为 \(\pm 1\),所以当我们把前缀和数组看做是关于 \(i\) 的函数 \(sum_i\) 的话,得到的图像,必定是每一段都为 45° 的折线图。而起点与终点都将是 \(0\)。

我们可以想象一条 \(y=k\) 的一条横线从上往下扫。我们就可以分别考虑放置所有二维平面上的点了。

我们发现两个相等且“相邻”的元素之前是可以放下一个或多个更小的元素的。“相邻”怎么解释?“相邻”代表着当只考虑当前的元素 \(y\) 与大于 \(y\) 的元素时,如果两个元素 \(y\) 之间没有再多一个元素 时,则称之为“相邻”。我们把“相邻”的元素之间的空隙,称之为“洞”。

如果考虑到当前这个“洞”(下文不再加括号),我们先考虑当前要放的元素都是相同的值。

那就可以自然地想到采用 dp。

设 \(f[x][y][z]\) 表示放了 \(x\) 个元素,得到了 \(y\) 个零和区间,还有 \(z\) 个洞的方案数。

如何转移?设当前放进洞里的元素数量为 \(p\),则转移方程为:

\[f[x][y][z]\to f[x+p][y+C_p^2][p-(z+2)] \]

\[\Downarrow \]

\[f[x][y][z]\to f[x+p][y+\frac{p\times(p-1)}{2}][p-(z+2)] \]

为什么剩下的洞的数量是 \(p-(z+2)\) 呢?因为原来有 \(z\) 个洞,每个洞需要放一个元素,同时最左边与最右边又需要各放一个元素,就共放了 \(z+2\) 个元素。

在此基础上,每多放一个元素,就可以多增加一个洞。自然就是 \(p-(z+2)\)。

值得一提的是,上式并没有采用等号连接,因为方程还需要再乘上一个 \(C_{p-1}^{z+1}\)(读者自证)。所以方程应该是这样:

设 \(x'=x+p,y'=y+\frac{p(p-1)}{2},z'=p-(z+2)\),则

\[f[x'][y'][z']=\sum\limits_{x,y,z} f[x][y][z]\times C_{p-1}^{z+1} \]

最后答案需要记录 \(x\) 轴上、下方的贡献,总共就是

\[ans=\sum\limits_{x,y,z} f[x][y][z]\times f[2n-x][k-y][z-1] \]

至于为什么是 \(z-1\) 呢?这个显然,请读者联系一下上图思考。(提示,\(x\) 轴下方可以翻转过来相似地考虑。)

到这里就结束了,可以开码了。

时空复杂度:\(O(n^5)\),预计:100 pts。

代码

马蜂有点抽象,将就看看吧(

code

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

#define int long long

const int MAXN = 60 + 5, MAXM = 1800 + 5;

int n, m;
int f[MAXN][MAXM][MAXN];
int ans;
int c[2 * MAXN + 5][2 * MAXN + 5];

signed main() {
    scanf("%lld%lld", &n, &m);

    for (int i = 0; i <= 2 * n; i++) {
        c[i][0] = 1;
        for (int j = 1; j <= i; j++) {
            if (j != i)
                c[i][j] += c[i - 1][j];
            c[i][j] += c[i - 1][j - 1];
        }
    }

    for (int i = 1; i <= n + 1 && i * (i - 1) / 2 <= m; i++) f[i][i * (i - 1) / 2][i - 1] = 1;

    for (int i = 1; i <= 2 * n + 1; i++) {
        for (int j = 0; j <= m; j++) {
            for (int k = 0; k <= n; k++) {
                if (f[i][j][k] == 0)
                    continue;
                for (int p = k + 2; i + p <= 2 * n + 1 && p <= n + 1; p++) {
                    if (j + p * (p - 1) / 2 > m)
                        break;
                    f[i + p][j + p * (p - 1) / 2][p - (k + 2)] += f[i][j][k] * c[p - 1][k + 1];
                }
            }
        }
    }

    ans = f[2 * n + 1][m][0];
    for (int i = 0; i <= 2 * n + 1; i++) {
        for (int j = 0; j <= m; j++) {
            for (int k = 1; k <= n; k++) {
                ans += f[i][j][k] * f[2 * n + 1 - i][m - j][k - 1];
            }
        }
    }

    printf("%lld\n", ans);

    return 0;
}

标签:ARC117E,int,题解,sum,元素,Ranges,leq,MAXN
From: https://www.cnblogs.com/wang-holmes/p/17854299.html

相关文章

  • P9779_[HUSTFC 2023] 不定项选择题_题解
    #[rt](https://www.luogu.com.cn/problem/P9779)#题目#####有一道共n个选项的不定项选择题,它的答案至少包含一个选项,由于题目与选项的内容晦涩难懂,你打算通过尝试每一种可能的答案来通过这道题。#####初始时所有选项都没有被勾选,你可以执行任意次下述操作:-###勾选一个当前......
  • 【题解 P2839】 middle
    [国家集训队]middle题目描述一个长度为\(n\)的序列\(a\),设其排过序之后为\(b\),其中位数定义为\(b_{n/2}\),其中\(a,b\)从\(0\)开始标号,除法下取整。给你一个长度为\(n\)的序列\(s\)。回答\(Q\)个这样的询问:\(s\)的左端点在\([a,b]\)之间,右端点在\([c,d]\)......
  • CF1864D 题解
    我们注意到对如图倒三角形上的所有点操作都会影响到目标点。那么我们可以维护两个前缀和,第一个前缀和表示如下的点是否操作第二个前缀和表示这些点是否操作这样我们求出了前缀和之后,将两个前缀和异或一下就知道该点是否要操作了。#include<bits/stdc++.h>usingnamespace......
  • apache ftpserver服务器安装及服务启动问题解决
     在安装apacheftpserver后作为系统服务启动时遇到不能启动成功的问题,在网上各种搜索,发现很多人也遇到了同样的问题,折腾了1天,尝试了添加dll动态链接库、tomcat.exe替换ftpd.exe等还是没搞定。最后查看服务安装脚本service.bat,发现问题所在,现记录下过程中遇到的坑,分享出来参考,避......
  • Vue + Element UI 实现复制当前行数据功能(复制到新增页面组件值不能更新等问题解决)
    1、需求使用Vue+ElementUI实现在列表的操作栏新增一个复制按钮,复制当前行的数据可以打开新增弹窗后亦可以跳转到新增页面,本文实现为跳转到新增页面。2、实现1)列表页index.vue<el-table><!--其他列--><el-table-columnlabel="操作"width="150"><templateslot-s......
  • Vue + Element UI 实现复制当前行数据功能(复制到新增页面组件值不能更新等问题解决)
    1、需求使用Vue+ElementUI实现在列表的操作栏新增一个复制按钮,复制当前行的数据可以打开新增弹窗后亦可以跳转到新增页面,本文实现为跳转到新增页面。2、实现1)列表页index.vue<el-table><!--其他列--><el-table-columnlabel="操作"width="150"><templateslot-scope=......
  • centos7下开机磁盘报错不能进去liunx系统问题解决
    报错如下: centos7开机可以看到xfs(dm-0)磁盘报错,只有centos7自带修复磁盘,命令进行修复。xfs_repair-v-L/dev/dm-0然后等待输出done字样,代表修复完成。如果执行上条命令报错,可以先卸载找执行修复。 umount-l/dev/sda2然后执行修复,之后重启服务器。然后输入reboo......
  • 电脑网站支付报错“验签出错,建议检查签名字符串或私钥与应用公钥是否匹配”问题解决记
    在对接支付宝电脑网站支付的时候,遇到如下报错:“错误代码invalid-signature错误原因:验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配”。但展示的报错内容跟实际原因有所出入(在下文中有解答),这里记录下问题的解决排查过程。问题复现在对接电脑网站支付时,生成form表单......
  • 题解 NOIP2021 方差
    原题我认为这道题非常困难码量并不大可是需要很多次思维跳跃题意题意概述:给定非严格递增序列\(a_{n}\)可以进行若干次操作,求序列方差的最小值的\(n^2\)倍方差的定义为\(D=\frac{1}{n}\sum_{i=1}^{n}{(a_i-\bara)}^2\),其中\(\bara=\frac{1}{n}\sum_{i=1}......
  • VS 调试 提示 Lc.exe已退出 代码为-1问题解决方法
    找到程序项目下Properties文件夹licenses.licx文件,然后右键选择删除就可以了,调试运行正常了 https://jingyan.baidu.com/article/b24f6c822592b686bfe5daac.html......