随笔分类 - 数据结构与算法
摘要:C++实验:STL之vector #include <bits/stdc++.h> using namespace std; void Input(vector<int>& v) { int n, m; scanf("%d", &n); for (int i = 1; i <= n; i++) {
阅读全文
摘要:题目传送门 sol:在洛谷上看到一种dfs + 离线的方法,可以解决大部分可持久化问题。把依赖关系看成边,然后建树。这样本来要解决的多个版本只要在一个版本上进行修改就好了。 离线 + dfs #include <bits/stdc++.h> using namespace std; typedef
阅读全文
摘要:A .Cake Cutting Problem 零AC,打扰了 B .Function des:f(x) = f(x-1) + 1. f(0) = k. 给出x、k,求f(x)。 sol:签到题,好翻译好做。直接两数相加没什么好说的。 数学 #include "bits/stdc++.h" usin
阅读全文
摘要:题目传送门 sol:第一次看题还真信了是用线段树来做,但是没什么想法,看了题解发现是我不会的Treap,然后花了几天时间学习了一下并补掉题目 无旋Treap #include <bits/stdc++.h> using namespace std; typedef long long LL; con
阅读全文
摘要:题目传送门 标题说平衡树,那么应该AVL,红黑树都能过,但是这次做这题主要是学习Treap,所以花了几天搞出了这题。其他方法以后再说吧 Treap(带旋转) #include <bits/stdc++.h> using namespace std; const int MAXN = 100010;
阅读全文
摘要:题目传送门 A .Yet Another Dividing into Teams sol:原先是用比较复杂的方法来解的,后来学弟看了一眼,发现不是1就是2,当出现两个人水平相差为1就分成两组,1组全是奇数,1组全是偶数,必然符合题意。 思维 #include "bits/stdc++.h" usin
阅读全文
摘要:题目传送门 sol1:用bitset来维护,其实感觉挺暴力的,不怎么会用bitset,借着这道题学习一下。 bitset暴力维护 #include "bits/stdc++.h" #define debug puts("what the fuck"); using namespace std; co
阅读全文
摘要:题目传送门 sol:看了题意显然是最大生成树,但是任意两个点之间都有边,大概有n*n条边。用朴素的最小生成树算法显然不行。联想了一下树的直径还是不会。看了大佬的题解,懂了。。。 所以还是直接贴大佬博客链接好了:https://blog.csdn.net/yasola/article/details/
阅读全文
摘要:题目传送门 sol:Pollard_Rho的模板题,刚看了Pollard_Rho和Miller_Rabin很多原理性的东西看不懂,只是记住了结论勉强能敲代码。 Pollard_Rho #include "cstdio" #include "cstdlib" #include "algorithm"
阅读全文
摘要:题目传送门 sol1:普通判到sqrt(n)的素数判定,不多说了。 素数判定 #include "bits/stdc++.h" using namespace std; bool is_prime(int n) { for (int i = 2; 1LL * i * i <= n; i++) { i
阅读全文
摘要:题目传送门 sol: 官方题解的随便简单推导我推不出来,推了很久倒是推出了另一种解法。 用 c[i][j] 表示 a[i] 的第 j 项,举个例子 c[3][0] = f[0] * f[3] = 0; c[4][1] = f[1] * f[3] = 2; 那么我们求 a[n] 也就是 c[n][0]
阅读全文
摘要:题目传送门 稍加观察就会发现,4n - 1就是题目要的答案。至于为什么,看官方的题解。不过这个n非常的大,用正常快速幂解决不了。这道题我学到的就是解决幂非常大的情况。 官方题解传送门 sol1:之前好像做过一道类似的题目,想不出来,在群里看到网友发了一个名词叫十进制快速幂。然后根据这个名字自己意淫通
阅读全文
摘要:大佬博客 ps:在牛客上做到这题不会,学会之后补了两道相关题。顺便记录一下。 牛客-DongDong数颜色 sol:dfs序+莫队,先把树上的点标上dfs序,因为子树的dfs序是连续的,所以子树可以表示为id[x]到id[x] + size[x] + 1,然后就是序列上莫队了(引用自官方题解) df
阅读全文
摘要:题目传送门 sol1:老实做,预处理出所有2到1e5的素数,对所有数进行分解质因数,然后对比因子个数。感觉有点卡常,用了快读然后多次优化之后才过的,map也用上了。 素数筛,快速分解质因数 #include "bits/stdc++.h" using namespace std; typedef l
阅读全文
摘要:题目传送门 sol1:拿到这题的时候刚上完课,讲的是指针。所以一下子就联想到了双向链表。链表可以解决卡片移动的问题,但是无法快速定位要移动的卡片,所以再开一个指针数组,结合数组下标访问的特性快速定位到要移动的卡片。把链表和数组的优势结合起来; 双向链表 #include "bits/stdc++.h
阅读全文
摘要:题目传送门 ps:一般这种给一个数列求第n项,n还特别大的。要么矩阵快速幂,要么转化递推式。不过这题数据也特别多有100000组,所以就算矩阵快速幂可能也要超时,而且我还没推出来。转化递推式需要比较强的数学基础,我也转化不了。ε=(´ο`*)))唉,只能打表找规律。 打表代码 #include "b
阅读全文
摘要:题目传送门 上个星期的假日团队赛,这题别人的代码看了四五天才明白,来补上代码 sol1:排列组合,当考虑某一位本来是1的,现在改成了0,那么在这一位后面位的就可以随意排列组合了。 排列组合 #include "bits/stdc++.h" using namespace std; typedef l
阅读全文
摘要:题目传送门 sol:题目读完就知道是线段树,gcd满足结合律。操作2也好想到差分,但是不会修改后维护gcd。看了题解发现还是差分,这个差分用的妙啊; 线段树+差分 #include "bits/stdc++.h" using namespace std; const int MAXN = 1e5 +
阅读全文
摘要:题目传送门 sol1:离线处理询问,对所有询问按高度排序,然后按高度顺序把每个点的坐标存入树状数组或线段树。 树状数组 #include "bits/stdc++.h" using namespace std; typedef pair<int, int> PII; const int MAXN =
阅读全文
摘要:题目传送门 sol:状压和动规,把每一行的m个01压缩成一个int 状压dp #include "bits/stdc++.h" using namespace std; const int MAXN = 15; const int MOD = 1e8; int n, m; bool mp[MAXN]
阅读全文