UOJ 序列中的每个位置是等价的.直接令\(f[i][j]\)表示,\(i\)个数的序列,最大值不超过\(j\)的所有序列每个长为\(k\)的子区间最大值的乘积的和. 由\(j-1\)转移到\(j\)时,考虑枚举第一个\(j\)出现在哪里.设最左边的\(j\)在\(p\)位置,那么会对左端点在\([\max(1,p-k+1),\ \min(p,i-k+1)]\)的每个\(k\)区间造成\(w[j]\)的贡献,也就是\(w[j]^{len}\).\(p\)左边没出现过\(j\),贡献是\(f[p-…
[UOJ#311][UNR #2]积劳成疾(动态规划) UOJ Solution 考虑最大值分治解决问题.每次枚举最大值所在的位置,强制不能跨过最大值,左右此时不会影响,可以分开考虑. 那么设\(f[i][j]\)表示长度为\(i\),且最大值不超过\(j\)的所有方案之和. 因为最大值有多个,所以我们钦定每次选择最靠右的那个,所以转移就是: \[f[i][j]=f[i][j-1]+\sum_{k=1}^if[k-1][j]*f[i-k][j-1]*w[j]^{c}\] 即钦定为最靠右的那个最大…
需要锻炼$ DP$能力 UOJ #311 题意 等概率产生一个长度为$ n$且每个数在[1,n]间随机的数列 定义其价值为所有长度为$ k$的连续子数列的最大值的乘积 给定$ n,k$求所有合法数列的价值和 题解 设$ f(x,y)$表示长度为$x$的数列中,最值不超过$ y$的所有数列的价值和 若数列的最值不是$ y$则$ f(x,y)=f(x,y-1)$ 否则枚举最左边的最值位置,设为位置$ i$ 则$ f(x,y)$可由$f(i-1,y-1)·w(y)^{calc(i)}·f(x-i,y)…
[UOJ#246]套路(动态规划) 题面 UOJ 题解 假如答案的选择的区间长度很小,我们可以做一个暴力\(dp\)计算\(s(l,r)\),即\(s(l,r)=min(s(l+1,r),s(l,r-1),abs(a_r-a_l))\). 我们发现\(s(l,r)\le \frac{m}{r-l+1}\),那么当长度足够大的时候\(s(l,r)\)的取值很小. 所以我们对于询问分治处理,当长度小于\(\sqrt m\)时,直接\(dp\)计算贡献. 否则,当长度大于\(\sqrt m\)时,枚举…
题目描述 一个长度为 $n$ 的序列,每个数在 $[1,n]$ 之间.给出 $m$ ,求所有序列的 $\prod_{i=1}^{n-m+1}(\text{Max}_{j=i}^{j+m-1}a[j])$ 的总和,即对所有序列求每个长度为 $m$ 的子区间的最大值乘积之和.答案对 $998244353$ 取模. $m\le n\le 400$ . 题解 dp 设 $f[i][j]$ 表示长度为 $i$ 的序列,每个数都在 $[1,j]$ 之间的所有序列每个长度为 $m$ 的子区间最大值乘积之和.…
传送门 果然\(dp\)题就没咱啥事儿了 设\(f_{i,j}\)为长度为\(i\)的区间,所有元素的值不超过\(j\)的总的疲劳值 如果\(j\)没有出现过,那么\(f_{i,j}=f_{i,j-1}\) 如果\(j\)出现过,我们考虑枚举\(j\)第一次出现的位置\(k\),设包含那个位置的长度为\(m\)的区间个数为\(c\),那么这里\(j\)的贡献就是\({w_j}^c\),前面没有\(j\),是\(f_{i-1,j-1}\)后面可能还有\(j\),是\(f_{i-k,j}\) 综上,…
题目 考虑直接顺着从\(1\)填数填到\(n\)发现这是在胡扯 所以考虑一些奇诡的东西,譬如最后的答案长什么样子 显然某一种方案的贡献是一个\(\prod_{i=1}^nw_i^{t_i}\)状物,\(t_i\)表示\(i\)在多少个长度为\(m\)的区间里为最大值 而这里又是最大值,所以可以考虑从大到小填数,每次把填完之后相应的分裂区间,同时在这个时候也可以计算一些贡献 于是我们设\(f_{l,r,k}\)表示对于区间\([l,r]\)最大值为\(k\),我们枚举这个最大值最后一次出现的位置,…
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 区间最大值的题emmmm 想到构建笛卡尔树,这样自然就想到了一种dp f[i][j]表示大小为i的笛卡尔树,根的权值是j的答案. 转移的时候枚举左右子树的大小,对权值那一维前缀和转移. 然后在每次转移的时候,把已经可以确定最大值的段的贡献乘进去就可以了. #include<iostream> #include<cstdio> #define MN 400 #define mod 998244353 using nam…
全然背包 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 直接说题意,全然背包定义有N种物品和一个容量为V的背包.每种物品都有无限件可用.第i种物品的体积是c,价值是w. 求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大.本题要求是背包恰好装满背包时,求出最大价值总和是多少. 假设不能恰好装满背包,输出NO 输入 第一行: N 表示有多少组測试数据(N<7).  接下来每组測试数据的第一行有两个整数M.V. M表示物品种类的数目,V表示…
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 c_ici​ 上课,而另一节课程在教室 d_idi​ 进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 nn 节安排好的课程.如果学生想更换第 ii 节课程的教室,则需要提出申请.若申请通…
题目链接 uojUNR3B 题解 如果不输出方案,是有一个经典的三分做法的 但是要输出方案也是可以贪心的 设\(d[i]\)为\(i\)节点到最深的儿子的距离 贪心选择\(d[i]\)大的即可 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<q…
题目链接 \(Description\) 选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大. \(Solution\) 先把物品按s排序就可以直接判断后一项. 我们发现当要判断的区间的长度\(\leq m\)时,区间内的所有数都要选(后一项都确定了). 当区间长度\(>m\)时,自然是选\(v\)最大的\(m\)个.可以用链表把\(v\)最小的逐个删去. 发现删掉\(x\)的话我们只需要用\(x\)附近\(m\)个数更新答案…
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noip前的杂题训练,我也很无奈啊 做完了的扔最后,欢迎好题推荐 这么多题肯定是完不成了,能多做一道是一道吧 DP yyb真是强得不要不要的辣:http://www.cnblogs.com/cjyyb/category/1036536.html [ ] [SDOI2010]地精部落 https://www…
[UOJ#390][UNR#3]百鸽笼(动态规划,容斥) 题面 UOJ 题解 发现这就是题解里说的:"火山喷发概率问题"(大雾 考虑如果是暴力的话,你需要记录下当前每一个位置的鸽笼数量,因为概率会随着你空的鸽笼的数量而变化. 我们可以把这个问题转变为给一个长度为\(N\)的序列填数的问题. 直接算似乎不是很好算(因为直接算是要钦定在最后,那么其他的东西放满之后每个位置被选择的概率会被改变),我们把最后一个被填满的恰好是\(i\),变成至少有一个集合\(S\)在\(i\)后面被填满. 因…
[UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\)次攻击,还剩下的\(1,2,3\)血的奴隶主个数为\(a,b,c\)的概率,每次考虑打到了哪里,做一个转移. 这样子,状态数就是把不超过\(8\)个东西分配到\(3\)个集合中,状态有\(165\)种,再加一个状态记录糊脸上的期望,也就是\(166\)个状态. 直接矩乘优化,那么单次的复杂度就是\(…
[uoj#310][UNR #2]黎明前的巧克力 FWT - GXZlegend - 博客园 f[i][xor],考虑优化暴力,暴力就是FWT xor一个多项式 整体处理 (以下FWT代表第一步) FWT之后,一定只有-1,3 而FWT的和等于和的FWT 所以做和,然后FWT一下 列方程就可以得到每一位的-1和3的个数了 而对于一些多项式,分别FWT.IFWT和FWT后乘起来再IFWT是一样的 我们已经快速幂得到n个多项式FWT的乘积了 再做一次IFWT即可 还是想到FWT集体处理,必然要注意顺…
UOJ #390. [UNR #3]百鸽笼 题目链接 看这道题之前先看一道相似的题目 [PKUWC2018]猎人杀. 考虑类似的容斥: 我们不妨设处理\(1\)的概率. 我们令集合\(T\)中的所有鸽笼都在\(1\)变空之前不为空的,其它的鸽笼随便.要做到这一点,我们只需要令每个\(T\)集合中的鸽笼容量\(--\)就行了.然后我们用背包背出所有序列的方案数(不包括\(1\)),然后在将\(1\)插入序列中.插入时,将\(w_i-1\)个随便插入,然后再将一个放在序列末尾. 具体实现时,我们可以…
[UOJ#275]组合数问题(卢卡斯定理,动态规划) 题面 UOJ 题解 数据范围很大,并且涉及的是求值,没法用矩阵乘法考虑. 发现\(k\)的限制是,\(k\)是一个质数,那么在大组合数模小质数的情况下可以考虑使用卢卡斯定理. 卢卡斯定理写出来是\(Lucas(n,m)=Lucas(n/K,m/K)*Lucas(n\%K,m\%K)\) 显然只要有任何一个\(Lucas(n\%K,m\%K)=C_{n\%K}^{m\%K}\)是\(K\)的倍数那么当前数就会是\(K\)的倍数.因为\(K\)是…
[BZOJ4903][UOJ#300]吉夫特(卢卡斯定理,动态规划) 题面 UOJ BZOJ:给的UOJ的链接...... 题解 首先模的质数更小了,直接给定了\(2\).当然是卢卡斯定理了啊. 考虑一个组合数在什么情况下会是一个奇数.\(Lucas(n,m)\equiv Lucas(n/2,m/2)*Lucas(n\%2,m\%2)\).后面这个东西一共只有\(4\)种取值,我们大力讨论一下:\(C_{0}^0=1,C_{0}^1=0,C_1^0=1,C_1^1=1\).既然是一个奇数,证明\…
链接:http://uoj.ac/contest/40/problem/311 题解: 一道很好的期望题吧 用dp的老思路,枚举最大值将序列分割 想到这个就很简单了 状态f[i][j]表示前i个,最大值为j f[i][j]=sigma(sigmaf[k][j-1]*sigmaf[i-k][j]*j^贡献次数) 然后显然这个可以前缀和优化一下 写代码莫名其妙写了+=mo 代码: #include <bits/stdc++.h> using namespace std; #define N 500…
题目传送门 戳此处转移 题目大意 给定一个长为$n$的序列,问它有多少个长度大于等于2的子序列$b_{1}, b_{2}, \cdots, b_{k}$满足$\prod_{i = 2}^{k}C_{b_{i - 1}}^{b_{i}} \equiv 1 \pmod{2}$.答案模$10^{9} + 7$ 考虑限制条件,即前后两个数$b_{i - 1}, b_{i}$,它们要满足$C_{b_{i - 1}}^{b_{i}} \equiv 1\pmod{2}$. 这样不好处理,考虑使用Lucas定理…
传送门:http://uoj.ac/problem/311 [题解] 这题的期望dp好神奇啊(可能是我太菜了) 由于每个位置都完全一样,所以我们设$f_{i,j}$表示审了连续$i$个位置,最大值不超过$j$的期望. 那么只要考虑最大值为$j$的期望,其他从$f_{i,j-1}$加进来即可. 枚举最大值第一次出现的位置$p$(如果位置编号为$[1,i]$的话,因为位置都等价,所以可以这样做) 然后考虑$p$一定对于这些区间有贡献$[\max(1, p-K+1), \min(i-K+1, p)]$…
[UOJ#50][UR #3]链式反应(分治FFT,动态规划) 题面 UOJ 题解 首先把题目意思捋一捋,大概就是有\(n\)个节点的一棵树,父亲的编号大于儿子. 满足一个点的儿子有\(2+c\)个,其中\(c\in A\),且\(c\)个儿子是叶子,另外\(2\)个存在子树,且两种点的链接的边是不同的,求方案数. 那么就考虑一个暴力\(dp\),设\(f[i]\)表示有\(i\)个节点的树的个数. 那么枚举它两个有子树的子树大小,然后把编号给取出来,得到: \[f[i]=\frac{1}{2}…
[UOJ#310][UNR#2]黎明前的巧克力(FWT) 题面 UOJ 题解 把问题转化一下,变成有多少个异或和为\(0\)的集合,然后这个集合任意拆分就是答案,所以对于一个大小为\(s\)的集合,其贡献是\(2^s\). 于是我们可以弄出若干个\((1+2x^{a_i})\)这样子的多项式,然后异或卷积把它们卷起来就是答案. 根据\(FWT\)异或卷积的理论,如果\(i\)位置有一个\(1\),那么\(FWT\)之后对于\(j\)位置的贡献是\(-1^{pop\_count(i\&j)}\).…
[UOJ#308][UNR#2]UOJ拯救计划 题面 UOJ 题解 如果模数很奇怪,我们可以插值一下,设\(f[i]\)表示用了\(i\)种颜色的方案数. 然而模\(6\)这个东西很有意思,\(6=2*3\),所以我们只需要考虑其模\(2\)和模\(3\)的结果了. 而最终答案的贡献是\(\sum_{i=1}^k A_{k}^i f[i]\),当\(i\ge 3\)的时候\(6|A_k^i\),所以我们只需要知道\(f[0],f[1],f[2]\)的值. \(f[0]\)的值?当然是\(0\)啊…
[UOJ#389][UNR#3]白鸽(欧拉回路,费用流) 题面 UOJ 题解 首先第一问就是判断是否存在一条合法的欧拉回路,这个拿度数和连通性判断一下就行了. 第二问判断转的圈数,显然我们只需要考虑顺时针过一条从源点出发的射线的次数减去逆时针过的次数就好了. 于是我们就要在欧拉回路合法的基础上算第二问. 首先如果欧拉回路合法,那么每个点的入度要等于出度,这个东西有点类似上下界网络流,即强制了每个点的度数的上下界.我们可以类似上下界网络流,先给每条边强行定向,对于入度出度差不为令的点,分别和源点和…
[UOJ#388][UNR#3]配对树(线段树,dsu on tree) 题面 UOJ 题解 考虑一个固定区间怎么计算答案,把这些点搞下来建树,然后\(dp\),不难发现一个点如果子树内能够匹配的话就一定会匹配完,所以\(dp\)可以做到线性. 那么根据上面的\(dp\)方式,一条边会被匹配到,当且仅当把这条边删掉之后,两个连通块内分别有奇数个目标点.那么如果我们考虑枚举每一条边,然后把子树内的点给标记一下,于是变成了在原序列上求有多少个偶数区间满足有偶数个点被标记,这个问题可以做一个前缀和,把…
[UOJ#386][UNR#3]鸽子固定器(贪心) 题面 UOJ 题解 一个不难想到的暴力做法是把东西按照\(s\)排序,这样子我们枚举极大值和极小值,那么我们选择的一定是这一段之间\(v\)最大的那\(m\)个东西. 考虑优化这个过程,我们枚举右端点,左端点向左移动,每次插入一个元素,用堆来维护选择的过程.这样子复杂度可以做到\(O(n^2logn)\). 考虑继续优化这个过程,首先如果右端点一旦被弹出堆这个过程就可以终止了,这个很显然. 通过这个过程,我们也可以明白如果选择的个数不超过\(m…
[UOJ#76][UR #6]懒癌(动态规划) 题面 UOJ 题解 神....神仙题. 先考虑如果是完全图怎么做... 因为是完全图,所以是对称的,所以我们只考虑一个有懒癌的人的心路历程. 如果只有一只狗有懒癌:第一天,看了看,似乎其他的狗都没有,但是村子里至少有一只狗有,然后就确定了. 如果有两只狗:第一天,看了看,有一只别的狗有懒癌,不确定:第二天,昨天有懒癌的那只狗还活着,证明他不能确定,所以他还看到了别的狗有懒癌,而除了自己的未知和那个有懒癌的人,别的人的狗都没有懒癌,所以自己的狗有懒癌…
[UOJ#22][UR #1]外星人(动态规划) 题面 UOJ 题解 一道简单题? 不难发现只有按照从大往小排序的顺序选择的才有意义,否则先选择一个小数再去模一个大数是没有意义的. 设\(f[i][j]\)表示考虑了前\(i\)个数,模完之后是\(j\)的方案数. 转移的时候枚举这个数是模还是不模,如果不模的话就要把它放到后面某个小数的后面,方案数是\(n-i\). #include<iostream> #include<cstdio> #include<cstdlib>…