自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 codeforces Global round 17(c题)二分

C题:Keshi 正在举办一个聚会,他希望聚会中的每个人都开心。他有n个朋友。 他的第 i 个朋友有 i 美元。如果你邀请第 i 个朋友参加聚会,只有当聚会中 ai 人严格比他富有,bi 人严格比他穷时,他才会高兴。克什想邀请尽可能多的人。 找出他可以邀请参加聚会的最大人数,这样每个被邀请的人都会高兴。输入第一行包含一个整数 t (1≤t≤104)——测试用例的数量。 测试用例的描述如下。每个测试用例的第一行包含一个整数 n (1≤n≤2⋅105)——Keshi 的朋友数。以下n行的第i行包

2021-11-24 21:11:41 201

原创 c++ map 与unordered_map 与set 的比较

map:红黑树,查找速度O(log n)稳定 且足够快,有序,unordered_map:哈希散列表 ,查找速度O(1~M)M为key值长度,由于无序哈希map 的查找速度并不稳定,且空间复杂度更大所以哈希map不一定比map 好用,有时候需要仔细了解,其实log n 比1也就二大了最多几十倍,哈希map比map快l 那么一点但是如果key值(string类型)过长,有时候就会比map慢很多。set与unordered_set类比于map与哈希map ,原理相同,但我更倾向用map因为之前碰到一题被s

2021-11-10 23:05:22 824

原创 CF 1107B(数论,规律)

B. 数字根每次测试的时间限制1秒每次测试的内存限制256 兆字节输入标准输入输出标准输出今天在数学课上,Petya 学习了数字根。非负整数的数字根是通过对数字求和的迭代过程获得的单个数字值,每次迭代都使用前一次迭代的结果来计算数字和。该过程继续,直到达到一位数。让我们表示的数字根 X 作为 秒( x ). 然后秒( 5 ) = 5, 秒( 38 ) = S( 3 + 8 = 11 ) = S( 1 + 1 = 2 ) = 2, 秒( 10 ) = S( 1 + 0 = 1 ) = 1.佩佳

2021-10-06 22:55:39 170

原创 多重背包的二进制优化

1,2,4,8。。。2^n这些数字和为2的n次-1,可以组成2的n次以内的所有数,我们可以通过log2 N 个数来组成2的n次内所有的数(二进制数就是这样组合的)我们通过这样的优化可以把多重背包的每个物品的数量n优化为log2 n的时间复杂度#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 2005,M=11000;int f[

2021-09-08 21:29:52 141

原创 最小生成树

贪心策略,随便找一个点一般为1,每次找到与其最近的点加入树,同时对加入的点记忆化,之后更新每个最近的值并用pre记录前驱,(可以打印边与路径);变形:对于下面这种对个点可以做中心(如建立发电站)求最小生成树的,找到0点作为超级点,到每个中心的w即建立发电站的费用,将0点加入,求最小生成树即可。原题:ACWING,3728#include<cstdio>#include<cstring>#include<algorithm>#include<iostre

2021-09-05 20:24:34 97

原创 二叉搜索树(一些函数)

本文只列出一些二叉搜索树的基本函数,效率取决于树的深度,如果小于父节点往左排,大于父节点往右排这种数据结构本身很少使用,因为它的各种操作复杂度是O(h),其中 h为层数。只有在它大致平衡(平衡指所有叶子的深度趋于相同),才具有优秀的复杂度(当它是完全二叉树时,为 [公式] ),然而这只是理想情况。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#includ

2021-08-18 12:05:09 114

原创 莫队算法初步

莫队算法是用于解决l,r转化为l,r+1;l.r-1;l-1,r;l+1,r这类问题而设计的算法下面看到例题:Given a sequence of n numbers a1, a2, …, an and a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to return the number of distinct elements in the s

2021-08-17 11:18:14 70

原创 分块(块状数组)

