[ARC117E]Zero-Sum Ranges 2
令$sum_{i}=\sum_{j=1}^{i}a_{j}$,即要求其满足:
1.$sum_{0}=sum_{2n}=0$且$\forall 1\le i\le 2n,|sum_{i}-sum_{i-1}|=1$
2.$\sum_{0\le i<j\le 2n}[sum_{i}=sum_{j}]=k$
问题即询问有多少个这样的$sum_{i}$
换一个角度来看待此问题,将所有$sum_{t}\ge i$的位置取出,并构成一个子序列,显然剩下的位置即在其中若干个数之间插入一些小于$j$的数字
不难发现,只有在相邻两个$i$之间或在$i>0$时的开头和结尾才能插入(且必须要插入),其余相邻两数必然在原序列中也是相邻的
由此,即可以dp,令$f_{i,j,k,l}$表示有多少个长为$sum_{t}\ge i$、长为$j$、相等的对数为$k$、有$l$对相邻的$i$的序列数,转移枚举加入的$i-1$的个数$x$,即$f_{i-1,j+x,k+{x\choose 2},x-(l+2[i>0])}=\sum {x-1\choose l+2[i>0]-1}f_{i,j,k,l}$
(其中关于$x-(l+2[i>0])$,首先$i-1$至少要在每一个能插入的位置都插入,即$l+2[i>0]$个位置,接下来每一个多出来的$x$都可使得相邻对数加1,即此式,组合数类似)
关于初始状态,需要枚举最大值$max\ge 0$以及其个数$tot$,即$f_{max,tot,{tot\choose 2},tot-1}=1$
关于最终答案,同样枚举最小值$min\le 0$,即$\sum f_{min,2n+1,k,0}$
时间复杂度即为$o(n^{6})$,空间上对其第一维滚动,可以优化到$o(n^{4})$
这一做法在常数较为优秀时(大概)可以通过,但并不足够好
考虑其中第一维,事实上后面的转移与第一维的关系并不大(仅仅是$i>0$与$i\le 0$分类),且$i$的枚举范围如果增大并没有实际意义,其可以看作完全背包关于数量的枚举
换言之,可以通过顺序枚举其余位置,来代替$i$的枚举,复杂度降为$o(n^{5})$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 65
4 #define ll long long
5 int n,m;
6 ll ans,c[N][N],f[N][N*N][N];
7 int main(){
8 scanf("%d%d",&n,&m);
9 for(int i=0;i<N;i++){
10 c[i][0]=c[i][i]=1;
11 for(int j=1;j<i;j++)c[i][j]=c[i-1][j-1]+c[i-1][j];
12 }
13 for(int i=1;i<=n+1;i++)f[i][c[i][2]][i-1]=1;
14 for(int i=1;i<=2*n+1;i++)
15 for(int j=0;j<=m;j++)
16 for(int k=0;k<i;k++)
17 for(int x=k+2;x<=2*n+1-i;x++)
18 if (j+c[x][2]<=m)f[i+x][j+c[x][2]][x-(k+2)]+=c[x-1][k+1]*f[i][j][k];
19 for(int i=1;i<=2*n+1;i++)
20 for(int j=0;j<=m;j++)
21 for(int k=1;k<i;k++)
22 for(int x=k;x<=2*n+1-i;x++)
23 if (j+c[x][2]<=m)f[i+x][j+c[x][2]][x-k]+=c[x-1][k-1]*f[i][j][k];
24 printf("%lld",ans+f[2*n+1][m][0]);
25 }
[ARC117E]Zero-Sum Ranges 2的更多相关文章
- sysbench的安装与使用(with MySQL)
sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试. 项目主页: http://sysbench.sourceforge.net/ 安装文档htt ...
- sysbench压力测试工具简介和使用(一)
sysbench压力测试工具安装和参数介绍 一.sysbench压力测试工具简介: sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据 ...
- 使用sysbench进行压力测试
sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试.数据库目前支持MySQL/Oracle/PostgreSQL/Drizzle,它主要包括以下几 ...
- 【MySQL】Sysbench性能测试
两台MySQL配置不一样,要测试下性能差别 [m1] long_query_time = 0.1 log_slave_updates innodb_flush_log_at_trx_commit [m ...
- sysbench做测试
安装的时候需要libtool,如果已经装了CP到sysbench的目录下 1:用法 sysbench [general-options]… –test=<test-name> [test- ...
- MySQL性能测试工具sysbench的安装和使用
sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有MySQL.Oracle和PostgreSQL.当前 ...
- sysbench压力测试工具安装和参数介绍
一.sysbench压力测试工具简介: sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有MySQL. ...
- sysbench 压力测试工具
一.sysbench压力测试工具简介: sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有MySQL. ...
- sysbench相关
Sysbench工具是集系统测试和数据库测试一体的测试工具,但是传统的sysbench在数据库测试方面,没有遵循TPC-C测试模型,仅仅支持单个表的数据.而在实际的业务场景中,业务逻辑复杂的多.开源的 ...
- 使用 sysbench对mysql进行压力测试介绍之一
sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试.数据库目前支持MySQL/Oracle/PostgreSQL.本文只是简单演示一下几种测试的用 ...
随机推荐
- PostgreSQL 大小写问题 一键修改表名、字段名为小写
标准的SQL是不区分大小写的.但是PostgreSQL对于数据库中对象的名字允许使用支持大小写区分的定义和引用方法.方式就是在DDL中用双引号把希望支持大小的对象名括起来.比如希望创建一个叫AAA的表 ...
- 破解安装pyhotn
1.网址 https://www.jetbrains.com/pycharm/download/#section=windows,打开页面,点击下载专业版 2.这是下载好的文件,双击运行即可. //详 ...
- pycharm输入代码后,没有补全提示
安装pycharm后,输入代码后,没有补全提示 首先检查是否关闭了代码提示,如下图,将红框中"Power Save Mode"前的勾去掉 第二步,如果在输入某些代码时还是没有补全提 ...
- Java爬虫系列四:使用selenium-java爬取js异步请求的数据
在之前的系列文章中介绍了如何使用httpclient抓取页面html以及如何用jsoup分析html源文件内容得到我们想要的数据,但是有时候通过这两种方式不能正常抓取到我们想要的数据,比如看如下例子. ...
- 后台管理系统使用vue-element-admin搭建
近期在搞一个会议健康申报系统时,要搞一个后台,用到了vue-element-admin模板,使用的是PanJianChen(源码地址:https://github.com/PanJiaChen/vue ...
- 【c++ Prime 学习笔记】第19章 特殊工具与技术
某些程序对内存分配有特殊要求,不能直接使用标准内存管理机制 重载new和delete算符可控制内存分配的过程 19.1.1 重载new和delete 说法"重载new和delete" ...
- elasticsearch嵌套对象的映射
在es中,我们有时候可能需要映射,{ "field" : "xx" , "field01" : [] }这样格式的嵌套对象,默认情况下es会 ...
- 攻防世界 杂项 11.simple_transfer
题目描述: 文件里有flag,找到它. 题目分析: 文件解压后是一个抓包流量分析文件,用 wireshark 打开后,用分组字节流搜索 flag,追踪 TCP 流,可以隐约看到有 file.pdf, ...
- Java:final,finally 和 finalize 的区别
在Java中,final,final和finalize之间有许多差异.final,final和finalize之间的差异列表如下: No final finally finalize 1 final用 ...
- JVM:Java内存区域与内存溢出异常
Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁时间,有些区域随着虚拟机进程的启动而存在,有些区域依赖用户线程的启动和 ...