随笔分类 - 题解
摘要:题面 对于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个数
阅读全文
摘要:题面 大家都是两遍SPFA吗?我这里就一遍dp啊; 首先判断对于一个点u,是否可以从一号点走到这里,并且可以从u走到n号点; 对于这样的点我们打上标记; 那么抛出水晶球的点一定是从打上标记的点中选出一个;(自己可以理解一下) 然后跑一遍dp,dp[i]表示从点1到点i的若干条路径中,所经过的点的权值
阅读全文
摘要:题面 先反向建边,这样以t为源点一遍bfs即可判断出哪个点不可以到达t点; 然后正向建边,以s为源点再一遍bfs计算距离;对于一个点u枚举其叶子结点v来判断u的子节点是否可以直接或间接到达t;
阅读全文
摘要:题面 提前知识: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; 时间复杂
阅读全文
摘要:题面 这道题可以分成两部分来处理; 第一部分: 设f[i][j]表示右下角以(i,j)结尾的最大正方形的边长。 显然f[i][j]=min(f[i][j-1],f[i-1][j-1],f[i-1][j])+1 第二部分: 可以使用悬线法进行解决。 定义: 有效竖线:除了两个端点外,不覆盖任何障碍点的
阅读全文
摘要:题面 奇数+奇数一定不是质数(1+1除外),偶数+偶数一定不是质数,质数只可能出现在偶数+奇数中 把所有的点排成两列,权值为奇数的点在左边,权值为偶数的在右边 如果左边的点x+右边的点y是质数,我们就连一条x->y的边 最后答案显然是最大独立集=n-最小点覆盖=n-最大匹配数 由于1比较特殊,考虑到
阅读全文
摘要:题面 按照常见树形背包定义状态:设dp[u][j]表示在以u为根的子树中,选择j个客户所能获得的最大收益。 状态转移:dp[u][j]=max(dp[u][j-k],dp[v][k]-w(u,v)); 注意因为二维的是滚动数组,所以应该倒着循环。
阅读全文
摘要:题面 对于“n个物品选任意个”我们就可以想到一种递推方法,即设f[i][j]表示前i个物品选j个的最大收益 我们发现正着转移并不好转移,我们可以倒着转移,使选择的当前第i号物品为第一个物品,这样的话我们就发现这个物品对答案做的贡献就变成了a[i].w−a[i].r∗(j−1),于是写出转移方程: f
阅读全文
摘要:题面 这道题好狗的说,数组开大一点会MLE掉,开少一点会RE掉~; 下面是正解: 我们设计状态:f[i][j][k][now]四维DP 第一维和第二维(i,j)表示处于矩阵的(i,j)处(最后的结尾是(i,j)); 第三维k表示小A瓶中的值-小uim瓶中的值。(可以利用神奇的取模运算来使其是正数);
阅读全文
摘要:题面 很简单的一个二维DP f[i][j]表示最后吃到(i,j)所能获得的最大值, 那么f[i][j]=max(f[i+1][j-1],f[i+1][j],f[i+1][j+1])+a[i][j]; 注意f要初始化为负无穷大;
阅读全文
摘要:题面 用一个单调递减队列来维护一个区间,单调队列的头就是该区间的最大值; 因为在该数前面进队的数如果比后进的数要小就说明了前面进队的数绝对不会影响答案。
阅读全文
摘要:题面 离线处理;大体思路就是将数组排序,然后对于第k次询问把不可行的数打上标记,然后从头开始寻找第k个没打标记的点的值(排序后的数组保证了它是第k小的)。实现方法:首先离散化原始数组,得到数组find[],find[i]=j表示原位置为i的数从小到大排序后的位置是j。a[]数组表示原数组,b[]数组
阅读全文
摘要:题面 这道题虽然是练习匈牙利算法的,但可以用网络流来切掉它; 我们可以建立一个超级源和一个超级汇,超级源连接左部分点,超级汇连接右部分点; 然后在该图上跑最大流就可以了; PS:我设的超级源是2001,超级汇是2002;
阅读全文
摘要:题面: 割点性质: 节点 u 如果是割点,当且仅当存在 u 的一个子树,子树中没有连向 u 的祖先的边(返祖边)。 换句话说,如果对于一个点u,它的子节点是v,如果low[v]>=dfn[u],就代表u的子图中没有返祖边,即该节点u是割点; #include <bits/stdc++.h> usin
阅读全文
摘要:题面 这道题就是标准的堆优化dijkstra; 注意堆优化的dijkstra在出队时判断vis,而不是在更新时判断vis
阅读全文
摘要:这道题的难度应该达到普及+了吧我太蒟蒻了其实做完这道题后仔细想一想发现了一种神奇的问题:计算机好笨啊!!!Q:为什么?A:你想啊,计算机没有自己的思想,一直被人牵着鼻子走,这难道不笨吗?Q:蛤?什么意思?A:题目虽然说计算机会破坏人类的选择,但实际上人类一直选择数值最优的那一对的其中一个,那么计算机
阅读全文
摘要:题面 本题是一道有向图博弈问题: 该题便是著名的巴什博弈; 我们可以发现,当n=0的时候后手必胜(设其为P态),n=1~m这几种状态由于先手可以一次全部取完导致先手必胜(设其为N态)。 接着当n=m+1时,因为先手无论取走几个都会使后手一次全部取走导致后手必胜; 接着当n=m+2~2*m时,因为先手
阅读全文
摘要:题面 因为 n=lcm(a,b)n = lcm(a, b)n=lcm(a,b) ,可以得出: a 和 b 的质因数都是 n 的质因数 对于 n 的每个质因数 x ,在 n 中的次数为 y ,那么 x 在 a 和 b 中至少有一个次数为 y,在另一个中的次数 <=y。 所以我们只要把 n 的每个质因数
阅读全文
摘要:题面 本题其实主要就这几点: 1.离线,以右端点排序(从小到大); 2.建立树状数组c[],c[i]表示从1~i中有多少种不同的数字; 3.对于每次查询的答案就是sum(r)-sum(l-1); 4.由于问题是离线排序回答,所以应该注意输出顺序(离散化前的顺序); Q:直接统计前缀和,然后对于每次询
阅读全文
摘要:题面 给大家普及一个知识,只要看到最大值最小或最小值最大等字样就往二分上想吧!然后是正解部分: 我们可以二分答案; 对于每次二分的区间取中间值mid,并对其进行check()判断; 如果所有段的最大值为mid时可以分成m段(注意,如果此时分成的段比m还小,那么也是可行的,因为你可以随便拆拆就能拆成m
阅读全文

浙公网安备 33010602011771号