知识点补充、技巧
sdau20163940
努力学习,天天向上!
展开
-
欧拉函数
(摘自百度百科)在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。此函数以其首名研究者欧拉命名(Euler'so totient function),它又称为Euler's totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。通式:原创 2017-05-24 00:28:17 · 479 阅读 · 0 评论 -
数组的离散化
我们在处理数组问题时,如需要求逆序数,然而数据给的又特别大,此时我们就可以用数组的离散处理来解决了。当数的范围比较大时需要进行离散化,即先排个序,再重新编号。如a[] = {10000000, 10, 2000, 20, 300},那么离散化后a[] = {5, 1, 4, 2, 3}。附上代码:#include#include #include#inc原创 2017-08-18 15:15:00 · 2408 阅读 · 0 评论 -
二分法
一,学习别人的总结与讲解本部分的参考见末尾,本部分文字是在其基础上的二度总结(节约时间和精力)。1,典型的二分法算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。 基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较,如果当前位置arr[k]值等于key,则查找成功;若key小于当前位置值arr[k],则在数列的前半段中查找,a转载 2017-08-12 15:50:30 · 599 阅读 · 0 评论 -
[ACM] 常用STL
1. stack[cpp] view plain copyprint?stackint>st;//栈st,用于存放int型数据 st.push(3);//将3入栈 st.push(2);//将2入栈 st.pop();//栈顶2出栈 int Top = st.top();//获取栈顶元素,即3 int Size = st.size();/转载 2017-08-12 17:56:04 · 186 阅读 · 0 评论 -
i&(-i)的计算
这句话的意思是:返回 i 的二进制数最低位为1的权值。例如:10100最低位的1权值是41001010最低位的1权值是2111最低位的1权值是1代码:#includeusing namespace std;int main(){ int i; for(i=1; i<=20; i++) cout<<(i&(-i))<<endl;原创 2017-08-15 09:52:27 · 1296 阅读 · 0 评论 -
线段树
线段树——代码实现(建树)•建立一棵线段树,并记录原数组信息void build(int id,int l,int r){ tree[id].left=l; tree[id].right=r; if (l==r) { tree[id].sum=a[l]; tree[id].max=a[l]; } else { int mid=原创 2017-09-16 12:04:50 · 247 阅读 · 0 评论 -
随机生成测试数据(rand(),srand())
转自:http://blog.csdn.net/cttacm/article/details/46753251随机生成测试数据算法竞赛入门里面的第六章讲到了一种对拍的调试程序的方法,就是写同一个程序用两种不同的方法来实现,然后用相同的测试数据来分别测试两个程序,然后比对两个程序的结果是否相同。其中讲到了编写数据生成器的方法:程序摘抄如下:[cpp转载 2017-09-16 16:18:55 · 2610 阅读 · 0 评论 -
莫队算法
莫队算法小介绍——看似暴力的莫队算法标签: 莫队算法 2016-08-17 23:30 2030人阅读 评论(0)收藏举报分类: 莫队算法(8) 作者同类文章X版权声明:本文为博主原创文章,未经博主允许不得转载。摘要: 莫队算法是一个对于区间、树或其他结构离线(在线)转载 2017-10-05 21:50:48 · 302 阅读 · 0 评论 -
线段树辅助——扫描线法计算矩形面积并
转自:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html分析:1.矩形比较多,坐标也很大,所以横坐标需要离散化(纵坐标不需要),熟悉离散化后这个步骤不难,所以这里不详细讲解了,不明白的还请百度2.重点:扫描线法:假想有一条扫描线,从左往右(从右往左),或者从下往上(从上往下)扫描过整个多边形转载 2017-10-14 13:33:28 · 350 阅读 · 0 评论 -
线段树入门&lazy思想
转自:http://blog.csdn.net/u012469987/article/details/41357377线段树将区间分成若干个子区间,子区间又继续分,直到区间为一个点(区间左值等于右值)对于父区间[a,b],其子区间为[a,(a+b)/2]和[(a+b)/2+1,b] 用于求区间的值,如区间最值、区间的和等。代码实现中,约定结点下标从1开始,所以某结点下标转载 2017-10-15 13:13:22 · 191 阅读 · 0 评论 -
快速幂取模
参考文章来源:Reait Home(http://www.reait.com/blog.html) 转载请注明,谢谢合作。 在Miller Rabbin测试素数,就用到了快速幂取模的思想。这里总结下。求a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能 算法1:利用公式a*b%c转载 2017-05-23 08:22:42 · 243 阅读 · 0 评论 -
TSP问题(贪心)
转自:传送门TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出。问题描述如下: 有若干个城市,任何两个城市之间的距离都是确定的,现要求一旅行商从某城市出发必须经过每一个城市且只在一个城市逗留一次,最后回到出发的城市,问如何事先确定一条最短的线路已保证其旅行的费用最少?另一个类似转载 2018-01-08 22:01:40 · 6506 阅读 · 3 评论 -
斯特林公式
斯特林公式是一条用来取n阶乘近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用。斯特林公式可以用来估算某数的大小,结合lg可以估算某数的位数,或者可以估算某数的阶乘是另一个数的倍数。Stirling公式的意义在于:当n足够大时,n!计算起来十分困难,虽然有很多关于n!的等式,但并不能很好地对阶乘结果进行估计,尤其是n很大之后,误差将会非常大。但利用St原创 2018-02-04 19:09:53 · 577 阅读 · 0 评论 -
容斥原理
参考点击打开链接对容斥原理的描述容斥原理是一种重要的组合数学方法,可以让你求解任意大小的集合,或者计算复合事件的概率。 容斥原理可以描述如下: 要计算几个集合并集的大小,我们要先将所有单个集合的大小计算出来,然后减去所有两个集合相交的部分,再加回所有三个集合相交的部分,再减去所有四个集合相交的部分,依此类推,一直计算到所有集合相交的部分。关于集合原创 2018-02-04 20:14:45 · 193 阅读 · 0 评论 -
#1163 : 博弈游戏·Nim游戏(数学博弈)
#1163 : 博弈游戏·Nim游戏时间限制:10000ms单点时限:1000ms内存限制:256MB描述今天我们要认识一对新朋友,Alice与Bob。Alice与Bob总是在进行各种各样的比试,今天他们在玩一个取石子的游戏。在这个游戏中,Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个石子。每一次行动,Alice和Bob可以选择从一堆石子中取出任意数量的石子。至少取1颗...原创 2018-03-18 14:52:12 · 300 阅读 · 0 评论 -
求逆序数
在树状数组中最常用到的就是求逆序数了,那么给你一串数字那么我们如何来求逆序数呢?下面给出代码示例:#include #include #include #include #include #define maxn 15using namespace std;int c[maxn],b[maxn];int lowbit(int x){ return x&(-x);}v原创 2017-08-18 15:46:24 · 229 阅读 · 0 评论 -
如何学好ACM
一些题外话首先就是我为什么要写这么一篇日志。原因很简单,就是因为前几天有个想起步做ACM人很诚恳的问我该如何入门。其实就现在而言,我并不是很想和人再去讨论这样的话题,特别是当我发现我有很多的东西要学的时候,我实在是不想花太多的时间在这种问题上。但是我当年也是纯凭热情搞ACM过来的,实在是不忍心打击一个同样有着满腔热情的起步者。所以干脆就多花点时间,总结一下我的一些观点和看法,以后再让人问起原创 2017-04-03 18:21:53 · 2057 阅读 · 0 评论 -
威佐夫博弈
具体内容:威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,k=0,1,2,...,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(原创 2017-05-06 00:20:28 · 272 阅读 · 0 评论 -
Ronberg算法计算积分
语法:result=integral(double a,double b);参数:a:积分上限b:积分下限function:f()积分函数返回值:f在a、b之间的返回值注意:function f(x)需要自行修改。程序中用的是 x*x;需要 math.h;默认精度要求是1e-5源程序:#include#include#define e原创 2017-05-25 18:10:17 · 601 阅读 · 0 评论 -
最大公约数和最小公倍数的递归求法
#include #include #include #include #include #include #include #include #include #include #include #define maxn 15#define MAXN 100005#define mod 1000000007#define INF 0x3f3f3f3f#define原创 2017-05-16 07:48:36 · 645 阅读 · 0 评论 -
计蒜客三场
在腾讯课堂的物理课上,进行了一个有趣的物理实验。在一个长度为 LL 米的光滑轨道上,小车 A 在 00时刻以 1\mathrm{m/s}1m/s 的速度从左端出发向右运动,小车 B 在 tt 时刻以 1\mathrm{m/s}1m/s 的速度从右端出发向左运动,两个小车的质量相等。假设所有碰撞都是弹性碰撞,也就是当两个小车相向碰撞时,他们各自会以原来的速度向相反的方向运动;小车和轨道两原创 2017-05-27 21:55:46 · 271 阅读 · 0 评论 -
卡特兰数
令h(0)=1,h(1)=1,catalan数满足递推式:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5另类递推式:原创 2017-05-28 13:20:55 · 333 阅读 · 1 评论 -
哈夫曼思想
哈尔曼编码的算法。实质就是每次两个最小的相邻数相加,直到只剩一个数为止,然后把过程中所有的和加起来,较难处理的点就是每次加完了要保证下次相加的必须是最小的两个数。在这里因为看见数据量比较小(5000个),因此用的O(n*n)的办法做的,就是每次做完和都找到相应位置将数字插进去,前面的数依次向前移动一位,以此保证整个序列始终有序;本来想用排序做,但想想如果每加一次qsort排一次序的话,复杂度为原创 2017-05-10 00:32:31 · 1879 阅读 · 0 评论 -
约瑟夫环
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。f[1]=0;f[i]=(f[i-1]+m)%i; (i>1)(递推公式原创 2017-05-21 19:01:27 · 212 阅读 · 0 评论 -
2017计蒜客第二场
题意:四个人如图,每个人前面有numi快木块,先给出一组筛子的数字组(x,y)然后从第一个玩家开始逆时针数x+y次停在c然后从c的第min(x,y)+1快木块顺时针开始1,2,3,4依次取两块,循环三次,每个人取6块,总共去24块现在给你两块相邻的幸运木块位于第k个人前面的第d块和第d+1块,问你玩家1能取得这两块幸运木块的掷筛子的种类,不考虑顺序思路:因为筛子的范围为原创 2017-05-22 00:08:51 · 182 阅读 · 0 评论 -
C函数之memcpy()函数用法
转自:http://blog.csdn.net/tigerjibo/article/details/6841531函数原型void *memcpy(void*dest, const void *src, size_t n);功能由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。头转载 2017-06-18 15:52:41 · 929 阅读 · 0 评论 -
筛素数
#include using namespace std;const int maxn=1000;int main(){ int i,j; int a[maxn]; int sum=0; for(i=0;i<maxn;i++) a[i]=1; a[0]=a[1]=0; for(i=2;i<maxn;i++) {原创 2017-07-31 14:20:20 · 152 阅读 · 0 评论 -
ACM算法模板
0.头文件#define _CRT_SBCURE_NO_DEPRECATE#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;const int maxn =转载 2017-08-16 11:53:51 · 322 阅读 · 0 评论 -
树状数组求逆序数
转自:http://www.cnblogs.com/xiongmao-cpp/p/5043340.html1、什么是逆序数? 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序数的总数就是这个排列的逆序数。 2、用树状数组求逆序数的总数 2.1该背景下树状数组的含义转载 2017-08-16 20:44:46 · 406 阅读 · 0 评论 -
树状数组简单总结
1、树状数组最早用于数据压缩。2、c[i]的初始位置是去掉最低位的1之后加上1.(最后一个1代表的权值表示c中拥有a的个数。)3、c[i]下标的起点是下标 x=i-[i&(-i)]+1;4、树状数组之所以高效简洁的原因就是能够利用位运算直接求出i对应的lowbit。# define lowbit(x)((x)&(-x));int lowbit(int i){return i&(原创 2017-08-16 10:47:26 · 261 阅读 · 0 评论 -
一步一步理解线段树
一 概述线段树,类似区间树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(logn)。线段树的每个节点表示一个区间,子节点则分别表示父节点的左右半区间,例如父亲的区间是[a,b],那么(c=(a+b)/2)左儿子的区间是[a,c],右儿子的区间是[c+1,b]。二 从原创 2017-04-29 22:07:32 · 177 阅读 · 0 评论 -
C++实现快速排序
快速排序大体思路:快速排序基本思想(递归): 1.先从数列中取出一个数作为基准数。 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。 3.再对左右区间重复第二步,直到各区间只有一个数。代码:#include <iostream>#include <cstdio>using namespace ...原创 2019-03-23 17:26:51 · 206 阅读 · 0 评论