第一天的题都是好题啊 QAQ!!
异或
给出一个大小为
n
的集合
S
和一个整数
x
,求
S
中有多少子集满足其中任意两个元素之间的异或和不小于
x
。对质数取模。
n≤106
设
x
的二进制最高位为
k
。
考虑两个数字异或的情况,如果两个数字大于
k
的二进制位不一样,其异或结果一定不小于
x
。
那么如果我们把大于
k
的二进制位相同的数取出来,分成一个组,然后单独求出每组内能取出的子集个数,最后答案只需要对每个组能取出的子集个数自由组合即可。
考虑求出每组内能取出的子集个数。因为要求每组取出的子集中任意两个数的异或和所以这些数字在第
k
位的取值一定要两两不同,所以每一组内取出的合法子集大小只有
0,1,2
三种,前两种是平凡的,最后一种用 trie 维护即可。
计数
给定整数
x
,定义长度为
N
的序列
{ai}
的价值
f(a)
如下:
max{L(a)−x,0}
其中
L(a)
表示
a
最长的相同子段的长度。
给定整数
N,K,x
,求出长度为
N,各个元素在
[1,K]
中的所有整数序列的价值之和。大质数取模。
N≤106,K≤108,x≥0
首先一个显然的策略是枚举每个
L(a)
的可能取值
x,算方案数即可。
每次算方案数时可以设
dp[n][0/1]
考虑了长度为
n
的序列,达到了 / 未达到
x
的方案数。
这样就已经没办法优化了,可以考虑把等于的限制改宽改为大于的限制,注意到:
max{L(a)−x,0}=i=x+1∑n[L[a]≥i]
类似地贡献转化手法还有这道题。可能是一种常见套路
问题转化为对于一个
i
求有多少序列的连续子段长度大于
i。
可以考虑补集转化,求有多少序列的连续子段长度小于
i
的序列,只需要在每个位置枚举从这里出发连续字段有多长就可以了。(相当于一个存在性限制,转化为任意性限制,任意性限制显然结构更加简单)
可以设
dp[n]
表示长度为
n
的序列,最长相同子段的长度小于
x
的方案数,转移显然:
dp[n]=⎩⎨⎧kn(k−1)i=1∑x−1dp[n−i]n<xotherwise.
可以用前缀和优化。这样做复杂度仍旧是
O(n2)
的。
题解中给出了这样一份代码,其
dp[n]
的意义是长度为
n
的合法序列,且最后两个元素不同的方案数:
int getans(int n, int k, int x) {
    if (x == 1) return power(k, n);
    static int dp[MAXN]; dp[1] = k;
    for (int i = 2; i <= n; i++)
        if (i < x) dp[i] = 1ll * k * dp[i - 1] % P;
        else dp[i] = (1ll * k * dp[i - 1] - 1ll * (k - 1) * dp[i - x] % P + P) % P;
    return (0ll + power(k, n) - dp[n] + P + dp[n - x + 1]) % P;
}
 
