Solution -「LNOI 2022」「洛谷 P8367」盒
\(\mathscr{Desription}\)
Link.
有 \(n\) 个盒子排成一排,第 \(i\) 个盒子内有 \(a_i\) 个球。球可以在相邻盒子间传递,\(i\) 与 \(i+1\) 间的单位传递费用是 \(w_i\)。对于所有 \(\{b_{1..n}\}\in\mathbb{N}^n,\sum_{i=1}^nb_i=\sum_{i=1}^na_i:=S\),求通过传递使得 \(a=b\) 的最小费用和。答案模 \(998244353\)。
\(n\le5\times10^5\),\(S\le2\times10^6\)。
\(\mathscr{Solution}\)
答案显然是
\]
这个 \(w_i\) 的高情商理解当然是:我们需要求出每个
r_i&=\sum_{j=0}^S|j-s_i|\binom{i+j-1}{j}\binom{S-j+n-i-1}{S-j}\\
&=2\sum_{j=0}^{s_i}(s_i-j)\binom{i+j-1}{j}\binom{S-j+n-i-1}{S-j}\\
&~~~~+\sum_{j=0}^S(j-s_i)\binom{i+j-1}{j}\binom{S-j+n-i-1}{S-j}.
\end{aligned}
\]
注意第二步的绝对值拆得比较有心机,保持求和指标从 \(0\) 开始,使得式子的组合意义更优美。
两项分别算叭。设 \(r_i=p_i+q_i\)。首先利用恒等式 \(j\binom{i+j-1}{j}=i\binom{i+j-1}{j-1}\) 化简 \(p,q\),此后观察到 \(q_i\) 的求和是对组合数所有有意义的上指标求和,它应该比较好化简。浅推一下:
q_i&=i\sum_{j=0}^{S-1}\binom{i+j}{j}\binom{S-j+n-i-2}{S-j-1}-s_i\sum_{j=0}^S\binom{i+j-1}{j}\binom{S-j+n-i-1}{S-j}\\
&=i\sum_{j=0}^{S-1}\binom{i+j}{i}\binom{S-j+n-i-2}{n-i-1}-\cdots\\
&=i\binom{i+1+S+n-i-2}{i+1+n-i-1}-\cdots\quad\quad(*)\\
&=i\binom{S+n-1}{n}-s_i\sum_{j=0}^S\binom{i+j-1}{i-1}\binom{S-j+n-i-1}{n-i-1}\\
&=\cdots-s_i\binom{i-1+1+S+n-i-1}{i-1+1+n-i-1}\\
&=i\binom{S+n-1}{n}-s_i\binom{S+n-1}{n-1}.
\end{aligned}
\]
其中 \((*)\) 是经典组合意义:在 \(S+n-1\) 个球中选 \(n\) 个,其中第 \(i+1\) 个钦定为分隔球,就得到了原乘积式的组合方案。
接下来解决 \(p\)。先做类似 \(q\) 的前两步化简,然后细看一下,把两个和式单独考虑:
\]
类似于 \((*)\),\(f(x,y)\) 的组合意义为:在 \(S+n-1\) 个球里选 \(n\) 个,要求选的第 \(x+1\) 个球的位置不超过 \(x+y+1\);\(g(x,y)\) 的组合意义为:在 \(S+n-1\) 个球里选 \(n-1\) 个,要求选的第 \(x\) 个球的位置不超过 \(x+y\)。敏锐地注意到:\(f,g\) 都可以利用 \((x,y)\) 的一个前驱状态添加或减少边界情况的方案得到。另一方面,原式恰好满足 \(x,y\) 分别不递减。因此,我们可以维护 \(f(x,y)\) 和 \(g(x,y)\),将 \((x,y)\) 随着和式做指针移动。具体地,通过组合意义的理解,不难得到:
f(x,y)=f(x-1,y)-\binom{x+y}{x}\binom{S+n-2-x-y}{n-x};\\
g(x,y)=\binom{x+y-1}{x-1}\binom{S+n-1-x-y}{n-1-x}+g(x,y-1),\\
g(x,y)=g(x-1,y)-\binom{x+y-1}{x-1}\binom{S+n-1-x-y}{n-x}.
\]
可见,\((x,y)\) 移动到 \((x+1,y)\) 或者 \((x,y+1)\) 都是 \(\mathcal O(1)\) 的,均摊下来,我们就能 \(\mathcal O(n+S)\) 求出 \(f,g\)。所以总复杂度就是 \(\mathcal O(T(n+S))\)。
\(\mathscr{Code}\)
/*+Rainybunny+*/
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)
#define per(i, r, l) for (int i = r, per##i = l; i >= per##i; --i)
inline char fgc() {
static char buf[1 << 17], *p = buf, *q = buf;
return p == q && (q = buf + fread(p = buf, 1, 1 << 17, stdin), p == q) ?
EOF : *p++;
}
template <typename Tp = int>
inline Tp rint() {
Tp x = 0, s = fgc(), f = 1;
for (; s < '0' || '9' < s; s = fgc()) f = s == '-' ? -f : f;
for (; '0' <= s && s <= '9'; s = fgc()) x = x * 10 + (s ^ '0');
return x * f;
}
template <typename Tp>
inline void wint(Tp x) {
if (x < 0) putchar('-'), x = -x;
if (9 < x) wint(x / 10);
putchar(x % 10 ^ '0');
}
const int MAXN = 5e5, MAXS = 2e6, MOD = 998244353;
int n, a[MAXN + 5], w[MAXN + 5], fac[MAXN + MAXS + 5], ifac[MAXN + MAXS + 5];
inline int mul(const int u, const int v) { return 1ll * u * v % MOD; }
inline void subeq(int& u, const int v) { (u -= v) < 0 && (u += MOD); }
inline int sub(int u, const int v) { return (u -= v) < 0 ? u + MOD : u; }
inline void addeq(int& u, const int v) { (u += v) >= MOD && (u -= MOD); }
inline int add(int u, const int v) { return (u += v) < MOD ? u : u - MOD; }
inline int mpow(int u, int v) {
int ret = 1;
for (; v; u = mul(u, u), v >>= 1) ret = mul(ret, v & 1 ? u : 1);
return ret;
}
inline void init(const int s) {
fac[0] = 1;
rep (i, 1, s) fac[i] = mul(i, fac[i - 1]);
ifac[s] = mpow(fac[s], MOD - 2);
per (i, s - 1, 0) ifac[i] = mul(i + 1, ifac[i + 1]);
}
inline int bino(const int u, const int v) {
return v < 0 || u < v ? 0 : mul(fac[u], mul(ifac[v], ifac[u - v]));
}
int main() {
init(MAXN + MAXS);
for (int T = rint(); T--;) {
n = rint();
rep (i, 1, n) a[i] = a[i - 1] + rint();
rep (i, 1, n - 1) w[i] = rint();
int ans = 0, S = a[n];
int fx = 0, fy = 0, fv = bino(S + n - 2, n - 1);
int gx = 1, gy = 0, gv = bino(S + n - 2, n - 2);
rep (i, 1, n - 1) {
addeq(ans, mul(w[i], sub(mul(i, bino(S + n - 1, n)),
mul(a[i], bino(S + n - 1, n - 1)))));
while (fx < i) {
++fx;
subeq(fv, mul(bino(fx + fy, fx),
bino(S + n - 2 - fx - fy, n - fx)));
}
while (fy < a[i] - 1) {
++fy;
addeq(fv, mul(bino(fx + fy, fx),
bino(S + n - 2 - fx - fy, n - 1 - fx)));
}
while (gx < i) {
++gx;
subeq(gv, mul(bino(gx + gy - 1, gx - 1),
bino(S + n - 1 - gx - gy, n - gx)));
}
while (gy < a[i]) {
++gy;
addeq(gv, mul(bino(gx + gy - 1, gx - 1),
bino(S + n - 1 - gx - gy, n - 1 - gx)));
}
addeq(ans, mul(mul(2, w[i]),
sub(mul(a[i], gv), mul(i, fy == a[i] - 1 ? fv : 0))));
}
wint(ans), putchar('\n');
}
return 0;
}
Solution -「LNOI 2022」「洛谷 P8367」盒的更多相关文章
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「洛谷 P4372」Out of Sorts P
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
- Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
- Solution -「APIO 2016」「洛谷 P3643」划艇
\(\mathcal{Description}\) Link & 双倍经验. 给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...
- 「洛谷4197」「BZOJ3545」peak【线段树合并】
题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...
- 「洛谷3338」「ZJOI2014」力【FFT】
题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...
- 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...
- 「洛谷3870」「TJOI2009」开关【线段树】
题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...
- 「洛谷5300」「GXOI/GZOI2019」与或和【单调栈+二进制转化】
题目链接 [洛谷传送门] 题解 按位处理. 把每一位对应的图都处理出来 然后单调栈处理一下就好了. \(and\)操作处理全\(1\). \(or\)操作处理全\(0\). 代码 #include & ...
随机推荐
- Reviewbot 开源 | 为什么我们要打造自己的代码审查服务?
Reviewbot 是七牛云开源的一个项目,旨在提供一个自托管的代码审查服务, 方便做 code review/静态检查, 以及自定义工程规范的落地. 静态检查不是个新鲜事. 我记得早在几年前,我们就 ...
- docker连不上私有仓库Harbor
解决办法: # 配置多个host(配置本地域名映射) [root@vm10-11-0-38 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.local ...
- 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现六
一.前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势.传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速.便捷需求.这些问题不 ...
- 3. jenkins的管理
1. jenkins的插件管理 Jenkins本身不提供很多功能,我们可以通过使用插件来满足我们的使用.例如从Gitlab拉取代码,使用Maven构建项目等功能需要依靠插件完成.接下来演示如何下载 ...
- clone:克隆数据,可深度克隆
这里列出了原始类型,时间.正则.错误.数组.对象的克隆规则,其他的可自行补充 function clone(value, deep){ if(isPrimitive(value)){ return v ...
- 干货分享:Air700ECQ的硬件设计,第二部分
接下来分享第二部分. 3.10. 功能管脚 3.10.1. MAIN_RI 管脚名 类型 序号 电压域 作用 MAIN_RI DO 5 LDOAON 振铃信号,唤醒输出管脚,用于唤醒AP 表格 1 ...
- AT开发FOTA远程升级:Air780EP低功耗4G模组
针对客户朋友的应用反馈,特本篇文章:基于Air780EP模组AT开发的FOTA远程升级指南. AT版本的远程升级主要是对AT固件版本进行升级,实际方式为通过合宙官方IoT平台升级或者使用自己搭建的 ...
- DDD之理解复杂度、尊重复杂度、掌控复杂度
本文书接上回<懂了这个道理,人月神话不再是神话!>,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新: DDD框架源码(.NET.Java双平台): 加群畅聊,建模分析.技术交流: ...
- Windows远程登录到VirtualBox安装的Ubuntu11.10
一.环境 本地:Windows xp 虚拟机:VirtualBox 虚拟机的操作系统:Linux-Ubuntu11.10 二.目的 在Windows下通过SecureCRT(putty也可)远程登录到 ...
- SPRINGBOOT 热加载JAR包
1.概要 springboot 的程序一般打包程成jar包.我们有些情况下,我们需要对程序进行扩展,我们没办法对已打包的程序进行修改. 我们希望的做法是: 1.将我们的一些接口打包. 2.在扩展包时, ...