- 博客(14)
- 收藏
- 关注
原创 快速读写模版
快速读 inline long long read(){ char ch = getchar(); long long x = 0, f = 1; while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); } while('0' <= ch && ch <= '9') { x = x * 10 + ch
2021-01-20 18:53:48
176
原创 exKMP小结
exKMP小结 KMP传送门 用途:现有长度为n的文本串S与长度为m的模式串T,求文本串S的每一个后缀,与模式串T的最大公共长度。 复杂度:空间O(n + m), 时间O(n + m) 用法: 假设字符串起始下标均从1开始,那么Next[i]表示的是模式串T从i开始的后缀与其自身的最长匹配长度,而extend[i]表示的是文本串从i开始的后缀与模式串T的最长匹配长度。在读入文本串S与模式串T并且分别设置好长度n和m之后,直接调用函数exKMP()即可得到extend数组和Next数组。 例题: hdu259
2021-01-03 16:26:28
322
1
原创 uva11490
注意到S<=1e12,当S取到最大值时候,每个方块外部的士兵厚度仅有68041,可以考虑枚举士兵厚度求解。 #include<bits/stdc++.h> using namespace std; typedef long long LL; const long long mod = 1e8 + 7; LL S; int main() { while (scanf("%...
2018-08-14 19:54:11
301
原创 uva10951(多项式gcd)
类比整数辗转相除法,此题为多项式辗转相除法求最大公因多项式 #include<bits/stdc++.h> using namespace std; const int maxn = 1e5; typedef vector<int> vint; int n, x, y, t, kase, a[105]; vint f, g, ans; void read(int &...
2018-08-14 19:51:33
1003
原创 uva10951(欧拉降幂)
经典的欧拉降幂问题。 欧拉降幂公式: nx mod m = nφ(m)+(x mod φ(m)) 这个公式当且仅当x>φ(m)时成立。 //欧拉降幂公式 #include<bits/stdc++.h> using namespace std; typedef long long LL; #define MOD(x,m) (x>m)?m+x%m:x int n, m,...
2018-08-14 19:49:31
458
原创 欧拉函数
计算phi(x) ,复杂度O(sqrt(n)); int euler_phi(int n) { int m = (int)sqrt(n + 0.5); int ans = n; for (int i = 2; i <= m; i++)if (n%i == 0) { ans = ans / i * (i - 1); while (n...
2018-08-14 18:36:42
230
原创 Treap实现名次树
插入,删除,查找的期望时间复杂度O(logn); //基于Treap实现的名次树,可以查第k大的数、某个数的rank struct Node { Node *ch[2]; int r, v, s; Node(int val = 0) { ch[0] = ch[1] = NULL; r = rand(); v = va...
2018-08-14 18:35:04
386
原创 扩展欧几里德
typedef long long LL; //扩展欧几里德递归实现 版本1 void exgcd(LL a, LL b, LL& g, LL& x, LL& y) { if (!b) g = a, x = 1, y = 0; else exgcd(b, a%b, g, y, x), y -= x * (a / b); } //扩展欧几里德递归实现 版本...
2018-08-14 18:30:37
233
原创 快速幂模板
#include<bits/stdc++.h> using namespace std; typedef long long LL; LL fpow(LL a,LL m,LL mod) { LL ret=1; while (m){ if (m&1)ret=ret*a%mod; a=a*a%mod; m>>...
2018-08-14 18:29:49
165
原创 二维凸包模板
例题来自Hdu 1348 //几何求凸包模板 #include<bits/stdc++.h> using namespace std; const int maxn = 100000 + 5; const double PI = acos(-1); #define all(a) a.begin(), a.end() struct Point { int x, y; P...
2018-08-14 18:29:04
326
原创 uva11768 Lattice Point or Not
比较经典的扩展欧几里德求整数解的问题 对于两个点(x1,y1)(x2,y2),如果点为整数点,那么必定能通过扩展欧几里德求出区间中的整点个数,即对方程(y2-y1)x+(x1-x2)y=x1y2-x2y1 求解。 由于此题的点精确到小数后1位,我们可以将x1,y1,x2,y2分别放大10倍,问题转变成对方程[10*(y2-y1)]x+[10(x1-x2)]y=100*(x1y2-x2y1)求解...
2018-08-14 18:26:19
212
原创 FWT快速沃尔什变换
Fast Walsh-Hadamard Transform 就是用于解决一类卷积问题的方法。 时间复杂度nlogn,求解的内容如下 可以用于求解数组A和数组B异或后能得到哪些数之类的问题(暴力枚举是n2的复杂度) void FWT(int a[],int n) { for(int d=1;d<n;d<<=1) for(int m=d&...
2018-08-14 18:18:04
452
原创 UVA11525
二分+树状数组,或线段树 本题由于数据量较小 ( n = 50000 ),n(logn)^2的算法可以通过(二分加树状数组,通常解法),此处只讨论nlogn的算法(线段树的妙用) 实际上,这个问题是一个支持单点删除的查询所有数中第k大数的问题。在每次完成查询之后,要把这个数从数的集合中删除。 那么如何用线段树优化掉一个logn? 回想我们在用线段树进行单点查询的时候,其思想就是用的二分查...
2018-08-02 21:38:37
282
原创 Codeforces 877E Danil and a Part-time Job
本题的做法是dfs序线段树。1.什么是dfs序?dfs从根节点遍历整棵树的过程中经过的节点编号的顺序就是dfs序。2.如何将dfs序与线段树结合在一起?对得到的dfs序与1-n进行映射,可以得到一个初始数组num。将dfs序中的第i个节点的标号记为x,那么num[i]表示的就是节点x上灯泡的开关情况。不难发现同一颗子树上的所有节点在dfs序中代表一个连续的区间。那么,以x为根节点子树灯泡情况的反转其
2017-10-25 00:32:24
330
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人