[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑任意两个字符串(a,b) 假设a在b的前面 那么如果a+b>=b+a 这里的+表示字符串的链接 那么显然需要交换a,b的位置. 这样能让最后结果的字符串的字典序更小一点. 把这个条件写在SORT的CMP函数里面 调用一下之后把n个字符串都拼起来就OK了 [代码] #include <bits/stdc++.h> using namespace std; const int N = 5e4; int n; string…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个前缀和 和 一个后缀和. (即前i个字符A所代表的数字的和以及前i个字符B所代表的数字的和.. 然后枚举前i个字符翻转. 求B对应数字的最大值 枚举i..n这些字符翻转 求B对应数字的最大值 两个同时求最大值就是答案了. [代码] #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 5e5; int a[N+10]…
[链接] 我是链接,点我呀:) [题意] n个物品,每个物品都有无限个. 第i个物品的价格是一样都,都是ai 让你从中选出恰好k个物品 问你选出的物品的总价值 有多少种不同的可能. [题解] 可以用f[j]表示物品的总价值为j最少需要选多少个物品. for (int i = 1;i <= n;i++) for (int j = a[i];j <= k*a[i];j++){ f[j] = min(f[j],f[j-a[i]]+1); } 然后对于价值j; 如果f[j]==k的话.j就可行? 但是…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 记录每个数字出现的次数cnt[x]; (大于1e6的直接忽略) 另外用一个数组z[1e6] 然后for枚举x 第二层for枚举x的倍数(倍数不超过m) 即for (int i = x;i <=m;i+=x) z[i]+=cnt[x]; 这样z[i]就表示a[]中I的约数有多少个. 显然i也是这些约数的倍数. 我们无法确定i是这些数的最小公倍数. 但是我们可以找一个最大的z[i] 使得i最小. 这样i肯定就是这z[i]个约数的最小…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 知道题意之后就是一个模拟的过程了. 用int now记录当前苹果的个数.bool flag记录是否有小数(即半个苹果) (这样处理为了防止double精度误差 根据half 和halfplus的规则,变化now和flag即可. 变的时候把卖出去的苹果累加答案 [代码] #include <bits/stdc++.h> #define ll long long using namespace std; const int N =…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个数字有3种选择. 1.选中它. 2.选中它且加阶乘符号 3.不选中它(即计算和的时候不考虑它) 如果我们直接暴力写的话复杂度是\(3^{25}\) 寻求优化. 我们可以用Meet-in-the-middle这个方法. 先求出1..n/2这些数字的组合方式. 用map<ll,ll> dic[25]来存它们的和. dic[i][j]表示前n/2个数字中选了i个[2]状态的数字,和为j的方案数. 则我们再穷举n/2+1..n这些…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 题目的图吓人. 找下规律就会发现从内到外是1,6,12,18 即1,16,26,36... 即1+6(1+2+3+...) 等差求和公式. [代码] #include <bits/stdc++.h> #define ll long long using namespace std; ll n; int main() { ios::sync_with_stdio(0),cin.tie(0); #ifdef LOCAL_DEFIN…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 在做之前需要了解一个知识点. 就是如果一个字符串s是一个a循环串. (字符串的长度设为n,下标从1开始 那么s[1..n-a]和s[1+a..n]是相同的. 且这是充分必要条件. 可以看这篇文章 链接 显然1..n-a就对应了文章中的黄色部分,而1+a..n对应了蓝色部分. 根据文章中的描述.显然如果这两部分相同.则它是长度为a的一个循环串. (且就算n不是a的倍数,那种情况也能用这种方法判断 则我们的问题转化成快速判断某两段区…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 要求把连续的一段li..ri的边全都删掉. 然后求剩下的图的联通数 如果暴力的话 复杂度显然是O(k*m)级别的. 考虑我们把li..ri全都删掉. 接下来要做两件事. 第一是把1..li-1这些边连起来. 并查集1 然后是把ri+1..m这些边连起来. 并查集2 然后把并查集1和并查集2合并在一起求联通分量就好 两个并查集合在一起可以在线性复杂度内完成. 那么花费的时间就在1..li-1和ri+1,,m这两个并查集的获取上.…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把B提取出来就是一个等比数列了. 求和一下会发现是这种形式. \(B*\frac{(A^n-1)}{A-1}+A^n*x\) 则求一下乘法逆元 写个快速幂就好 A-1的逆元就是\((A-1)^{MOD-2}\) 要注意A=1的情况. 然后n最大可能为10^18 所以乘的时候要先对其取模 不然会乘爆 [代码] #include <bits/stdc++.h> #define LL long long using namespac…