摘要: 题面:小澳的葫芦【 题目描述】小澳最喜欢的歌曲就是《葫芦娃》。一日表演唱歌,他尽了洪荒之力,唱响心中圣歌。随之,小澳进入了葫芦世界。葫芦世界有 n 个葫芦,标号为 1~ n。 n 个葫芦由 m 条藤连接, 每条藤连接了两个葫芦, 这些藤构成了一张有向无环图。小澳爬过每条藤都会消耗一定的能量。小澳站在 阅读全文
posted @ 2019-09-07 15:57 神之右大臣 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 题面 注意到每次只染色一行或者一列,那么我们最后输出第i行第j列的数字是多少的时候只需要看一下最后一次i行和第j行被染了什么颜色,所以我们需要对每一行和一列记录最后一次染色的颜色。 但是我们也需要比较是行比列后染色还是列比行后染色,所以我们还需要记录一下每行每列染色的最后时间。 然后模拟即可 阅读全文
posted @ 2019-09-07 15:50 神之右大臣 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 题面 显然,n有n个位置可以选择,我们先来考虑两边的位置。 如果插入到最左边,会造成新的序列比原来多一个大于号 如果插入到最右边,会造成新的序列比原来多一个小于号 如果插入到大于号的位置,删去一个大于号,多一个大于号一个小于号,也就是多一个小于号 如果插入到小于号的位置,删去一个小于号,多一个大于号 阅读全文
posted @ 2019-09-04 16:09 神之右大臣 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 题面 好题啊!~ 设f[i][j][k][l]表示已经处理完前i个请求后,a在j,b在k,c在l的最小值是多少; 那么f[i][p[i]][k][l]=min(f[i][p[i]][k][l],f[i-1][j][k][l]+c(j,p[i])); f[i][j][p[i]][l]=min(f[i] 阅读全文
posted @ 2019-09-03 15:51 神之右大臣 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 题面 好难啊好难啊好难啊~(以后再玩魔兽的时候绝对绝对虐死他) 做完后总结了一下思路; 首先推一下以下三条性质: 1.若两个 i 与 i+1 不相邻,那么我们直接交换这两个数字就可以组成一个新的数列 (这一条便是我们状态转移的依据) 2.每个数字ai 变成 (n+1)-ai 会得到另一个数列,且新数 阅读全文
posted @ 2019-09-01 17:24 神之右大臣 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 题面 引理1: 1~n中的最大反质数,就是1~n中约数个数最多的数中最小的一个(因为要严格保证g(x)>g(i)); 引理2:1~n中任何数的不同因子不会超过10个,因为他们的乘积大于2,000,000,000; 引理3: 1~n中任何数的质因子的指数总和不超过30; 引理4: x的质因子是连续的若 阅读全文
posted @ 2019-09-01 15:11 神之右大臣 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 题面 这道题是一道整除分块的模板题; 首先,知道分块的人应该知道,n/i最多有2*sqrt(n)种数,但这和余数有什么关系呢? 注意,只要n/i的值和n/(i+d)的值一样,那么n%i到n%(i+d)的值就是一个等差数列!因为n/i=n/(i+1)*(i+1)=n/i*(i+1)=n/i*i+n/i 阅读全文
posted @ 2019-09-01 14:14 神之右大臣 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 题面 裸的树上背包: 设f[u][i]表示在以u为子树的树种选择i条边的最大值,则:f[u][i]=max(f[u][i],f[u][i-j-1]+f[v][k]+u到v的边权); 阅读全文
posted @ 2019-08-31 15:46 神之右大臣 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 题面 这是一道标准的带反悔贪心; 利用大根堆来维护最大值: 当选择了num[i]后,反悔了,反之选择选了num[i-1]和num[i+1]时获利便增加了num[i-1]+num[i+1]-num[i]。 所以当num[i]被选时,我们就可以删去num[i-1]和num[i+1],并把num[i]改成 阅读全文
posted @ 2019-08-31 14:48 神之右大臣 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 题面 lcm(x,y)=xy/gcd(x,y) lcm(x1,x2,···,xn)=lcm(lcm(x1,x2,···,xn-1),xn) 阅读全文
posted @ 2019-08-31 13:35 神之右大臣 阅读(297) 评论(0) 推荐(0) 编辑
摘要: 题面 我来一发很实用的题解;本人想出了O(n)的做法,是一种DP;先说大体思路:答案分两种情况,一种是选择的两段均不跨越n到1(也就是环),另一种是选择的两段跨过了环;如果均不跨越环,那么也就是意味着这是一道模板题;设maxl[i]表示从1~i的最大字串和,maxr[i]表示i~n的最大字段和;很明 阅读全文
posted @ 2019-08-31 13:29 神之右大臣 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 题面 注意一个细节,查询和更新都需要pushdown(); 阅读全文
posted @ 2019-08-30 16:03 神之右大臣 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 求1~n的n/i的总和: 我们会发现:总会有很多的(n/l)~(n/r)的值是重复的,所以我们可以寻找这样的区间; 即:n/i=n/(i+d) 我们要干的就是在O(1)的时间复杂度内找出这个d 阅读全文
posted @ 2019-08-30 12:00 神之右大臣 阅读(448) 评论(0) 推荐(0) 编辑
摘要: 题面 这道题是一道隐藏的比较深的DP(我太蒟蒻了!) 设f[i][j]表示到第i列时高度为j的最少步数是多少; 求上升时的方案就是一个完全背包!,求下降时的方案就是一个01背包; 然后处理边界就能A掉; 阅读全文
posted @ 2019-08-30 11:33 神之右大臣 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 题面 并查集处理问题的基本思路:如果不是强制在线那么可以倒着处理,把删边改为可爱的加边,然后使用并查集来判断是否联通; 所以可以较为轻松的写出AC代码: 阅读全文
posted @ 2019-08-29 15:24 神之右大臣 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 题面 一道思维难度不大的状态压缩,也并不卡常,但细节处理要格外注意; f[i][j]表示前i行最后一行状态是j的方案数 阅读全文
posted @ 2019-08-26 15:48 神之右大臣 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 题面 一个树形DP, f[i]=表示以i为根可以得到的子树个数; 则f[i]*=(f[j]+1); 初始化f[i]=1; ans=sigma(f[i]); 阅读全文
posted @ 2019-08-26 14:00 神之右大臣 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 题面 挺有意思的。 设f[i]表示gcd(i,j)=i的个数,g[i]表示k|gcd(i,j)的个数; g[i]=(n/i)*(n/i); g[i]=f[i]+f[2i]+f[3i]+...; 所以f[i]=g[i]-f[2i]-f[3i]-f[4i]-...... 阅读全文
posted @ 2019-08-24 15:23 神之右大臣 阅读(116) 评论(0) 推荐(0) 编辑
摘要: 题面 状态可能不太好想,设f[i][j][k]表示前i行其中有j行是放一个炮,有k行是放两个炮的合法方案数; 那么: f[i+1][j][k]+=f[i][j][k] 在这一行不放任何棋子; f[i+1][j+1][k]+=f[i][j][k]*(m-k-j); 在剩余的m-k-j个空行中随机选择一 阅读全文
posted @ 2019-08-22 20:45 神之右大臣 阅读(219) 评论(0) 推荐(0) 编辑
摘要: 题面 这道题我觉得是个不错的题; 根据题意可以较清晰的发现ans只和n和k有关;(因为输入的只有这两个数啊~); 那么设f[i][j]表示前i层用了j个节点的方案数,g[i][j]表示深度小于等于i并且用了j个节点的方案数总和; 对于一颗树,可以把它分成3部分:根节点,左字树,右子树; 对于一颗深度 阅读全文
posted @ 2019-08-22 19:58 神之右大臣 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 题面 设f[i][j][k][l]为从小渊传到小轩的纸条到达(i,j),从小轩传给小渊的纸条到达(k,l)的路径上取得的最大的好心程度和。 f[i][j][k][l]=max( f[i][j-1][k-1][l] , f[i-1][j][k][l-1] , f[i][j-1][k][l-1] , f 阅读全文
posted @ 2019-08-22 18:53 神之右大臣 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 题面 对于m==1和m==2两种状态进行不同的dp; 设sum[i][1]表示第一列的前缀和,sum[i][2]表示第二列的前缀和; sum[i][1]=sum[i-1][1]+a[i][1]; sum[i][2]=sum[i-1][2]+a[i][2]; 当m=1时, 设f[i][j]表示前i个数 阅读全文
posted @ 2019-08-22 17:21 神之右大臣 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 题面 大家都是两遍SPFA吗?我这里就一遍dp啊; 首先判断对于一个点u,是否可以从一号点走到这里,并且可以从u走到n号点; 对于这样的点我们打上标记; 那么抛出水晶球的点一定是从打上标记的点中选出一个;(自己可以理解一下) 然后跑一遍dp,dp[i]表示从点1到点i的若干条路径中,所经过的点的权值 阅读全文
posted @ 2019-08-21 15:58 神之右大臣 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 题面 先反向建边,这样以t为源点一遍bfs即可判断出哪个点不可以到达t点; 然后正向建边,以s为源点再一遍bfs计算距离;对于一个点u枚举其叶子结点v来判断u的子节点是否可以直接或间接到达t; 阅读全文
posted @ 2019-08-20 19:07 神之右大臣 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 题面 提前知识:gcd(a/d,b/d)*d=gcd(a,b); lcm(a,b)=a*b/gcd(a,b); 那么可以比较轻松的算出:gcd(x/a1,a0/a1)==gcd(b1/b0,b1/x)==1; 那么我们求解的x仅仅从b1的因数中挑选就可以,x要符合以上条件且x%a1==0; 时间复杂 阅读全文
posted @ 2019-08-20 17:37 神之右大臣 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 题面 这道题可以分成两部分来处理; 第一部分: 设f[i][j]表示右下角以(i,j)结尾的最大正方形的边长。 显然f[i][j]=min(f[i][j-1],f[i-1][j-1],f[i-1][j])+1 第二部分: 可以使用悬线法进行解决。 定义: 有效竖线:除了两个端点外,不覆盖任何障碍点的 阅读全文
posted @ 2019-08-15 15:01 神之右大臣 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 题面 奇数+奇数一定不是质数(1+1除外),偶数+偶数一定不是质数,质数只可能出现在偶数+奇数中 把所有的点排成两列,权值为奇数的点在左边,权值为偶数的在右边 如果左边的点x+右边的点y是质数,我们就连一条x->y的边 最后答案显然是最大独立集=n-最小点覆盖=n-最大匹配数 由于1比较特殊,考虑到 阅读全文
posted @ 2019-08-15 14:27 神之右大臣 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 题面 按照常见树形背包定义状态:设dp[u][j]表示在以u为根的子树中,选择j个客户所能获得的最大收益。 状态转移:dp[u][j]=max(dp[u][j-k],dp[v][k]-w(u,v)); 注意因为二维的是滚动数组,所以应该倒着循环。 阅读全文
posted @ 2019-08-14 13:37 神之右大臣 阅读(358) 评论(0) 推荐(0) 编辑
摘要: 题面 对于“n个物品选任意个”我们就可以想到一种递推方法,即设f[i][j]表示前i个物品选j个的最大收益 我们发现正着转移并不好转移,我们可以倒着转移,使选择的当前第i号物品为第一个物品,这样的话我们就发现这个物品对答案做的贡献就变成了a[i].w−a[i].r∗(j−1),于是写出转移方程: f 阅读全文
posted @ 2019-08-14 12:03 神之右大臣 阅读(146) 评论(0) 推荐(0) 编辑
摘要: 题面 这道题好狗的说,数组开大一点会MLE掉,开少一点会RE掉~; 下面是正解: 我们设计状态:f[i][j][k][now]四维DP 第一维和第二维(i,j)表示处于矩阵的(i,j)处(最后的结尾是(i,j)); 第三维k表示小A瓶中的值-小uim瓶中的值。(可以利用神奇的取模运算来使其是正数); 阅读全文
posted @ 2019-08-13 15:09 神之右大臣 阅读(133) 评论(0) 推荐(0) 编辑