按照题解的转移方式,其方程可以写作:(转移可以理解为把最后一个数字扩充,然后随便放上一个不一样的)
dp[n]=⎩⎨⎧kdp[n−1]×kdp[n−1]×k+(1−k)×dp[i−x]n=1i<xotherwise.
考虑到这里的方程转移比较单一,可以试图画出转移图,然后考虑贡献的传递,第一个点值为
k
,每一条转移边都是乘某一个值,且这个值的取值仅有
2
种。
如果一条从
1
到
n
的转移路径所经过的两种转移路径数量相同,那么他们的贡献也相同。枚举第二条转移路径的数量即可计算贡献。这样做的复杂度是
O(xn)
。根据调和级数的理论,这样的做法是
O(nlogn)
的。
有一道平衡树优化 dp 转移的题目,比较有意思。
A
B
A 君有
n
个物品,每个物品有两个属性
ai,bi,现在
A 君想从所有物品中挑选
k
个,并按一定顺序摆放好。
对于一个方案中,被摆在第
j
个位置(位置从
1
开始标号)的物品为
i,它对这个方案产生的价值贡献为
ai⋅(j−1)+bi,一个方案的价值和为它所含的所有物品的贡献之和。
现在 A 君想知道对于所有可能的
k(1≤k≤n),在最优的选取以及摆放情况下能得到的方案价值和最大是多少。
接下来
n
行,每行两个整数
ai,bi。
100%
的数据:n≤300000,
0≤ai≤106,
0≤bi≤1012
输出
n
行,每行两个整数
ai,bi
,表示
k=1,2,3,4,⋯,n
时的最大总价值。
对于一个大小为
k
的方案,如果确定了选择哪
k
个,就可以直接按照
a
排序,然后依次算出贡献(排序不等式)
那么显然可以考虑先对原物品按照的
a
排序,然后依次做背包即可。
dp[i][j]=max{dp[i−1][j],dp[i−1][j−1]+ai×j+bi}
观察到一条结论,选定
k
个物品的答案,一定是在原来
k−1
个物品的答案基础上添加一个物品,而不会拿走。
如果考虑了
i
种物品,那么对于选取
j
个物品的方案,一定是从选
j−1
个物品的方案添加一个物品得到的。也就是说,每新考虑一个物品,上面的转移一定是在某个
j
之前都是继承上一轮的答案,之后都是新增这个物品的答案,维护差分数组即可。可以平衡数维护每一个
j
处的答案的差分。
官方题解附有结论证明。
                                     
                                    
                                    
                                                                            
                                        
                                            
                                            
                                                
                                                    
                                                        
                                                        
                                                            🔗 Source Hash:
                                                            96c5059122c2a0497f076f06e7bb2dd82a02b39718cc17d003eb3354776ad350
                                                        
                                                     
                                                
                                             
                                        
                    
                    
                                            
                                                Build Logs
                                                Build Log - Filtered
================================================
📋 Information:
• Path information has been filtered for privacy protection
• File names are preserved for debugging purposes  
• All build status and error messages are kept intact
🔍 Filter Rules:
• /absolute/path/file.ext → .../file.ext
• /home/username → .../[user]
• /tmp/files → .../[temp]
• /usr/share/packages → .../[system]
================================================
html log:
CMD: ['pandoc', '-s', 'cache/oi-blog_「比赛总结」实验舱.md', '--filter', 'pandoc-crossref', '--filter', 'pandoc-katex', '--template=cache/pandoc_html_template.html', '-o', 'cache.../oi-blog_「比赛总结」实验舱.md.html', '--metadata', '--verbose', '--highlight-style=tango']
STDOUT: 
STDERR: WARNING: pandoc-crossref was compiled with pandoc 3.6.2 but is being run through 3.6.4. This is not supported. Strange things may (and likely will) happen silently.
====================================================================================================
pdf log:
CMD: ['pandoc', '-s', 'cache.../69f5ac375d.pdf.md', '-o', 'cache/69f5ac375d.pdf', '-H', 'static/pandoc.header.tex', '--pdf-engine=xelatex', '--verbose']
STDOUT: 
STDERR: [INFO] Loaded static.../pandoc.header.tex from static.../pandoc.header.tex
[INFO] Not rendering RawBlock (Format "html") ""
[INFO] Not rendering RawBlock (Format "html") ""
[INFO] [makePDF] Temp dir:
  .../[temp]
[INFO] [makePDF] Command line:
  xelatex "-halt-on-error" "-interaction" "nonstopmode" "-output-directory" ".../[temp] ".../[temp]
