给定两个常为 \(n\) 的序列 \(l_i,r_i\),问夹在它们之间 ( \(\forall i, l_i \leq a_i \leq r_i\) ) 的不降序列的元素总和。

Solution

先搞一波离散化,把

设 \(f[i][j]\) 表示处理完了 \(a[1\dots i]\),且 \(a[i]\) 在第 \(j\) 个区间内的总和, \(g[i][j]\) 为方案数

考虑运用分段的思想,枚举下一段的结束点 \(p\),以及下一段所在区间 \(k\),就可以暴力转移到 \(f[p][k]\)

\[Af[i][j] + Bg[i][j] \to f[p][k]
\\
Ag[i][j] \to g[p][k]
\]

其中 \(A\) 是方案数, \(B\) 是总和,运用插板法与期望的线性性质得

\[t=p-i,\quad A=C_{R_k-L_k+t}^t,\quad B=\frac{t(L_k+R_k)}{2}\cdot C_{R-L+t}^t
\]

组合数如果每个都暴力计算复杂度是 \(O(t\log V)\) 的。显然 \(C_{R-L+t}^t=\frac{(R-L+t)!}{(R-L)!t!}\),于是 \(C_{R-L+t}^t=C_{R-L+t-1}^{t-1} \cdot \frac{R-L+t}{t}\)

但是考虑到 \(R_k-L_k\) 之和 \(k\) 相关,所以我们需要用的组合数只有 \(O(n^2)\) 个,于是花费 \(O(n^2 \log V)\) 时间暴力预处理 \(c[k][t]=C_{R_k-L_k+t}^t\) 即可。

Warning: 运算过程会爆 long long

#include <bits/stdc++.h>
using namespace std;
#define int __int128
const bool dbg = 0;
const int N = 105;
const int mod = 998244353;
const int r2 = 499122177;
int f[N][N],g[N][N],c[N][N],n,L[N],R[N],l[N],r[N],pos[N],ind;
map<int,int> mp;
int qpow(int p,int q) {return ((q&1)?p:1) * (q?qpow(p*p%mod,q/2):1) % mod;}
int inv(int p) {return qpow(p,mod-2);}
void read(int &x) {
long long a;
cin>>a;
x=a;
}
void write(int x) {
cout<<(long long)x;
}
signed main() {
read(n);
for(int i=1;i<=n;i++) read(l[i]), mp[l[i]]++;
for(int i=1;i<=n;i++) read(r[i]), r[i]++, mp[r[i]]++;
for(auto i=mp.begin();i!=mp.end();i++) i->second=++ind, pos[ind]=i->first;
for(int i=1;i<ind;i++) L[i]=pos[i], R[i]=pos[i+1];
for(int i=1;i<=n;i++) l[i]=lower_bound(L+1,L+ind,l[i])-L, r[i]=lower_bound(R+1,R+ind,r[i])-R;
for(int i=1;i<ind;i++) R[i]--;
for(int i=1;i<ind;i++) {
c[i][0]=1;
for(int j=1;j<=n;j++) c[i][j]=c[i][j-1]*(((R[i]-L[i]+j)%mod+mod)%mod)%mod*inv(j)%mod;
}
g[0][0]=1;
for(int i=0;i<=n;i++) {
for(int j=0;j<ind;j++) if(((i==0)^(j==0))==0) {
int lb=0,rb=ind;
for(int p=i+1;p<=n;p++) {
lb=max(lb,l[p]);
rb=min(rb,r[p]);
for(int k=j+1;k<ind;k++) {
if(lb<=k && k<=rb) {
f[p][k] += c[k][p-i]*f[i][j]%mod
+ (p-i)*(L[k]+R[k])%mod*r2%mod*c[k][p-i]%mod*g[i][j]%mod;
f[p][k] %= mod;
g[p][k] += c[k][p-i]*g[i][j]%mod;
g[p][k] %= mod;
}
}
}
}
}
int ans=0;
for(int i=1;i<ind;i++) ans+=f[n][i], ans%=mod;
write(ans);
}