洛谷P2801 教主的魔法题目描述教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给 XMYZ 信息组每个英雄看。于是 NN 个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为 1, 2, \ldots, N1,2,…,N。每个人的身高一开始都是不超过 10001000 的正整数。教主的魔法每次可以把闭区间 [L, R][L,R](1≤L≤R≤N1≤L≤R≤N)内的英雄的身高全部加上一个整数 WW。(虽然 L=RL=R 时并不符合区间的书写规范,但我们可以认为是单独增加第 L®L® 个

2021-08-16 15:47:10 144

原创 线段树模板

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<set>#include<string.h>#include<vector>#include<set>#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);#define.

2021-08-15 18:16:43 81

原创 传递闭包(简单)

传递闭包算法是用来解决图论上一个点是否能到达另一个点的算法,那么我们把Floyd算法稍微改下就可得到:for (int k = 1; k <= n; ++k) for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (E[i][k] && E[k][j]) E[i][j] = 1;POJ1975 Median Weight

2021-08-13 17:34:24 1116

原创 拓扑排序(简单的排序)

如果给你许多人的高低关系,让你为这些人按从高到低排个序,你会怎么做?我们会用拓扑排序来完成,把每个关系组成图用箭头表示,先把入度为0的点放到队列中,在根据队列把列内元素指向的元素入度减1,之后再寻找入度为0的元素放入队列,这样子得到的元素总数cnt如果与事先知道的元素总数n相等则说明无环出现,如果不等则说明这个问题有环且无解:ZCMU-2153#include<queue>#include<iostream>#include<cstdio>#include&l

2021-08-12 16:19:15 133

原创 最近公共祖先

#include<queue>#include<iostream>#include<cstdio>#include<string.h>#include<vector>#include<cstring>#include<cctype>#include<cmath>#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);#defin.

2021-08-10 23:09:47 80

原创 并查集的应用

并查集是一个树形结构常用来确认两个元素是否在一个集合中,通常有合并查询两大操作:这道题便是典型的并查集应用:#include <cstdio>#define MAXN 5005int fa[MAXN], rank[MAXN];inline void init(int n){ for (int i = 1; i <= n; ++i) { fa[i] = i; rank[i] = 1; }}int find(int x)

2021-08-10 13:41:59 79

原创 差分约束算法

我们把不等式转化为图论中dist[to]<>dist[p]+edges[e].w;这便是差分约束,那么源头点在哪呢,我们新建一个0点作为源头任何点到他的距离为0,求其余点到他的最短路或最长路距离就是不等式组的解集题目描述给出一组包含 m 个不等式,有 n 个未知数的形如:的不等式组,求任意一组满足这个不等式组的解。输入格式第一行为两个正整数 n,m,代表未知数的数量和不等式的数量。接下来 m 行,每行包含三个整数 [公式] ,代表一个不等式 [公式]。输出格式一行,n 个数,表

2021-08-09 15:38:11 119

原创 dfs与数学的应用

链接:https://ac.nowcoder.com/acm/problem/50042来源:牛客网**kotori拿到了一些正整数。她决定从每个正整数取出一个素因子。但是,kotori有强迫症,她不允许两个不同的正整数取出相同的素因子。她想知道,最终所有取出的数的和的最小值是多少?注:若a%k==0,则称k是a的因子。若一个数有且仅有两个因子,则称其是素数。显然1只有一个因子,不是素数。输入描述:第一行一个正整数n,代表kotori拿到正整数的个数。第二行共有n个数ai,表示每个正整数的值。

2021-08-08 19:57:21 99

原创 最短路问题(总结)

多源最短路:FLOYD 算法:void Floyd(int n){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);}解决任意两个点的最短路径,时间O(n3),空间O(n2);一般很少会求多源最短路,因为复杂度很大,除非

2021-08-08 17:22:39 138

原创 匈牙利算法