[INFO] [makePDF] Relevant environment variables:
  ("TEXINPUTS",".../[temp]
  ("TEXMFOUTPUT",".../[temp]
  ("SHELL","/bin/bash")
  ("PWD",".../[user]/projects/blog")
  ("HOME",".../[user]
  ("LANG","zh_CN.UTF-8")
  ("PATH",".../[user]/.local/bin:.../[user]/.cargo/bin:.../[user]/miniconda3/envs/myblog/bin:.../[user]/miniconda3/condabin:.../[temp]
[INFO] [makePDF] Source:
  % Options for packages loaded elsewhere
  \PassOptionsToPackage{unicode}{hyperref}
  \PassOptionsToPackage{hyphens}{url}
  \PassOptionsToPackage{space}{xeCJK}
  \documentclass[
  ]{article}
  \usepackage{xcolor}
  \usepackage[a4paper,margin=2cm]{geometry}
  \usepackage{amsmath,amssymb}
  \setcounter{secnumdepth}{-\maxdimen} % remove section numbering
  \usepackage{iftex}
  \ifPDFTeX
    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage{textcomp} % provide euro and other symbols
  \else % if luatex or xetex
    \usepackage{unicode-math} % this also loads fontspec
    \defaultfontfeatures{Scale=MatchLowercase}
    \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1}
  \fi
  \usepackage{lmodern}
  \ifPDFTeX\else
    % xetex/luatex font selection
    \setmainfont[]{Latin Modern Roman}
    \ifXeTeX
      \usepackage{xeCJK}
      \setCJKmainfont[]{AR PL UKai CN}
    \fi
    \ifLuaTeX
      \usepackage[]{luatexja-fontspec}
      \setmainjfont[]{AR PL UKai CN}
    \fi
  \fi
  % Use upquote if available, for straight quotes in verbatim environments
  \IfFileExists{upquote.sty}{\usepackage{upquote}}{}
  \IfFileExists{microtype.sty}{% use microtype if available
    \usepackage[]{microtype}
    \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
  }{}
  \usepackage{setspace}
  \makeatletter
  \@ifundefined{KOMAClassName}{% if non-KOMA class
    \IfFileExists{parskip.sty}{%
      \usepackage{parskip}
    }{% else
      \setlength{\parindent}{0pt}
      \setlength{\parskip}{6pt plus 2pt minus 1pt}}
  }{% if KOMA class
    \KOMAoptions{parskip=half}}
  \makeatother
  \usepackage{color}
  \usepackage{fancyvrb}
  \newcommand{\VerbBar}{|}
  \newcommand{\VERB}{\Verb[commandchars=\\\{\}]}
  \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
  % Add ',fontsize=\small' for more characters per line
  \newenvironment{Shaded}{}{}
  \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}}
  \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
  \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{#1}}
  \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
  \newcommand{\BuiltInTok}[1]{\textcolor[rgb]{0.00,0.50,0.00}{#1}}
  \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
  \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{#1}}}
  \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
  \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{#1}}
  \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}}
  \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{#1}}
  \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
  \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{#1}}}
  \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}}
  \newcommand{\ExtensionTok}[1]{#1}
  \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
  \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{#1}}
  \newcommand{\ImportTok}[1]{\textcolor[rgb]{0.00,0.50,0.00}{\textbf{#1}}}
  \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
  \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}}
  \newcommand{\NormalTok}[1]{#1}
  \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}}
  \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{#1}}
  \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{#1}}
  \newcommand{\RegionMarkerTok}[1]{#1}
  \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
  \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{#1}}
  \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
  \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{#1}}
  \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
  \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
  \setlength{\emergencystretch}{3em} % prevent overfull lines
  \providecommand{\tightlist}{%
    \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
  % \usepackage{xeCJK}
  % \setCJKmainfont{AR PL UKai CN}
  % \usepackage{unicode-math}
  
  \setmathfont{Latin Modern Math}
  \usepackage{bookmark}
  \IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available
  \urlstyle{same}
  \hypersetup{
    pdftitle={「比赛总结」实验舱},
    pdfauthor={Jiayi Su (ShuYuMo)},
    hidelinks,
    pdfcreator={LaTeX via pandoc}}
  
  \title{「比赛总结」实验舱}
  \author{Jiayi Su (ShuYuMo)}
  \date{2021-03-10 11:40:46}
  
  \begin{document}
  \maketitle
  
  \setstretch{1.3}
  第一天的题都是好题啊 QAQ!!
  
  \subsection{异或}\label{ux5f02ux6216}
  
  给出一个大小为 \(n\) 的集合 \(S\) 和一个整数 \(x\) ,求 \(S\)
  中有多少子集满足其中任意两个元素之间的异或和不小于 \(x\) 。对质数取模。
  \(n \le 10^6\)
  
  设 \(x\) 的二进制最高位为 \(k\) 。
  
  考虑两个数字异或的情况,如果两个数字大于 \(k\)
  的二进制位不一样,其异或结果一定不小于 \(x\) 。
  
  那么如果我们把大于 \(k\)
  的二进制位相同的数取出来,分成一个组,然后单独求出每组内能取出的子集个数,最后答案只需要对每个组能取出的子集个数自由组合即可。
  
  考虑求出每组内能取出的子集个数。因为要求每组取出的子集中任意两个数的异或和所以这些数字在第
  \(k\) 位的取值一定要两两不同,所以每一组内取出的合法子集大小只有
  \(0, 1, 2\) 三种,前两种是平凡的,最后一种用 trie 维护即可。
  
  \subsection{计数}\label{ux8ba1ux6570}
  
  给定整数 \(x\) ,定义长度为 \(N\) 的序列 \(\{a_i\}\) 的价值 \(f(a)\)
  如下:
  
  \[
  \max\{L(a)-x,0\}
  \]
  
  其中 \(L(a)\) 表示 \(a\) 最长的相同子段的长度。
  
  给定整数 \(N,K, x\) ,求出长度为 \(N\),各个元素在 \([1,K]\)
  中的所有整数序列的价值之和。大质数取模。
  \(N \le 10^6, K \le 10^8, x \ge 0\)
  
  首先一个显然的策略是枚举每个 \(L(a)\) 的可能取值 \(x\),算方案数即可。
  
  每次算方案数时可以设 \(dp[n][0/1]\) 考虑了长度为 \(n\) 的序列,达到了 /
  未达到 \(x\) 的方案数。
  
  这样就已经没办法优化了,可以考虑把等于的限制改宽改为大于的限制,注意到:
  \[
  \max\{L(a) - x, 0\}=\sum_{i=x+1}^{n}\left[L[a] \ge i\right]
  \]
  类似地贡献转化手法还有\href{https://www.luogu.com.cn/problem/P4365}{这道题}。可能是一种常见套路
  
  问题转化为对于一个 \(i\) 求有多少序列的连续子段长度大于 \(i\)。
  
  可以考虑补集转化,求有多少序列的连续子段长度小于 \(i\)
  的序列,只需要在每个位置枚举从这里出发连续字段有多长就可以了。(相当于一个存在性限制,转化为任意性限制,任意性限制显然结构更加简单)
  
  可以设 \(dp[n]\) 表示长度为 \(n\) 的序列,最长相同子段的长度小于 \(x\)
  的方案数,转移显然: \[
  dp[n] =
  \begin{cases}
  k^n & n < x\\
  (k-1)\sum_{i=1}^{x-1}\limits{dp[n-i]} & otherwise.
  \end{cases}
  \] 可以用前缀和优化。这样做复杂度仍旧是 \(\mathcal{O}(n^2)\) 的。
  
  题解中给出了这样一份代码,其 \(dp[n]\) 的意义是长度为 \(n\)
  的合法序列,且最后两个元素不同的方案数:
  
  \begin{Shaded}
  \begin{Highlighting}[]
  \DataTypeTok{int}\NormalTok{ getans}\OperatorTok{(}\DataTypeTok{int}\NormalTok{ n}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ k}\OperatorTok{,} \DataTypeTok{int}\NormalTok{ x}\OperatorTok{)} \OperatorTok{\{}
      \ControlFlowTok{if} \OperatorTok{(}\NormalTok{x }\OperatorTok{==} \DecValTok{1}\OperatorTok{)} \ControlFlowTok{return}\NormalTok{ power}\OperatorTok{(}\NormalTok{k}\OperatorTok{,}\NormalTok{ n}\OperatorTok{);}
      \AttributeTok{static} \DataTypeTok{int}\NormalTok{ dp}\OperatorTok{[}\NormalTok{MAXN}\OperatorTok{];}\NormalTok{ dp}\OperatorTok{[}\DecValTok{1}\OperatorTok{]} \OperatorTok{=}\NormalTok{ k}\OperatorTok{;}
      \ControlFlowTok{for} \OperatorTok{(}\DataTypeTok{int}\NormalTok{ i }\OperatorTok{=} \DecValTok{2}\OperatorTok{;}\NormalTok{ i }\OperatorTok{\textless{}=}\NormalTok{ n}\OperatorTok{;}\NormalTok{ i}\OperatorTok{++)}
          \ControlFlowTok{if} \OperatorTok{(}\NormalTok{i }\OperatorTok{\textless{}}\NormalTok{ x}\OperatorTok{)}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \DecValTok{1}\BuiltInTok{ll} \OperatorTok{*}\NormalTok{ k }\OperatorTok{*}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{]} \OperatorTok{\%}\NormalTok{ P}\OperatorTok{;}
          \ControlFlowTok{else}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i}\OperatorTok{]} \OperatorTok{=} \OperatorTok{(}\DecValTok{1}\BuiltInTok{ll} \OperatorTok{*}\NormalTok{ k }\OperatorTok{*}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{]} \OperatorTok{{-}} \DecValTok{1}\BuiltInTok{ll} \OperatorTok{*} \OperatorTok{(}\NormalTok{k }\OperatorTok{{-}} \DecValTok{1}\OperatorTok{)} \OperatorTok{*}\NormalTok{ dp}\OperatorTok{[}\NormalTok{i }\OperatorTok{{-}}\NormalTok{ x}\OperatorTok{]} \OperatorTok{\%}\NormalTok{ P }\OperatorTok{+}\NormalTok{ P}\OperatorTok{)} \OperatorTok{\%}\NormalTok{ P}\OperatorTok{;}
      \ControlFlowTok{return} \OperatorTok{(}\DecValTok{0}\BuiltInTok{ll} \OperatorTok{+}\NormalTok{ power}\OperatorTok{(}\NormalTok{k}\OperatorTok{,}\NormalTok{ n}\OperatorTok{)} \OperatorTok{{-}}\NormalTok{ dp}\OperatorTok{[}\NormalTok{n}\OperatorTok{]} \OperatorTok{+}\NormalTok{ P }\OperatorTok{+}\NormalTok{ dp}\OperatorTok{[}\NormalTok{n }\OperatorTok{{-}}\NormalTok{ x }\OperatorTok{+} \DecValTok{1}\OperatorTok{])} \OperatorTok{\%}\NormalTok{ P}\OperatorTok{;}
  \OperatorTok{\}}
  \end{Highlighting}
  \end{Shaded}
  
  按照题解的转移方式,其方程可以写作:(转移可以理解为把最后一个数字扩充,然后随便放上一个不一样的)
  \[
  dp[n]=
  \begin{cases}
  k &n=1\\
  dp[n-1]\times k &i < x\\
  dp[n-1]\times k + (1-k) \times dp[i-x] &otherwise.
  \end{cases}
  \]
  考虑到这里的方程转移比较单一,可以试图画出转移图,然后考虑贡献的传递,第一个点值为
  \(k\) ,每一条转移边都是乘某一个值,且这个值的取值仅有 \(2\) 种。
  
  如果一条从 \(1\) 到 \(n\)
  的转移路径所经过的两种转移路径数量相同,那么他们的贡献也相同。枚举第二条转移路径的数量即可计算贡献。这样做的复杂度是
  \(\mathcal{O}(\frac{n}{x})\) 。根据调和级数的理论,这样的做法是
  \(\mathcal{O}(n\log n)\) 的。
  
  有一道平衡树优化 dp 转移的题目,比较有意思。
  
  \href{/pdf/20210310/A.pdf}{A}
  
  \href{/pdf/20210310/A.pdf}{B}
  
  \subsection{\texorpdfstring{\href{/pdf/20210310/C.pdf}{C.
  最大价值}}{C. 最大价值}}\label{c.-ux6700ux5927ux4ef7ux503c}
  
  A 君有 \(n\) 个物品,每个物品有两个属性 \(a_i,b_i\),现在 A
  君想从所有物品中挑选 \(k\) 个,并按一定顺序摆放好。
  
  对于一个方案中,被摆在第 \(j\) 个位置(位置从 \(1\) 开始标号)的物品为
  \(i\),它对这个方案产生的价值贡献为
  \(a_i\cdot(j-1)+b_i\),一个方案的价值和为它所含的所有物品的贡献之和。
  
  现在 A 君想知道对于所有可能的
  \(k\)(\(1\le k\le n\)),在最优的选取以及摆放情况下能得到的方案价值和最大是多少。
  
  接下来 \(n\) 行,每行两个整数 \(a_i, b_i\)。
  
  \(100\%\) 的数据:\(n \le 300\,000\), \(0 \le a_i \le 10^6\),
  \(0 \le b_i \le 10^{12}\)
  
  输出 \(n\) 行,每行两个整数 \(a_i, b_i\) ,表示
  \(k=1, 2, 3, 4, \cdots , n\) 时的最大总价值。
  
  对于一个大小为 \(k\) 的方案,如果确定了选择哪 \(k\) 个,就可以直接按照
  \(a\) 排序,然后依次算出贡献(排序不等式)
  
  那么显然可以考虑先对原物品按照的 \(a\) 排序,然后依次做背包即可。 \[
  dp[i][j] = \max\{dp[i-1][j], dp[i-1][j-1] + a_i\times j+b_i\}
  \] 观察到一条结论,选定 \(k\) 个物品的答案,一定是在原来 \(k-1\)
  个物品的答案基础上添加一个物品,而不会拿走。
  
  如果考虑了 \(i\) 种物品,那么对于选取 \(j\) 个物品的方案,一定是从选
  \(j-1\)
  个物品的方案添加一个物品得到的。也就是说,每新考虑一个物品,上面的转移一定是在某个
  \(j\)
  之前都是继承上一轮的答案,之后都是新增这个物品的答案,维护差分数组即可。可以平衡数维护每一个
  \(j\) 处的答案的差分。
  
  官方题解附有结论证明。
  
  \end{document}
[INFO] [makePDF] LaTeX run number 1
[INFO] [makePDF] LaTeX output
  This is XeTeX, Version 3.141592653-2.6-0.999995 (TeX Live 2023/Debian) (preloaded format=xelatex)
   restricted \write18 enabled.
  entering extended mode
  (.../input.tex
  LaTeX2e <2023-11-01> patch level 1
  L3 programming layer <2024-01-22>
  (.../article.cls
  Document Class: article 2023/05/17 v1.4n Standard LaTeX document class
  (.../[system]
  (.../xcolor.sty
  (.../color.cfg)
  (.../xetex.def)
  (.../[system]
  (.../geometry.sty
  (.../keyval.sty)
  (.../ifvtex.sty
  (.../iftex.sty)))
  (.../amsmath.sty
  For additional information on amsmath, use the `?' option.
  (.../amstext.sty
  (.../amsgen.sty))
  (.../amsbsy.sty)
  (.../amsopn.sty))
  (.../amssymb.sty
  (.../amsfonts.sty))
  (.../unicode-math.sty
  (.../expl3.sty
  (.../l3backend-xetex.def))
  (.../unicode-math-xetex.sty
  (.../xparse.sty)
  (.../l3keys2e.sty)
  (.../fontspec.sty
  (.../fontspec-xetex.sty
  (.../fontenc.sty)
  (.../fontspec.cfg)))
  (.../fix-cm.sty
  (.../ts1enc.def))
  (.../unicode-math-table.tex)))
  (.../lmodern.sty)
  (.../xeCJK.sty
  (.../ctexhook.sty)
  (.../xtemplate.sty)
  (.../xeCJK.cfg))
  (.../upquote.sty
  (.../textcomp.sty))
  (.../microtype.sty
  (.../etoolbox.sty)
  (.../microtype-xetex.def)
  (.../microtype.cfg))
  (.../setspace.sty)
  (.../parskip.sty
  (.../kvoptions.sty
  (.../ltxcmds.sty)
  (.../kvsetkeys.sty)))
  (.../fancyvrb.sty)
  (.../bookmark.sty
  (.../hyperref.sty
  (.../kvdefinekeys.sty)
  (.../pdfescape.sty
  (.../pdftexcmds.sty
  (.../infwarerr.sty)))
  (.../hycolor.sty)
  (.../auxhook.sty)
  (.../nameref.sty
  (.../refcount.sty)
  (.../gettitlestring.sty))
  (.../pd1enc.def)
  (.../intcalc.sty)
  (.../puenc.def)
  (.../url.sty)
  (.../bitset.sty
  (.../bigintcalc.sty))
  (.../atbegshi-ltx.sty))
  (.../hxetex.def
  (.../stringenc.sty)
  (.../rerunfilecheck.sty
  (.../atveryend-ltx.sty)
  (.../uniquecounter.sty)))
  (.../bkm-dvipdfm.def))
  (.../xurl.sty)
  No file input.aux.
  *geometry* driver: auto-detecting
  *geometry* detected driver: xetex
  (.../mt-LatinModernRoman.cfg)
  
  Package hyperref Warning: Rerun to get /PageLabels entry.
  
  (.../omllmm.fd)
  (.../umsa.fd)
  (.../mt-msa.cfg)
  (.../umsb.fd)
  (.../mt-msb.cfg)
  
  LaTeX Font Warning: Font shape `TU/ARPLUKaiCN(0)/b/n' undefined
  (Font)              using `TU/ARPLUKaiCN(0)/m/n' instead on input line 116.
  
  [1]
  
  Package xeCJK Warning: Unknown CJK family `\CJKttdefault' is being ignored.
  (xeCJK)                
  (xeCJK)                Try to use `\setCJKmonofont[<...>]{<...>}' to define
  (xeCJK)                it.
  
  [2] [3] (.../input.aux)
  
  LaTeX Font Warning: Some font shapes were not available, defaults substituted.
  
  
  LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
  
   )
  Output written on .../input.pdf (3 pages).
  Transcript written on .../input.log.
[INFO] [makePDF] Rerun needed
  Package hyperref Warning: Rerun to get /PageLabels entry.
  LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
[INFO] [makePDF] LaTeX run number 2
[INFO] [makePDF] LaTeX output
  This is XeTeX, Version 3.141592653-2.6-0.999995 (TeX Live 2023/Debian) (preloaded format=xelatex)
   restricted \write18 enabled.
  entering extended mode
  (.../input.tex
  LaTeX2e <2023-11-01> patch level 1
  L3 programming layer <2024-01-22>
  (.../article.cls
  Document Class: article 2023/05/17 v1.4n Standard LaTeX document class
  (.../[system]
  (.../xcolor.sty
  (.../color.cfg)
  (.../xetex.def)
  (.../[system]
  (.../geometry.sty
  (.../keyval.sty)
  (.../ifvtex.sty
  (.../iftex.sty)))
  (.../amsmath.sty
  For additional information on amsmath, use the `?' option.
  (.../amstext.sty
  (.../amsgen.sty))
  (.../amsbsy.sty)
  (.../amsopn.sty))
  (.../amssymb.sty
  (.../amsfonts.sty))
  (.../unicode-math.sty
  (.../expl3.sty
  (.../l3backend-xetex.def))
  (.../unicode-math-xetex.sty
  (.../xparse.sty)
  (.../l3keys2e.sty)
  (.../fontspec.sty
  (.../fontspec-xetex.sty
  (.../fontenc.sty)
  (.../fontspec.cfg)))
  (.../fix-cm.sty
  (.../ts1enc.def))
  (.../unicode-math-table.tex)))
  (.../lmodern.sty)
  (.../xeCJK.sty
  (.../ctexhook.sty)
  (.../xtemplate.sty)
  (.../xeCJK.cfg))
  (.../upquote.sty
  (.../textcomp.sty))
  (.../microtype.sty
  (.../etoolbox.sty)
  (.../microtype-xetex.def)
  (.../microtype.cfg))
  (.../setspace.sty)
  (.../parskip.sty
  (.../kvoptions.sty
  (.../ltxcmds.sty)
  (.../kvsetkeys.sty)))
  (.../fancyvrb.sty)
  (.../bookmark.sty
  (.../hyperref.sty
  (.../kvdefinekeys.sty)
  (.../pdfescape.sty
  (.../pdftexcmds.sty
  (.../infwarerr.sty)))
  (.../hycolor.sty)
  (.../auxhook.sty)
  (.../nameref.sty
  (.../refcount.sty)
  (.../gettitlestring.sty))
  (.../pd1enc.def)
  (.../intcalc.sty)
  (.../puenc.def)
  (.../url.sty)
  (.../bitset.sty
  (.../bigintcalc.sty))
  (.../atbegshi-ltx.sty))
  (.../hxetex.def
  (.../stringenc.sty)
  (.../rerunfilecheck.sty
  (.../atveryend-ltx.sty)
  (.../uniquecounter.sty)))
  (.../bkm-dvipdfm.def))
  (.../xurl.sty)
  (.../input.aux)
  *geometry* driver: auto-detecting
  *geometry* detected driver: xetex
  (.../mt-LatinModernRoman.cfg)
  (.../omllmm.fd)
  (.../umsa.fd)
  (.../mt-msa.cfg)
  (.../umsb.fd)
  (.../mt-msb.cfg)
  
  LaTeX Font Warning: Font shape `TU/ARPLUKaiCN(0)/b/n' undefined
  (Font)              using `TU/ARPLUKaiCN(0)/m/n' instead on input line 116.
  
  [1]
  
  Package xeCJK Warning: Unknown CJK family `\CJKttdefault' is being ignored.
  (xeCJK)                
  (xeCJK)                Try to use `\setCJKmonofont[<...>]{<...>}' to define
  (xeCJK)                it.
  
  [2] [3] (.../input.aux)
  
  LaTeX Font Warning: Some font shapes were not available, defaults substituted.
  
   )
  Output written on .../input.pdf (3 pages).
  Transcript written on .../input.log.