摘要:
题意注意的是,相反数必定在数组中。 首先很容易可以算出每对相反数的总差值和是一样的,所以d中的差值一定要成对出现。 且,可以发现,对于差值的计算有两种情况。 对于y,计算和-x , x的差值。 当y < x。dis = (x - y) + (y + x) = 2 * x; 当y > x。dis = 阅读全文
摘要:
这题数据量很小,显然是状压和dfs。 dfs + 剪枝也可以过这题,但是剪枝比较玄学。。 状压dp: f[i]表示选了的点状态为i时的最小总代价。 dep[i][j]表示选点状态为i的最优状态时的,j的深度。 因为这题多余的边不用连,显然最终的答案是一棵树。 每次选定两条边加入即可。注意的是i 向 阅读全文
摘要:
贪心问题。 从左到右去移动,这里把负的看成是从右向左得到的。 那么就可以得出最大步数就是每个需要移动的和总步数之间的最大值。 #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int 阅读全文
摘要:
这题之前没做出来,现在看懂了。 因为k很小,所以考虑求出所有恰好满足 dis <= len <= dis + k的路径数。 这里就是用了枚举的思想,去枚举每种情况。 然后dp[i][j]表示从1走到i点用了比最短路多j的路径的方案数。 然后去转移。 有两种思路,从n开始倒着搜dp,比较容易理解。 我 阅读全文
摘要:
好久没码题了,码力好像有点下降。 这题有结论可知:枚举没条不在最小生成树上的边,将这条边连上成环,那么就可以去掉环上的最长边(除了新加的这条)。 因为这里是严格次小树,那么最长边就不能和这条新边相等,显然这条最长边只能 <= 新边,如果大于的话,那么最小生成树就可以有更小的。 倍增维护最小值和次小值 阅读全文
摘要:
J: 可以发现,如果这样构造,我们一共有60位,二分图两边的最小点数必定 <= 50个,那么我们每次都用少的那边来做大的全集来构造,这样位数就够了。 #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef 阅读全文
摘要:
这题一开始想当签到题的,没想到这么惨烈。 首先,暴力计算每个数的因子和,复杂度nlong,n最大1e7,会超时。 正解:考虑每个数的倍数会在这个区间中出现几个,然后再乘上每个数即可(也就是一个个计算每个数的贡献) 复杂度:O(n)。 代码汇总的题解里有。 阅读全文
摘要:
非常细细细的一题。 首先,这数据量显然是状压。 dp[i][j][k] 表示 到第i行,第i行状态为j,第i - 1行状态未k的最大方案数。 我们从上向下考虑的话,每个放置的棋子会被上面两行棋子的放置状态所影响。 所以我们每次转移的时候需要枚举上面的两行。 这样的话复杂度就是 n * m * m * 阅读全文
摘要:
A:显然a*kb*kc*k这样构造能满足 #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> pii; const int N = 2e4 + 5; const int M 阅读全文
摘要:
这题太妙了。 一开始一直在想怎么bfs和记忆化搜索。 正确的思路:把最外面看成源点,汇点对每个人建边,然后柱子的限制对自己拆点建边(限制做容量)。 然后超级汇点对每个人连边。最后要对满足条件的柱子之间建边即可。 这里输出巨坑。0 和 1 和 >1的输出都不一样,找了好久(出题人大气层) #inclu 阅读全文