存图的三种方式:邻接矩阵inline void add(int u, int v, int w){ mat[u][v] = w; mat[v][u] = w;}邻接表std::vector<Edge> edges[MAXN];inline void add(int from, int to, int w){ Edge e = {to, w}; edges[from].push_back(e); //向vector的最后添加一条..

2021-08-07 15:59:43 207

原创 同余方程模板

ax +by=c,c=gcd*t,#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<set>#include<string.h>#include<vector>#include<deque>#define IOS ios::sync_with_stdio(0); cin.tie...

2021-08-05 18:29:22 91

原创 扩展中国剩余定理的应用

链接:https://ac.nowcoder.com/acm/problem/15068来源:牛客网uu遇到了一个小问题,可是他不想答。你能替他解决这个问题吗?问题:给你k对a和r是否存在一个正整数x使每队a和r都满足:x mod a=r,求最小正解x或无解。这道题必须用扩展中国剩余定理来解决,因为无论模数是否互质都可以满足次定理,即从第二个开始每次对aax+bb=a[i]y+b[i]求最小整数解,之后把每次加上aax,每次对(aa,a[i])求最小公倍数lcm。#include&lt.

2021-08-04 19:45:10 101

原创 容斥原理及其应用

题目:集合中的质数题目描述给出一个集合和一个数m。集合里面有n个质数。请你求出从 1 到 m 的所有数中,至少能被集合中的一个数整除的数的个数。输入描述:第一行两个正整数 n 和 m 。第二行n个正整数,分别为集合中的质数。输出描述:输出一个整数,表示符合要求的正整数的个数。输入3 375 7 13输出13知识点:1.容斥原理。分析:如果集合中只有一个数,那么答案就是m/a1,如果 集合中只有两个数,那么答案等于m/a1+m/a2-m/lcm(a1,a2),(能被a1整

2021-08-02 18:38:39 182

原创 字典树的使用

字典树Trie是一个很简单的数据结构,直接上代码:const int MAXN = 500005;int next[MAXN][26], cnt; // 用类似链式前向星的方式存图,next[i][c]表示i号点所连、存储字符为c+'a'的点的编号void init() // 初始化{ memset(next, 0, sizeof(next)); // 全部重置为0,表示当前点没有存储字符 cnt = 1;}void insert(const string &s) /

2021-08-01 11:33:22 87

原创 KMP算法(字符串匹配)

在我们找一个字符串中另一个字符串的位置往往时间效率很低,今天介绍的KMP算法是三个发明者KMP发明的一种快速找到字符串匹配的算法,试想我们在找一个字符串时一个一个匹配每次匹配不成功j需要回到0(j为子串的指针)那如果能让j不回到0回到之前匹配完成的位置就减小了时间的复杂度,这里引用存储每个位置的PMT作为每个需要回到的位置如图所示求出pmt的代码比较简单 pmt[0]=0; for(int i=1,j=0;i<p.length();++i){ while(j>=0&am.

2021-07-30 16:22:40 76

原创 杜教筛的介绍

杜教筛是圈内的一个老师发明的,有狄利克雷卷积推出来的一个算f(n)的前缀和的比较快的算法大概在O(2/3)范围内通常令g=1算一些特殊函数的前缀和:莫比乌斯函数cosnt int maxn=1e5+9;vector<int>primes;bool vis<maxn>;ll mu[maxn],smu[maxn];unordered_map<ll ,ll >memu;void init(){ mu[1]=1; for(int i=2;i&l

2021-07-29 14:53:01 1879

原创 01 背包,完全背包,多重背包

把n个物品放入一个背包每个物品都有确定的重量与价值,要求背包载重不超过M求最大价值或最小价值,当物品数为1时 为 01 背包,数量不限为完全背包,数量各不相等为多重背包。下面分别是对应的例题,但求的东西略有不同。Charm Bracelet0 1背包 求最大价值:#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<set&g

2021-07-25 21:30:34 49

原创 Miller Rabin 素数测试

先说下伪素数的概念,费马小定理的逆不成立的合数成为伪素数,即满足a的x-1mod x=1但不是素数。通常我们判断奇素数(2肯定是素数)由费马小定理与二次剩余定理得到,1的(x-1)/2=1modx所以对上述底数a要么为1,要么为-1(取模后)所以我们把x-1进行不断二分,在这些2的m次中要么全为1,要么中间有一个-1,之后全为1,这样条件下,它大概率是素数,在2的64次以内,他人已经为我们找好了检验素数的a,只要全部满足,必为素数。a: 2, 325, 9375, 28178, 450775,.

2021-07-25 10:46:15 156

原创 二次剩余的介绍

我们定义n==x*xmod p 中如果有非零解称n为p的二次剩余,不过并非所有数都有二次剩余,在此我们只讨论p为奇素数的情况,我们引用l勒让德符号,(a/p)={1,有二次剩余,0,amodp==0,-1,无二次剩余}。那么如何求解二次剩余的解呢,我们有欧拉准则(a/p)=a的(p-1)/2次这个证明很简单,费马小定理可以看出。我们使用Cipolla算法去解p的二次剩余先找到a满足(a*a-n)的(p-1)/2次满足二次非剩余,然后定义i*i=a*a-n,代入即n=(a+i)的(p+1)/2次。

2021-07-24 11:09:46 331

原创 原根的介绍与初步应用

在学习欧拉定理后,我们知道a的1次到a的fai(m)次有一个长度为fai(m)的循环节,然而我们并不能保证这个循环节是最小的,于是又定义这个循环节我们成为阶,当a在模m意义下阶与fai(m)相等,我们称a为m的原根,一个数的原根不止一个,我们通过定理可 证明他必须是2,4,p的q次,2*p的q次,p为奇素数,可以证明原根个数为fai(fai(m))个,为a,a的s次(s为小于m的互质数),想要求原根通过暴力即可,因为科学家发现这种数小于n的1/4;#include<cstdio>#inc

2021-07-23 15:07:42 208

原创 UCF Local Programming Contest Round 1A(C,D,E题解)

C Unique Values 题意:给定字符串,求所有不包含重复元素的子串,位置不同也算不同。思路:借鉴某大佬得出的一种时间复杂度相对好点的方法,从第一个元素一个一个放进deque,用map记录次数,当有2次时对前面的重复元素剔除到无重复元素,每次加上q.size()(这里表示每个子串的个数,细想下就是这样的规律);#include<stdio.h>#include<algorithm>#include<iostream>#includ

2021-07-22 20:59:51 171

原创 POJ-2115(求解同余方程模板题)/约数和及其个数定理

poj—2115:题意大概是给你a,b,c,k,求解方程cx-2的k次*m=b-a;典型的扩展欧几里得求解最小x题下面是代码:#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<set>#include<string.h>#include<vector>using namespace std;

2021-07-19 17:35:03 280

原创 给树上色(贪心与树)

每个节点都有一个“着色成本因子”,Ci。每个节点的着色成本取决于 Ci 和 Bob 完成该节点着色的时间。开始时,时间设置为0。如果节点i的着色完成时间为Fi,则节点i的着色成本为Ci * Fi。例如,具有五个节点的树如图 1 所示。每个节点的着色成本因子为 1、2、1、2 和 4。Bob 可以按照 1、3、5、2、4 的顺序为树着色,最小总着色成本为 33。给定一棵树和每个节点的着色成本因子,请帮助 Bob 找到为所有节点着色的最小可能的总着色成本。输入输入由几个测试用例组成。每个案例的第一

2021-07-17 16:50:32 194

原创 二分查找与贪心的应用

POJ 1505 Copying Books题目大意给定n本书的页数,需要怎样分配使得抄写员的最大抄写页数最小,我们一般处理最大值做小化时使用二分查找,,用vis记录分配的/,需要注意的事每个抄写员都必须分配书,所以对未分配到的人需要从第一个开始分斜杠知道“/”用完为止,先找到最大的那个分配页数然后从后往前每次超过做一次vis标记,用不完从前开始标记。(题意要求最前面的抄写员分配尽量小)下面是代码:#include<cstdio>#include<cstring>..

2021-07-16 17:33:26 78

原创 大步小步算法(求解离散对数)

baby step giant step简称为大步小步算法,是一个用来求解离散对数的方法,设a的b次对m取模得b,a与m互质时我们令x=At-B,a的At次等于b*a的B次,之后先对右边的数进行存储,,哈希map速度快一点,之后再从左边找,有则返回值,这是一种类似于meet In the middle 的算法,不难验证我们取t为sqrt(fi(m))则可以搜索到所有数值,为了避免算欧拉函数我们令t=sqrt(m),扩展大步小步算法,当a与m不互质时,我们把式子写成a*a的x-1次+mn=b,同除d若

2021-07-16 11:41:37 1205

原创 贪心与思维的应用

Radar Installation题目大意:假设滑行是一条无限长的直线。陆地在海岸的一侧,海洋在另一侧。每个小岛都是位于海边的一个点。并且任何位于沿海的雷达装置只能覆盖d距离,因此如果它们之间的距离最多为d,那么一个半径装置可以覆盖海中的一个岛屿。我们使用笛卡尔坐标系,定义滑行是 x 轴。海面在 x 轴上方,陆地面在下方。给定每个岛屿在海中的位置,并给定雷达装置的覆盖距离,您的任务是编写一个程序来找到覆盖所有岛屿的最少雷达装置数量。请注意,岛屿的位置由其 x-y 坐标表示。输入由几个测试用例

2021-07-14 18:53:54 52

原创 拓展欧拉定理

拓展欧拉定理指的是:a的欧拉函数(m) 对m取模为1,当a与m互质的情况下成立,如果m为质数则退化成费马小定理 a的p-1次 mod p=1,在算法竞赛中我们常常要用到他的推论 :a 的b次等价于a 的【b mod 欧拉函数(m)】次对m取模,那么如果a与m不互质的时候怎么办呢下面就引出了扩展欧拉定理:当b>=fai(m)时,a的b次等价于a的bmod fai(m)+fai(m)次(b<fai(m)时直接快速幂),这个定理也很好证明:把m写作写作质数的积,因为a与m每个质数互质,欧..

2021-07-13 10:50:01 2505

原创 卢卡斯定理

卢卡斯定理在处理组合数学的大数问题是十分有用的,直接上定理,证明也很好证但在这里不在赘述,直接上定理下面是洛谷的一道模板题(3807)#include<stdio.h>#include<algorithm>#include<string.h>#include<cstring>#include<iostream>using namespace std;typedef long long ll;const int N=1..

2021-07-11 18:25:23 121

原创 欧拉函数的初步介绍

欧拉函数F(x)指小于等于x的质数的个数有下面三个性质:f(p的n次)=p的n-1次乘上p-1f(ax)=af(x);f(ab)=f(a)*f(b)第三个性质又是积性函数的定义下面是代码段:#include<stdio.h>#include<algorithm>#include<iostream>#include<cstring>#include<vector>using namespace std;con

2021-07-10 16:14:49 341

原创 poj2287 ,poj1230

POJ 2287题意:田忌赛马,两列图给出每匹马速度,求出最佳分配方法,每赢一局+200,输一局-200,平局不改变。这题是典型的贪心,把两列数放入vector中每次比较最快的马,如T[F]>Q[F],这两匹马直接比,+200,pop顶层数,若T[F]<Q[F],用最慢的马和他比,相等速度比较最慢的马:若T[S]>Q[S],直接比。若T[S]<=Q[S],最小的马与秦王最快的马比,==则不-200.#include<cstdio>#include<i

2021-07-10 16:05:58 96

原创 hdu6180(贪心与set的应用)

题目大意::给定n个时间调度让你排布,一个机器不能有冲突,冲突则新加一个机器,求最小机器数与最小时间总数(时间数即为一个机器的结束减开始)这道题如果用暴力做会超时,每次找到最小的end时间会浪费很多时间,如果用multiset会快很多,因为他能自动排序。#include<stdio.h>#include<iostream>#include<cstring>#include<algorithm>#include<set> type

2021-07-09 18:46:29 210

原创 中国剩余定理与素数筛

中国剩余定理,也叫孙子定理,之所以叫这个名字,是因为《孙子算经》中有这样一个问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?这个被叫做“物不知数”的问题本质上是解下面的同余方程组:下面以洛谷曹冲称象的题为例,求给定n个模与n个余数,求解x,x mod r1=a1类似这种要保证x能够对n个数都成立,即把x1,x2,...,xn每个数求出特解,最后加起来mod r1*r2*...rn即可随意先把每个余数乘起来得r,要保证对每个数对剩余n-1个数mod成立,设p=r.

2021-07-09 18:37:16 398

原创 扩展欧几里得和逆元

今天又是学数论学自闭的一天。。。。扩展欧几里得所谓扩展欧几里得就是求同余不定方程的解,具体方法就是需要对x和y进行变换如ax+by=c,由翡蜀定理得c必须是gcd(a,b)的倍数才有解,方程等价于bx0+a mod b y0=c等价于bx+[a-(a/b)*b ]y0等价于ay0+b[x-a/b *x0]=c,即x=y0,y=x-a/b*x0,int exgcd(int a, int b, int &x, int &y){ if (b == 0) {

2021-07-08 16:13:28 100

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除