CSP算法
csp,《算法笔记》
D-A-X
这个作者很懒,什么都没留下…
展开
-
VS Code添加全局include path
打开C/C++ EXTENSION的设置:进入settings.json:添加如下: "C_Cpp.default.browse.path": [ //以下均为头文件路径,每个人都不一样 "D:\\Dev-Cpp\\MinGW64\\include", "D:\\Dev-Cpp\\MinGW64\\x86_64-w64-mingw32\\include", "D:\\Dev-Cpp\\MinGW64\\lib\\gcc\\x86_64-w64-m原创 2020-12-08 17:43:07 · 5250 阅读 · 0 评论 -
平面分割(直线、面、折线)
直线分割平面 求n+1n+1n+1条直线最多可以将平面分割成几部分,此时已知前nnn条直线以将平面分割成了ana_nan个平面,那么新加入的这一条直线最多可以和前nnn条直线相交,而该直线每穿过一个平面将将该平面分割成两部分,现在求新增平面个数,即求该直线穿过的平面的个数,即该直线被其他直线分割的段数,即第n+1n+1n+1条直线将最多增加nnn个平面。 故有:∵an+1=an+n+1∴an=12(1+n)×n+1\begin{aligned}\because a_{n+1}&=a_原创 2020-10-13 15:36:18 · 926 阅读 · 0 评论 -
华科OJ-2020.08.22测试赛-单词阅读-线段树解法
题目描述 华科OJ-2020.08.22测试赛-单词阅读(需要华科VPN) 寻找区间中字典序最大的单词。输入 第一行一个整数N(1≤N≤106)N(1\leq N\leq10^6)N(1≤N≤106); 接下来NNN行,每行一个单词,单词长度不会超过10,且仅包含小写英文字母; 接下来一行一个整数M(1≤M≤106)M(1\leq M\leq 10^6)M(1≤M≤106),表示询问的次数; 接下来MMM行,每行两个整数ai,bi(1≤ai≤bi≤N)a_i,b_i(1\leq a原创 2020-08-24 15:01:36 · 384 阅读 · 0 评论 -
问题规模与时间复杂度
背景简述 当代计算机,以O(n)的复杂度计,若要求1s内完成计算, 则循环次数最多不超过107次。数据规模与时间复杂度的对应关系时间复杂度数据规模O(n)O(n)O(n)107O(n2)O(n^2)O(n2)3000O(nlogn)O(nlogn)O(nlogn)106O(f(n))O(f(n))O(f(n))f−1(107)f^{-1}(10^7)f−1(107)注:1. 时间复杂度中log nlog\ nlog n默认以2为原创 2020-08-21 22:29:03 · 3114 阅读 · 0 评论 -
洛谷 P3604 美好的每一天
P3604 美好的每一天题目描述给定一个字符串,提供m个访问区间,求每次访问中,访问区间内满足区间内字符重排可形成回文序列的子区间个数输入格式第一行输入两个数据,分别为n、m;第二行输入长为n的仅由小写字母构成的字符串;接下来输入m组查询数据,每组数据包含两个数据,分别是访问区间的左端点和右端点。输出格式输出m行数据,每一行为对应查询区间满足条件的子区间个数。输入样例#16 6zzqzzq1 62 43 42 34 51 1输出样例#11642231解题原创 2020-08-06 22:06:46 · 186 阅读 · 0 评论 -
莫队
区间求和 该莫队以洛谷P1972 [SDOI2009]HH的项链为例。直接求和的莫队不需要cnt数组。 设置两个移动指针left和right,进行移动。若区间发生扩充,则加上移动位置的数组值,若区间发生缩减,则减去移动位置上数组的值。代码如下:#define MAX 1e6int init[MAX], cnt[MAX], now = 0, left = 1, right = 0; //init为原始数据,cnt为当前数值出现次数,now记录和void add(int position){原创 2020-07-31 14:16:53 · 137 阅读 · 0 评论 -
树状数组
单点更新,单点查询传统数组直接可以搞定。单点更新,区间查询树状数组来完成。#define MAX 100int n; //题目实际输入的树状数组的大小int init[MAX], tree[MAX]; //初始数据存放数组,树状数组int lowbit(int position){ //计算下一个position关联位置 return position & (-position);}void update(int position, int add_num){ //更原创 2020-07-28 17:27:28 · 129 阅读 · 0 评论 -
洛谷P1972 [SDOI2009]HH的项链
题目描述 P1972 [SDOI2009]HH的项链 HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。 有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答…… 因为项链实在是太长了。于是,他只好求助睿智的你,来解决这个问题。输入格式一行一个正整数nnn,表示项链长度。第二行nnn个正整数aia_iai,表示项链中第原创 2020-07-28 16:17:58 · 158 阅读 · 0 评论 -
STL之string
string类型:字符串头文件:#include<string>定义:string name;访问通过下标访问:str[i];通过迭代器(iterator)访问:string::iterator it; 若要将字符串整体输出,需要使用cin、cout;也可利用方法c_str()将其转化为数组形式单个输出。函数find():find(str2),当s...原创 2020-02-18 09:29:30 · 90 阅读 · 0 评论 -
STL之set
set类型:集合,内部有序且不含重复元素头文件:#include<set>定义:set<typename> name; (如set<int> a)访问只能通过迭代器(iterator)访问:set<typename>::iterator it;#include<cstdio>#include<set>...原创 2020-02-17 22:07:04 · 87 阅读 · 0 评论 -
STL之vector
vector类型:向量、变长数组头文件:#include<vector>定义:vector<typename> name; (如vector<int> a)常见用法一维长度固定,二维可变长,如下:vector<typename> Arrayname[arraySize]:如vector<int> vi[100];一、...原创 2020-02-16 17:58:57 · 114 阅读 · 0 评论 -
组合数取模
组合数取模的应用背景运行时间限制:1s;运行空间限制:256M;代码长度限制:2000000B题目描述 高一八班有n个人,从1到n编号,一次互判作业时,老师随机将作业发到这n个人手中。已知有k个人拿到的不是自己的作业,那么请问有多少种情况符合条件呢?输入共1行,包含2个整数n和k。输出共1行,包含1个整数,表示答案。由于答案可能很大,请输出答案模10007的余数。输入样例...原创 2020-02-09 16:22:12 · 218 阅读 · 0 评论 -
求n!中有多少个质因子p
方法一: 遍历1~nnn,求出每个数包含几个质因子ppp,然后再相加即可。 时间复杂度为:O(nlogn)O(nlogn)O(nlogn)。代码如下:int cal(int n, int p){ int ans = 0; for(int i = 2; i <= n; i++){ //遍历2~n int temp = i; while(temp % p == 0){ ...原创 2020-02-09 11:48:58 · 998 阅读 · 0 评论 -
组合数的计算
组合数Cnm=n!m!(n−m)!C_n^{m}= \frac {n!} {m!(n-m)!}Cnm=m!(n−m)!n!,满足Cnm=Cnn−mC_n^{m}=C_n^{n-m}Cnm=Cnn−m,且有Cn0=Cnn=1C_n^{0}=C_n^{n}=1Cn0=Cnn=1成立。方法一:通过定义式直接计算 根据定义式分别求出n!n!n!、m!m!m!和(n−m)!(n-m)!...原创 2020-02-08 18:43:41 · 566 阅读 · 0 评论 -
数组循环移位的原地算法
题目描述解题思路方法一: 每次移动一位,将整个数组连续移动MMM次,时间复杂度为O(M∗N)O(M*N)O(M∗N)。方法二: 根据移动位数将数组划分为MMM组数据,对每组数据内部移位1次,最后再按原数组顺序将其整合为一个数组。 时间复杂度为O(N)O(N)O(N)。 该方法的缺点在于需要重新申请一个数组空间,空间复杂度非O(1)O(1)O(1)。方法三:原地算法 由...原创 2020-02-05 19:39:57 · 929 阅读 · 0 评论 -
素数之埃氏筛法&欧拉筛法
素数的判断 判断数n是否为一个素数,基本方法为从2开始向后枚举,若n不能被2,3,4,…,n-1整除,则n为素数,该判断方法的时间复杂度为O(n)O(n)O(n);更快的方法为,当枚举至n\sqrt nn时即可判断是否为素数,该判断方法的时间复杂度为O(n)O(\sqrt n)O(n)。代码如下://写法1,其中sqrt函数位于头文件<math.h>,double sqrt...原创 2020-02-04 19:49:41 · 215 阅读 · 0 评论 -
高效技巧与算法(1)
打表利用空间换时间。在程序中一次性计算出所需要用到的结果,之后的查询直接取这些结果;在本地将题目所给范围内的结果跑出来后存给要提交的程序,这样查询起来时间消耗小;对一些不会解决的,先暴力破解小范围结果,再找规律观察。活用递推题目描述思路 直接暴力破解会超时,时间限制为150ms。 对于确定位置的A来说,以它形成的PAT个数为左侧P个数与右侧T个数的乘积。 如何快速获...原创 2020-02-02 15:47:21 · 140 阅读 · 0 评论 -
最大公约数与最小公倍数
最大公约数利用辗转相除法,当后一项为0时得到最大公约数。递归式:gcd(a, b) = gcd(b, a % b)递归边界:gcd(a, 0) = a代码如下:int gcd(int a, int b){ return !b ? a : gcd(b, a % b);}最小公倍数 由于ababab在实际计算中可能溢出,因此应用a/d∗ba / d * ba/d∗b,其中d为...原创 2020-02-04 16:02:16 · 67 阅读 · 0 评论 -
快速排序算法实现
一般方法 快速排序每趟都可以确定一个元素的最终位置,使得其左侧元素均小于temp,右侧元素均大于temp。 快速排序的算法复杂度为O(nlogn)O(nlogn)O(nlogn),当需要排序的序列接近有序时,算法复杂度退化为O(n2)O(n^2)O(n2)。代码如下://对区间[left, right]进行划分int Partition(int A[], int left, int ...原创 2020-02-01 17:30:15 · 721 阅读 · 0 评论 -
srand((usigned)time(NULL))
srand() 这个函数在C/C++中经常跟rand函数一起使用,srand是随机数发生器的初始化函数. 在C中:这两个函数都位与<stdlib.h>头文件里面 在C++中:两个函数都位与<cstdlib>(被包含于iostream中) 原型:void srand(unsigned int seed) void rand (void)...原创 2020-02-07 13:34:01 · 341 阅读 · 0 评论 -
年月日问题及不等差问题
年月日问题描述解决思路令日期不断加1天,直到和另一日期相等为止;当加1天后超过当月天数,则月份加1,天数置1;当月份超过12时,年份加1,月份置1。为便于直接得到每个月的天数,设置数组month[2][13],其中一维0表示平年,1表示闰年。注意:为加快速度,先将较小年份不断加1,直到和较大年份相差1为止,再进行后续操作。代码#include<stdio.h>/*---...原创 2020-01-09 17:13:07 · 902 阅读 · 0 评论 -
字符串分块倒置问题
问题描述解题思路及实现1. 常规思路 从后向前遍历字符串,直至遇到空格,将该单词按顺序复制进另一空数组中,并在单词间添加相应的空格;设置每次复制的末尾标志markr和下次寻找单词的起始标志markf。注意:scanf()函数遇到“\t, \n, \r及空格”都会停止,因此为避免该情况,需使用gets()函数完成输入;(此处有一个未解决的问题,使用gcc++进行编译时出错,gcc则成...原创 2020-01-09 17:50:41 · 131 阅读 · 0 评论 -
sort()函数对结构体的排序问题
题目描述翻译:编程能力测验(PAT)是由浙江大学计算机科学与技术学院开发的。每个测试应该同时运行在几个地方,最终和ranklists将合并后立即测试。现在你的工作是编写一个程序,正确合并所有ranklists并生成最终的排名。输入格式每个输入文件包含一个测试用例。对于每个案例,第一行包含一个正数N(≤100),为测试点的数量。然后输入N组ranklists,每个输入起始一行包含一个正...原创 2020-01-10 18:06:52 · 527 阅读 · 0 评论 -
全排列所带来的分治与递归问题
如题代码实现如下:#include<cstdio>const int maxn = 11;//P为当前排列,hashTable记录整数x是否已经在P中int n, P[maxn], hashTable[maxn] = {false};/*---当前处理排列的第index号位---*/void generateP(int index){ if(index == n + ...原创 2020-01-13 12:15:35 · 165 阅读 · 0 评论 -
N皇后问题
解题思路 由于N皇后问题要求每一行、列均有一个皇后,且任意两个均不在同一对角线上,故可对每一列中皇后所在行进行枚举,如下: 如上图中,对1~8进行全排列,淘汰掉处于同一对角线的情况,上图枚举结果为{4,2,8,5,7,1,3,6},即(列,行){(1,4), (2,2), (3,8), (4,5), (5,7), (6,1), (7,3), (8,6)}。1. 暴力法 当达到递归边...原创 2020-01-13 16:56:37 · 115 阅读 · 0 评论 -
归并排序算法实现
递归实现const int maxn = 100;//将数组A的[L1, R1]与[L2, R2]区间合并为有序区间(此处L2即为R1 + 1)void merge(int A[], int L1, int R1, int L2, int R2){ int i = L1, j = L2; //i指向A[L1],j指向A[L2] int temp[maxn], index = 0; /...原创 2020-01-28 15:03:12 · 95 阅读 · 0 评论 -
快速幂(运算)
方法一:cmath库#include<cmath>double pow(double x, double y);返回值为xyx^yxy。方法二:基于二分法的二分幂快速幂基于以下事实:如果b是奇数,那么有ab=a∗ab−1a^b=a*a^{b-1}ab=a∗ab−1;如果b是偶数,那么有ab=ab/2∗ab/2a^b=a^{b/2}*a^{b/2}ab=ab/2∗ab/...原创 2020-01-27 14:21:05 · 181 阅读 · 0 评论