10 2020 档案
摘要:传送门 解题思路 用f[i]表示已经买了i种,到买齐邮票的期望买的张数。 用g[i]表示已经买了i种,到买齐邮票的期望花的价格。 所以 f[i]=(f[i]+1)*(i/n)+(f[i+1]+1)*((n-i)/n) g[i]=(g[i]+f[i]+1)*(i/n)+(g[i+1]+f[i+1]+1
阅读全文
摘要:传送门 解题思路 用a[i]表示第i位为1的x^1的期望; 用b[i]表示第i位为1的x^2的期望; 用ans[i]表示前i位的x^3的期望。 显然的是, a[i]=(a[i-1]+1)*p[i]。 b[i]=(b[i-1]+2*a[i-1]+1)*p[i]。 ans[i]=(ans[i-1]+3*
阅读全文
摘要:传送门 高斯消元 什么叫高斯消元? 就是解多元方程组的一种方法。 给你n个方程组,包含着n个未知数,告诉你每一个方程中的每一个未知数的系数和常数项。 怎么解? 和数学上差不多,把第一个方程保留第一个未知数(设系数为k),把第二个到第n个方程的第一个未知数的系数化为-k,用加减消元即可。 以此类推,枚
阅读全文
摘要:直接放 论文网址: 百度文库 个人总结与体会: 两种方法,一种是O(s^2),s为障碍点个数。一种是O(n*m),一般使用第二种会快一点。 垂线法运用了贪心思想,枚举的垂线都尽可能向两边拓展,O(n*m)枚举,O(1)求解(提前预处理)。
阅读全文
摘要:传送门 解题思路 自己一开始做的时候知道是dp,但是设计的状态总是有后效性的(看来还是做题少了),看完题解才恍然大悟。 设dp[u][i][j]表示以u为根的子树,选取前i个儿子,用户数为j的最大利润,用类似区间dp的性质,dp[u][i][j]可以从dp[u][i-1][j-k]+dp[v][si
阅读全文
摘要:问题表述 对于(int)90*0.7,在float下会算出63,而在double下则会取得62。 根本原因 double和float的精度不同,因而对于数字的保存不同,例如0.7在double下会有一个小项,导致存储是是63-(一个很小的数),所以在取int时(舍弃低位),就会变成62。 有些时候f
阅读全文
摘要:传送门 解题思路 用dp[i][0]表示第i个节点染绿色的以i为根的子树的最大(最小)染绿色总数,dp[i][1]表示染红色,dp[i][2]表示染蓝色。 各种情况转移即可。 写完代码后发现,dp[i][1]和dp[i][2]相等,所以其实可以合并起来,这样能少许多代码量。 AC代码 1 #incl
阅读全文
摘要:传送门 解题思路 对于每一条路,很显然只有两种情况,一种是走一次,一种是走无限次,而第二种情况的条件是这条边在一个环中。 所以先用Tarjan缩点,每个点的权值更新为这个环上所有边一直摘的蘑菇数的和。 然后跑一边既有边权也有点权的DAG上的dp即可。 //数据有锅,后四个点答案有误,用double存
阅读全文
摘要:传送门 缩点 在一个有向图上缩点就是指把有向图上的环变成一个点。 具体实现用Tarjan。 先求强联通分量,每次遇到新点是把这个点进栈,最后若dfn[i]==low[i]则i这个点一定在环上,而且栈中i之后进入的元素也在这个环上(证明略)。 即一直出栈,知道出栈元素等于i。在出栈过程中维护信息即可。
阅读全文
摘要:传送门 解题思路 g[i][j][k]表示i到j这个点有没有长度为2^k的路径,若有为1,若没有为0。答案可以由g[i][x][k-1]&&g[x][j][k-1]更新(Floyd传递闭包)。 倍增求一遍后,把所有g[i][j][k] = 1 的 i j之间连一条长度为1的边(因为可以一步到达)。
阅读全文
摘要:传送门 解题思路 很显然的树形dp,设dp[i][j]表示在子树i上保留j条边的最大苹果树,从儿子节点转移过来即可,注意若某个儿子不选,则以此儿子为根的子树都不能选。 还有就是因为是二叉树,可以提前遍历一遍求出每个点的两个或零个儿子,就不用在求dp时倒序枚举了,算是一个小技巧趴。 AC代码 1 #i
阅读全文
摘要:传送门 解题思路 显然是区间dp,判断a[i]是否等于a[j],然后再枚举中间节点k即可。 关键是玄学错误: 一份代码提交后间接性AC? (就是一会显示AC,一会再提交就WA掉,一会又AC?) 莫非是因为用了班主任名字当变量? AC记录 WA记录 感谢 @rcxkk 解答并提供hack数据。 32行
阅读全文
摘要:传送门 解题思路 每行互不影响,所以分开处理,对于每一行,很显然是个区间dp,我们用dp[i][j]表示区间[i..j]的得分和的最大值,注意每次加一个数的顺序是先加上数再集体乘2。 恶心的地方在于需要写高精(学校比赛懒得写,所以只拿了60分),需要一个高精度+int,一个高精度*2,一个高精度+高
阅读全文
摘要:传送门 解题思路 很显然是dp(因为标签是dp)。 设dp[i][j]表示放到第i个原料,放完后的原料数量为j个最大的耐久度。 可以用dp[i-1][k]转移而来,其中k:j-1<=k<=min(w,j+s-1)。 你发现了什么,可以用单调队列优化! 即维护一个长度为s的单调队列。 //把这个题当做
阅读全文
摘要:传送门 解题思路 因为可以大整数分解为l*10k+(l+1)*10k-1+(l+2)*10k-3+……+r*100,而10k%9=1,所以原整数在模9意义下等于l+(l+1)+(l+2)+(l+3)+……+r=(l+r)*(r-l+1)/2。 因为有除法,所以我们算出2在%9意义下的逆元为5,即可解
阅读全文
摘要:传送门 解题思路 设dp[i][j]表示选出了第i个电塔,上一个选出的是第j个电塔的方案数。 枚举i,j,转移方程为: 找一个k,使得h[k],h[j],h[i]构成等差数列,并且k<j。 dp[i][j]+=dp[j][k]; 对于确定的i,j,h[k]是确定的,所以我们可以用vector a[i
阅读全文
摘要:传送门 解题思路 先说我的思路:枚举中间的那个人,然后在左边序列、右边序列分别做一次LIS,时间复杂度为n^3。 看题解后才发现有更优的做法,我们可以先预处理出正向和反向的LIS,然后枚举i统计答案即可,时间复杂度为n^2。 AC代码 1 #include<iostream> 2 #include<
阅读全文
摘要:传送门 解题思路 先按照l为第一关键字,w为第二关键字从大到小排序,保证前面的l一定比后面的大于等于,这样就能排除一维影响。 然后问题就变成了在排好序的序列中找最长不上升子序列的个数,根据狄尔沃斯定理(导弹拦截定理),我们得知最长不上升子序列的个数就等于最长上升子序列的长度。 所以这里O(n^2)求
阅读全文
摘要:传送门 解题思路 因为正序不好推,所以我们倒序: dp[i]表示从时间i到最终时刻n的最大休息时间,所以我们可以推出以下的状态转移方程: 若i时刻无任务,则dp[i]=dp[i+1]+1; 若i时刻有至少一个任务,则枚举这些任务k,dp[i]=dp[a[k]+b[k]];(a,b为题目中读入的每个任
阅读全文
摘要:传送门 解题思路 很显然的LIS板子题,找一个最长不上升子序列和最长上升子序列即可。 关于LIS(O(n^2)和O(nlogn)) AC代码 1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstdio>
阅读全文
摘要:传送门 解题思路 很显然的一道类似01背包的dp,每个人选择打或不打。 状态转移方程为 dp[i][j]=max(dp[i-1][j]+lose[i],dp[i-1][j-num[i]]+win[i]) 但这个题还是比较细节的,要注意一下几点: 数组要用long long,否则最后一个点会炸(因为答
阅读全文
摘要:传送门 解题思路 显然的用到类似树形dp的思想,在一个有向无环图上做dp。 状态转移方程就是dp[v]加起来。 AC代码 //其实不用long long也可以 1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #includ
阅读全文
摘要:传送门 解题思路 首先可以dp做,把数据离散化后dp[i]表示到i位置的最多区间数。 把所有区间按照右端点排序从左往右排序,求dp[i]就用右端点为i的区间更新答案。 状态转移可以看代码。 这种做法常数较大,我们还可以用贪心解此题。 我们依旧按照右端点排序,从左往右枚举所有区间,如果当前区间与前面没
阅读全文
摘要:传送门 解题思路 我们先考虑k==1的情况,这时候一定选取的是树的直径的两个端点。 因为不加这条新路每个边一定走两次,加上了之后道路两个端点之间的路径只需走一遍,所以贪心思想,一定是选取最长的路径的两个端点,即树的直径。 再考虑k==2的情况,一种情况是新加的道路的两个端点之间的路径与加的第一条边两
阅读全文
摘要:传送门 解题思路 先看一下数据范围,a、b、c都是10^6,所以大体推断出做法时间复杂度约为nlogn。 根据axy=(ax)^y,所以ab!=(((((a^1)^2)^3)^4)^……)^b。 用底数变化的快速幂(O(logb))做b次即可。 或者对指数b!做一些处理—— 我们知道指数b!一定不能
阅读全文