03 2019 档案
摘要:心态爆炸,打出gg。。。 A 爆long long fst了,B看错题半天然后又写挂一个细节 原地爆炸,差点炸出div1了qwq A. 考虑枚举走了几个完整段,分情况讨论一下 然后就是一个gcd 注意写的不好可能会爆long long 1 #include<bits/stdc++.h> 2 #def
阅读全文
摘要:题解:显然可以dp[i][j]表示到第i个,选了j个的最优解 单调队列优化 1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pii pair<ll,int> 4 #define mp(a,b) make_pair(a,b) 5 #
阅读全文
摘要:题解: 你能确定的集合一定是k个重量一样的,重量为m 然后考虑dp(j,k)为选了j个,重量和为k的方案,我们现在只需要判定唯一性,所以状态只有0,1,2三种 然后dp就行 坑点:1 1 1 1 1 2 2 2 2 2这种,可以全部确定 1 #include<bits/stdc++.h> 2 #de
阅读全文
摘要:题解: 考虑这个东西是带约束条件的完全背包 想办法把xi>xj的约束条件消掉 那么我们把限制条件(xi > xj)看成边 i -> j,连成有向图 发现这个有向图是一堆环和链 有环显然就GG了,然后我们只要考虑全是链的情况 考虑全是链,那么我们消掉约束条件就是每次原有权值加上所有前驱的权值 然后就是
阅读全文
摘要:题解: 考虑这个每个数字少个数是可二分的(答案关于个数单调) 然后我们dp dp[i][S]表示到第i个数,已选完的数字集合为S 转移是贪心取连续一段 预处理转移右端点可以降下复杂度 1 #include<bits/stdc++.h> 2 #define maxn 1005 3 using name
阅读全文
摘要:题解: 考虑数位DP,状压出现过的数字集合S,f ( l , x , S , pz , lim )表示到第 l 位,数字为x, 数字集合为S ,是否为前导0,是否贴上界 然后同时定义g为该状态下的数字和,利用 10^(l-1) * f(l , x, S, pz, lim)计算该位的贡献,然后加上所有
阅读全文
摘要:题解: 学习了一下区间并查集的姿势 区间并查集模板题 考虑暴力并查集维护相同的数字,方案数就是9*10^(cnt-1) (cnt为连通块个数) 然后考虑用ST表的方式维护并查集 fa[x][k]=y表示[x,x+(1<<k)-1]的区间与[y,y+(1<<k)-1]完全相同 每次merge一下就好了
阅读全文
摘要:A. 题解: 发现就是找前缀 max = i 的点的个数,暴力扫一遍 1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pii pair<int,int> 4 #define mp(a,b) make_pair(a,b) 5 usi
阅读全文
摘要:A. 题解:考虑最后一位的奇偶性就行 1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pii pair<int,int> 4 #define mp(a,b) make_pair(a,b) 5 using namespace std
阅读全文
摘要:题解: 能量值域很大,不好作为状态 因此我们可以将召唤的鸟的数目当作状态 这样我们可以轻松算出能量上限 W + j * B 然后我们现在是dp( i , j )表示到第 i 个树,召唤 j 个鸟的状态下拥有的最大能量值 然后随便转移下就好了 1 #include<bits/stdc++.h> 2 #
阅读全文
摘要:题解: 显然我们发现带两把及以上的伞不优 那么我们就带一把伞或不带 然后就很简单了 dp ( i , j ) 表示到 x = i 处,带了编号为 j 的伞( j = 0则为没带) 然后讨论一下转移就行了 1 #include<bits/stdc++.h> 2 #define pii pair<int
阅读全文
摘要:题解: 这东西就是分层DP 考虑dp ( i , j )表示到位置( i , j )的最短长度 然后可以枚举上一次的位置转移过来 这样单次转移复杂度和两层中点的数量有关 这样复杂度显然是O((nm)^2)的,爆炸 考虑另一种暴力,每次转移时bfs,这样单次转移复杂度O(nm) 考虑根号分治,当两层点
阅读全文
摘要:题解: 这题难度是怎么被评为2300的。。。 暴力 枚举左分界点,然后map统计右分界点 1 #include<bits/stdc++.h> 2 #define maxn 100005 3 #define ll long long 4 using namespace std; 5 int n; 6
阅读全文
摘要:题解: 我们考虑题目条件,相当于n个一段,连续k段中满足条件的子序列个数 枚举起始段是哪段,然后把n*k个数存下来,很容易DP 这个DP是dp[i]=∑(dp[j]) a[j]<=a[i],j在i的前一段 复杂度的话每段丢进树状数组,然后结束再删掉就好了 前面的重复段算一下有多少个,然后乘一下就好
阅读全文
摘要:题解: 显然括号只能在*旁边(左括号在*右边,右括号在*左边)才有意义 所以枚举括号位置,表达式求值check 表达式求值偷懒用了Py的eval 1 import math 2 s="*" 3 s=s+input() 4 s=s+"*" 5 n=len(s) 6 ans=0 7 for i in r
阅读全文
摘要:题解: 考虑dp[u][0/1]表示u的子树中有没有坏边的方案数, dp[u][0] = 1(显然必须全是好边) dp[u][1] = ∏ (dp[v][0] * 2 + dp[v][1]) - 1 (-1是全是好边的情况) 然后我们考虑这个dp[u][0]并没有必要单独设出来 令f[u] = dp
阅读全文
摘要:题解: 如果没有相同数字,那么我们把每行按数值从小到大连边,每列按数值从小到大连边,边权为1,然后拓扑序DP一下,每个点的值就是最长路的长度 现在有相同数字,怎么处理? 考虑我们同一行同一列的相同数字连双向边(不需要两两连边,只需要使其连通就行),边权为0 然后我们的图就变成了一个类似DAG但是里面
阅读全文
摘要:题解: 考虑我们休息的时间一定在连续的一段,因此我们可以忽略走连续的一段; 但直接这样做并不对,因为前面会有影响(比如前面有一段通话占的时间很长,把后面时间挤掉了) 我们dp[i][j]表示到第i个电话忽略了j个的最短结束时间,转移就行 然后我们枚举状态,从结束的i开始选k-j个删掉,算一下答案取最
阅读全文
摘要:题解: 考虑DP dp[i]表示前i项里面以a[i]结尾的本质不同的子序列的权值和 考虑如何不重不漏的转移 我们倒着枚举j,如果这是第一次出现a[j],则他包括了1~j中所有以a[j]结束的本质不同的子序列; 如果不是第一次出现a[j],那么之前已经考虑过a[j]了,这部分和前面考虑过的部分本质相同
阅读全文
摘要:题意: 给定n个数,你要选一些区间,每次区间+1,把这n个数都变成h 对任意两个区间,L1!=R1且L2!=R2 题解: 考虑每个位置只能不放,放一个区间左端点,放一个区间右端点,放一个左端点和一个右端点; 因此我们dp(i,j)表示到第i个,i和i+1之间被j个区间覆盖的方案数 讨论一下四种情况转
阅读全文
摘要:题意:给定n个数和一个k,可以改变k个值,最小化相邻两项的差的绝对值的最大值 题解: 最大值最小,可以考虑二分答案; 然后考虑保留哪些关键点不变,dp[i]表示第i个点不变, 如果abs(a[i]-a[j])<=x*(i-j),则我们可以从第j个点转移过来,中间的点分布在线段IJ上 然后看是否超过k
阅读全文
摘要:题意: 给你一个长为n的正整数数组,你要选一个连续子序列,对其每个元素加上正号或者负号,使其和为0,求方案数 题解: dp( i , j , k )表示dp到第i个,和为j,这个元素是选了正还是负 滚动数组优化 1 #include<bits/stdc++.h> 2 #define ll long
阅读全文
摘要:题解: 设当前上界为m,a为满足a^3<=m的最大的a; 考虑当前可以选的数不超过a,上界为m: 如果要选(a-k)时,上界应该调整到(a-k+1)^3-1; 显然可以选a; 当选(a-1)时,如果上界-(a-1)^3<m-a^3时,肯定是a更优,不用考虑a-1;否则a-1可能更优; 我们下面来证明
阅读全文
摘要:题意: 给定n,k和数组A,重排数组A,最小化 。 题解: 考虑这个东西是隔k个取一个,所以我们把下标按照mod k分类,分成k组 显然每组内部尽量最小化max-min,所以我们考虑给A排序,然后选连续的一段。 显然这k组中有A个size为M,B个size为M+1 所以我们dp[i][x,y]表示选
阅读全文
摘要:题解: 先用hash或者KMP预处理匹配位置; 考虑dp[i]表示以i结尾的方案数,如果 [ i-m+1 , i ]不能匹配上,那么 dp[i]=dp[i-1] 否则dp[i]=(i-m+1)+sum[i-m]+sum[i-m-1]+……+sum[0] (前面部分是新开一个串,后面表示接一个串上去)
阅读全文

浙公网安备 33010602011771号