Wannafly Winter Camp 2020 Day 6D 递增递增 - dp,组合数学的更多相关文章

  1. Wannafly Winter Camp 2020 Day 6J K重排列 - dp

    求 \(K\) 是多少个 \(n\) 元置换的周期.\(T\leq 100, n\leq 50, K \leq 10^{18}\) Solution 置换可以被试做若干个环组成的有向图,于是考虑 dp ...

  2. Wannafly Winter Camp 2020 Day 6I 变大! - dp

    给定一个序列,可以执行 \(k\) 次操作,每次选择连续的三个位置,将他们都变成他们的最大值,最大化 \(\sum a_i\) 需要对每一个 \(k=i\) 输出答案 \(n \leq 50, a_i ...

  3. Wannafly Winter Camp 2020 Day 7E 上升下降子序列 - 数学

    神奇公式 #include <bits/stdc++.h> using namespace std; #define int long long int n,mod,c[205][205] ...

  4. Wannafly Winter Camp 2020 Day 7D 方阵的行列式 - 数学

    于是去弄了个板子来 #include <bits/stdc++.h> using namespace std; #define int long long const int mod = ...

  5. Wannafly Winter Camp 2020 Day 7A 序列 - 树状数组

    给定一个全排列,对于它的每一个子序列 \(s[1..p]\),对于每一个 \(i \in [1,p-1]\),给 \(s[i],s[i+1]\) 间的每一个值对应的桶 \(+1\),求最终每个桶的值. ...

  6. Wannafly Winter Camp 2020 Day 6H 异或询问 - 二分

    给定一个长 \(n\) 的序列 \(a_1,\dots,a_n\),定义 \(f(x)\) 为有多少个 \(a_i \leq x\) 有 \(q\) 次询问,每次给定 \(l,r,x\),求 \(\s ...

  7. Wannafly Winter Camp 2020 Day 6G 单调栈 - 贪心

    对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 ...

  8. Wannafly Winter Camp 2020 Day 6C 酒馆战棋 - 贪心

    你方有 \(n\) 个人,攻击力和血量都是 \(1\).对方有 \(a\) 个普通人, \(b\) 个只有盾的,\(c\) 个只有嘲讽的,\(d\) 个有盾又有嘲讽的,他们的攻击力和血量都是无穷大.有 ...

  9. Wannafly Winter Camp 2020 Day 6A Convolution - NTT

    求 \(\sum_{i=1}^n \sum_{j=1}^n 2^{a_ia_j}\) Solution 化简一下 \[ 2^{a_ia_j} = p^{(a_i+a_j)^2-a_i^2-a_j^2} ...

随机推荐

  1. 时序数据库 Apache-IoTDB 源码解析之前言(一)

    IoTDB 是一款时序数据库,相关竞品有 Kairosdb,InfluxDB,TimescaleDB等,主要使用场景是在物联网相关行业,如:车联网.风力发电.地铁.飞机监控等等,具体应用案例及公司详情 ...

  2. 命令行压缩解压缩一 7z

    命令行压缩解压缩一 7z  1) 简介  7z,全称7-Zip, 是一款开源软件.是目前公认的压缩比例最大的压缩解压缩软件.  主页:http://www.7-zip.org/  中文主页:http: ...

  3. PAT_B_PRAC_1003养兔子

    题目描述 一只成熟的兔子每天能产下一胎兔子.每只小兔子的成熟期是一天. 某人领养了一只小兔子,请问第N天以后,他将会得到多少只兔子. 输入描述: 测试数据包括多组,每组一行,为整数n(1≤n≤90). ...

  4. Sophus库CMakeLists.txt内容详解笔记

    CMakeLists.txt: SET(PROJECT_NAME Sophus) PROJECT(${PROJECT_NAME}) CMAKE_MINIMUM_REQUIRED(VERSION 2.6 ...

  5. Codeforces_731_A

    http://codeforces.com/problemset/problem/731/A 每次操作总共4种情况,判断一下就好了. #include<iostream> #include ...

  6. Nginx+uWSGI+Django原理(转发)

    Python的Web开发中,如果使用Django框架,那么较为成熟稳定的服务器架构一般是Nginx+uWSGI+Django.而为什么一定要三个结合在一起呢?直接使用Django的runserver来 ...

  7. [redis读书笔记] 第一部分 数据结构与对象 整数集合

    typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t c ...

  8. Hexo搭建静态博客踩坑日记(一)

    前言 博客折腾一次就好, 找一个适合自己的博客平台, 专注于内容进行提升. 方式一: 自己买服务器, 域名, 写前端, 后端(前后分离最折腾, 不分离还好一点)... 方式二: 利用Hexo, Hug ...

  9. 关于ELF文件和BIN文件

    ELF文件执行过程 ELF文件有操作系统的加载器loader执行,比如linux,windows,对于3803处理器是grmon的load命令. 加载器会读取ELF文件program header,比 ...

  10. linux中查看nginx、apache、php、mysql配置文件路径

    linux高效.稳定,但是也带来维护上的一些问题.配置文件究竟在哪里????? 如何在linux中查看nginx.apache.php.mysql配置文件路径了,如果你接收一个别人配置过的环境,但没留 ...