随笔分类 - 《牛客比赛题解》
摘要:C:首先我们可以知道重量为1的方案数就是重量为2的物品的数量,因为只有2 / 2 = 1可以影响它。 那么如果我们从小到大迭代的话,对于当前位置i,只能赋值2 * i才能影响当前位置,那么如果当前方案数的差为d,那么就还需要放d个2 * i。 这里要注意的是差值可能为负数。 #include<bit
阅读全文
摘要:A:假设一个三位数为x1y1z1,有cal(x1y1z1) + cal(x2y2z2) = cal((x1 + x2)(y1 + y2) (z1 + z2)) 证明: 我们不进位把每一位看成一个多进制数(实际上和十进制是一样的). 可以得出cal(x1y1z1) = cal(x1 + y1 + z1
阅读全文
摘要:同余方程没推好。。 #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,set<int>> pii; const int N = 1e5 + 5; const int M = 1e5
阅读全文
摘要:https://ac.nowcoder.com/acm/contest/17148/C。 这题挺好的。 其实一开始已经差不多想到了。 前缀和+容斥。 但是这个容斥一直没想到怎么做,就硬冲线段树去了。 这里其实有一个很重要的信息。 假设L点的右边有解的位置是r。 那么对于所有L左边的点,他们的有解位置
阅读全文
摘要:A:水题 #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<LL, int> pii; const int N = 1e6 + 5; const int M = 2000 + 5; con
阅读全文
摘要:E: 单调栈维护的题,比赛的时候没想到,线段树写了很久,但是中间没理清。 这题线段树也能做,但是要麻烦一些。 我们在栈中维护一个栈,尽量让栈顶的元素大,也就是说如果这个元素后面还有这个元素,且这个元素不在栈中。 并且小于栈顶的元素,我们就去看栈顶的元素后面还有没有,如果有我们就把栈顶元素弹出,把这个
阅读全文
摘要:H:签到。 F:可以发现长度就是1,2,3这些第一个不在自己i位置上的,他们自己的位置减去i。 长度找到后就去翻转验证能不能行即可。 本来应该是要双端队列去模拟这个过程的,暴力翻转复杂度肯定不够。 但是懒得写队列暴力了写了下过了。 #include<bits/stdc++.h> using name
阅读全文
摘要:A:感觉这题蛮难的,没想到这么多人过。 比赛的时候推dp推了挺久没推出来。 dp[i]表示i长度的包含u,s的串的方案数。 考虑转移: 1:前i个长度已经包含了u,s,那么随便新加入一个就行,即dp[i - 1] * 26 2:前i个长度只包含了u,没有us。那么加入一个s。 这里要用到容斥思想来求
阅读全文
摘要:J: 可以发现,如果这样构造,我们一共有60位,二分图两边的最小点数必定 <= 50个,那么我们每次都用少的那边来做大的全集来构造,这样位数就够了。 #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef
阅读全文
摘要:A:签到 #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> pii; const int N = 5e4+5; const int M = 1e2+5; const LL
阅读全文
摘要:A:签到。 #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<string,string> pii; const int N = 1e5+5; const int M = 1e6+5; co
阅读全文
摘要:这题主要就是多了一个平方和的操作。 我们维护平方和的值的时候。 需要注意在下放的时候,要先把乘法之后的sum1算出来,这对算sum1最终的值没有影响。 但是对sum2的值有影响。因为我们在计算中就在更新adtag的值,所以这个adtag它的sum1应该最终化。 #include<bits/stdc+
阅读全文
摘要:莫比乌斯函数的重要性质: mu[ij] = mu[i] * mu[j] // gcd(i,j) = 1 mu[ij] = 0//gcd(i,j) != 1 然后就可以推了。 推到:$ans = \sum_{i = 1}^{n} \mu (i) \sum_{j = 1}^{n} \mu (j) \su
阅读全文
摘要:M:一开始想的bfs松弛dp,但是T了。 然后想的是去枚举全部的高度,然后bfs判断,显然这也会T。 但是可以发现的是,其实我们只需要找到最大的能承受的高度即可。 所以就可以二分了。 #include<bits/stdc++.h> using namespace std; typedef long
阅读全文
摘要:提高组都是神仙打架%%% T1: 对于每个素数i,显然f[i] = i. 那么根据唯一分解定理,对于每个合数i,如果它分解后,有多个素因子,那么显然为1. 否组就是最小的素因子。 那么,我们可以在线性筛中处理即可。 线性筛,其实就是利用素数和一个和当前素数肯定有不同素因子的数乘积来筛合数的过程。 那
阅读全文
摘要:一开始想的是枚举k,然后用前缀和找最小的前k个。 但是这样其实是不对的,因为后面加入的数应该和原来的数都重新排序再找最小的k个。 那么,这里就是个小顶堆了。 但是这时显然枚举k,然后小顶堆检查复杂度不够。 观察可以发现,k是满足二分性质的。k越大花费就会越小。(证明略~显而易见) 那么就可以二分,然
阅读全文
摘要:太菜了太菜了太菜了~~ A:首先,要先理解这题的题意。 所有的区间都翻转了,才算做一次,然后求k次后的位置。 那么,我们可以先预处理出一次后每个点去到的位置,即一开始a[i] = i。 那么,我们就知道一次翻转的相对位置改变了。 那么,现在朴素的解法:k次遍历,每次都让i位置跳到a[i]即可。//这
阅读全文
摘要:A:签到题 // Author: levil #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<char *,int> pii; const int N = 105; const int M
阅读全文

浙公网安备 33010602011771号