C++
文章平均质量分 50
和C++有关的博文
Andysun06
这个作者很懒,什么都没留下…
展开
-
2021优秀C++教程大全【入门至提高】【初赛&复赛】【建议收藏】
零、初赛相关基础知识题库一、语言基础指针和结构体关于指针的那些事二、算法基础快速排序图解快速排序三、数据结构树树的简介及二叉排序树C++模板实现.关于二叉查找树的一些事儿(bst详解,平衡树入门)树的简介及二叉排序树C++模板实现.史上最强图解Treap总结, 不是浅谈!无旋Treap——FHQ-Treap详解FHQ-Treap学习笔记浅析Treap——平衡树栈栈的简介及C++模板实现 ←总结(更加具体)原创 2021-08-09 11:46:21 · 619 阅读 · 0 评论 -
【题解】平版
文章来源题目题目描述小明喜欢玩拼板游戏,买了NNN块正方形的拼板,边长分别是A1,A2,...ANA_1,A_2,...A_NA1,A2,...AN。可是在玩拼图游戏的过程中,他发现自己把拼板的尺寸搞错了。所以他需要调换其中的一些,使得调换以后所有拼板总面积正好是MMM。调换拼板是需要成本的,把一块边长是AiA_iAi的拼板替换成一块边长是BiB_iBi的拼板需要的成本是(Ai−Bi)2(A_i-B_i)^2(Ai−Bi)2。特别的,小明只能把之前买的拼板用来做调换。也就是说,他不能用A转载 2021-10-24 06:00:00 · 304 阅读 · 0 评论 -
【YBTOJ】二分例题1——数列分段
题目:题解题意:把一段数列分成 M 段,并且满足各段所有数的和的最大值是所有分段方法中最小的做法:用二分枚举答案,易证:每段和的最大值一定在 l~r 范围内( l 是数组中的最大值,r 是数组里所有数的和)定义一个变量 mid 如果每段和的最大值最小为 mid 看能否分成 M 段,如果可以,在 l~mid 里继续搜索,否则在 mid+1~r 里直到 l==r 就是答案#include<iostream>#include<cstdio>using namespac原创 2021-10-06 15:14:14 · 261 阅读 · 0 评论 -
2021年CSP-S初赛试题
下载地址:http://cloud.hackingfans.top/index.php?mod=shares&sid=V0JhSVpzOGUtQmsya1diN3FtaXFabzRIVHIwdGJMSTFuUW53原创 2021-09-19 12:33:15 · 1227 阅读 · 0 评论 -
P类问题和NP类问题—超简单理解
P类问题:可以用一个时间复杂度为多项式级别∗^*∗的的算法来解决的问题,就是P类问题NP类问题:可以在时间复杂度为多项式级别的方法来判断有无解的问题,就是NP类问题* :多项式级别就是例如O(1), O(na^aa), 这类的时间复杂度...原创 2021-08-18 18:58:07 · 599 阅读 · 0 评论 -
C++数列分块1代码详解
题目#include<bits/stdc++.h>#define reint register int#define ll long longint a[50005],add[50005],block[50005],opt,l,r,c; //a是原数组。add存当前分块整体加的数,block存是哪一个块using namespace std;int n,sn;void Add(int l,int r,int c) { //在l,r区间内加c reint i; if(blo原创 2021-08-17 19:01:05 · 347 阅读 · 0 评论 -
【YbtOJ】雷达装置
题目#include<bits/stdc++.h>#define reint register int#define ll long longusing namespace std;struct nod{ //存雷达区间 double l,r;}f[1005];int x[1005],y[1005],ans;bool cmp(nod a,nod b){ //按右边缘排序 return a.r<b.r;}int main(){ int n,d; scan原创 2021-08-16 18:02:42 · 190 阅读 · 0 评论 -
【YbtOJ】奶牛晒衣服
题目代码:#include<bits/stdc++.h>#define reint register int#define ll long longusing namespace std;int h; int main(){ int n,a,b,t(0); priority_queue<int> q; //优先队列 scanf("%d%d%d",&n,&a,&b); for(reint i=1;i<=n;++i){ sc原创 2021-08-16 16:11:52 · 185 阅读 · 0 评论 -
C++优先队列
优先队列所需头文件 #include <queue>他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队(其实就是在先返回最大的或最小的)定义priority_queue<int, vector<int>, less<int> > a; //等同于 priority_queue<int> a ,大顶堆,先返回大的priority_queue<int, vector<int>, g原创 2021-08-16 15:57:07 · 140 阅读 · 0 评论 -
C++主席树求第k小得数模板程序详解
#include<bits/stdc++.h>#define reint register intusing namespace std;int n,m;inline void read(int &a) { //快读 int x(0),y(1); char c=getchar(); while(c<'0'||c>'9') { if(c=='-')y=-1; c=getchar(); } while(c>='0'&&c<=原创 2021-08-13 22:01:11 · 190 阅读 · 0 评论 -
C++主席树的单点修改&单点查询模板代码详解
部分操作和线段树相似,本文不作解释,如果对未作解释的部分有疑问的,可以看这篇博文,讲得很详细#include<iostream>#include<cstdio>#define reint register intusing namespace std;int n,m;int s[1000005],v,loc,value,p,root[1000005],top; //s存原数组,v,loc,value,p意义与题目相同,root存根,top统计节点数struct n.原创 2021-08-13 18:15:01 · 420 阅读 · 0 评论 -
C++笔记
scanf的返回值是成功读入的个数,如果读入失败会返回-1即EOF原创 2021-08-13 17:42:05 · 120 阅读 · 0 评论 -
C++线段树区间乘法&区间加法&区间查询代码详解(可能是最详细的了)
当我刚刚接触线段树区间乘法时,因为一直没想懂乘法和加法的懒标记怎么一起下推,上百度和CSDN搜索程序讲解,但搜到的绝大多数都是一些没有讲解,直挂代码的博文,很难让人看懂代码意思,往往会花费大量时间在理解变量的作用和操作的原理,因此为了方便初学者学习(也为了方便我以后复习),就写了这篇博文,希望对你有所帮助!题目:代码解释:代码虽然长,但原理简单#include<iostream>#include<cstdio>#define ll long longusing.原创 2021-08-12 21:24:21 · 991 阅读 · 0 评论 -
记录一个做题思想——时间倒流
题目:题解:代码:#include<bits/stdc++.h>#define reint register intusing namespace std;struct nod { int w,t; //w表示做这件事需要的精力 ,t是做事可以获得的信誉 int b; //b用来记录这件事是第几个真香(第几个被不用做)} f[10001]; //f用来记录每个事的数据int n,m;int dp[10001],ff[10001]; //dp记录动态规划的结果,原创 2021-08-12 16:20:21 · 156 阅读 · 0 评论 -
C++线段树区间加法&区间查询代码详解(超详细)
#include <bits/stdc++.h>#define MAXN 100005using namespace std;typedef long long ll;inline ll read() { //快读 ll ans = 0; char c = getchar(); while (!isdigit(c)) c = getchar(); while (isdigit(c)) { ans = ans * 10 + c - '0'; c = getchar原创 2021-08-11 22:01:05 · 558 阅读 · 0 评论 -
C++差分思想详解
举个例子,有一个数组 a[]={ 1,5,3,7,2,8 }。他的差分数组就是 b[]={ 1,4,-2,4,-5,6 }想必你也很快发现了他们之间的联系,bi=ai−ai−1b_i=a_i-a_{ i-1 }bi=ai−ai−1 ,因此可以推出 ai=b1+b2+b3+...+bia_i=b_1+b_2+b_3+...+b_iai=b1+b2+b3+...+bi 。当我们把 a2a_{2}a2 到 a5a_5a5 都加上 2 后,数组 a 就变成了 a[]={ 1,7,5,9,4,原创 2021-08-11 20:08:23 · 1313 阅读 · 0 评论 -
树状数组模板程序讲解2(超详细)
本文主要介绍和解释树状数组的区间修改和单点查询的模板区间修改和单点查询请看树状数组模板程序讲解1(超详细)模板题目:题目链接模板代码:本题需要用到差分思想,如果不会可以先在这里学习,否则很难理解本题做法(而且差分经常和树状数组一起出现)为了方便你对程序的理解,可以在不太清楚的地方结合此图思考一下,能节约思考时间。讲解请看代码注释#include<iostream>#include<cstdio>#define reint register int.原创 2021-08-11 19:43:41 · 279 阅读 · 0 评论 -
题解 CF851A 【Arpa and a research in Mexican wave】
CF851A 题解题目分析:本题题面较为复杂,导致像我这样的初学者有点糊涂。但是,静下心来仔细推一推式子,看看样例解析。很显然,只有三种情况。如果 t≤kt\le kt≤k,就是 ttt 个人站着如果 k≤t≤nk\le t\le nk≤t≤n,就是 kkk 个人站着如果 n≤t≤n+kn\le t\le n+kn≤t≤n+k,就是 n+k−tn+k-tn+k−t 个人站着在了解了这三种情况的时候,就可以写出代码了。题目难度及考点:大致难度在 入门 左右,主要是考思维,代码较为简单。做原创 2021-08-11 17:53:48 · 82 阅读 · 0 评论 -
避免在CSP&NOIP竞赛中因编译错误导致爆零的方法
一、打开全部警告提示打开步骤:按下 Alt+t ,点击编译选项找到“代码生成/优化”找到“代码警告”选择“显示最多警告信息”步骤图:这样就可以看到编译器的所有警告信息,按照编译器的警告修改你的代码,因为本地编译器和CSP使用的编译器不完全相同,有可能在本地是警告而在评测时就是错误,如果在比赛中遇到就很有可能带来遗憾,在修改后就可以避免本地编译通过,而提交显示编译错误的情况。友情链接:优秀C++教程大全【2021最新】【入门至提高】【初赛&复赛】...原创 2021-08-11 17:48:56 · 893 阅读 · 0 评论 -
树状数组模板程序讲解1(超详细)
本文主要介绍和解释树状数组的模板,方便初学者理解树状数组程序写法,如果你还不清楚树状数组的原理or作用,可以在这里寻找适合你的教程~模板题目:题目连接模板代码:为了方便你对程序的理解,可以在不太清楚的地方结合此图思考一下,能节约思考时间。讲解请看代码注释#include<iostream>#include<cstdio>using namespace std;int f[2000001],n; //f用来维护树状数组,n是 数列数字总个数int lo.原创 2021-08-11 17:27:28 · 188 阅读 · 0 评论 -
洛谷 CF63A 题解
CF63A 题解一. 题目分析:首先,看到题目,我们就知道,一共有n个人,有四个等级,分别是:老鼠(rat)妇女(woman)和儿童(child)男人(man)船长(captain)二. 题目难度:个人认为在 普及- 难度左右当船沉时,需要按照这四个等级依次下船,如果等级相同,则按照序号,小的先下船。三. 做法分析:因为每个人的姓名和身份输入时,就是按顺序的,所以我们...原创 2021-08-10 17:56:22 · 299 阅读 · 0 评论 -
最小生成树Kruskal算法详解
Kruskal算法简介:Kruskal 算法是一种用来求最小生成树的算法,在稀疏图中比 Prim 有更高的效率,且方便实现,所以本文重点讲解 Kruskal 算法的用途和使用方法Kruskal算法原理:Kruskal 算法主要利用贪心的思想使得边权和最小Kruskal 算法步骤:把 mmm 条边按边权从小到大排序把图中的 nnn 个顶点看成独立的 nnn 棵树组成的森林;先从边权小的边开始循环,通过并查集判断添加这条边后是否会形成环(也就是能否连接两个不同祖先的点),如果可以,则添加这条边。原创 2021-08-10 17:41:26 · 1054 阅读 · 0 评论 -
C++队列实现(STL实现和数组实现)
STL队列的分析及用法:包含队列的头文件:#include<queue> 。队列的特点:先进先出,与栈相反定义一个队列:queue<Type> q; 其中Type为数据类型。队列的主要操作: q.push(a)//将a压入队列尾部 q.pop()//删除队首元素,但不返回 q.front()//返回队首元素,但不删除 q.back()//返回队尾元素,但不删除原创 2021-08-09 17:48:19 · 485 阅读 · 0 评论 -
C++栈用法(STL实现&数组实现)
STL栈的分析及用法:包含栈的头文件:#include<stack> 。栈的特点:先进后出,与队列相反定义一个栈:stack<Type> s; 其中Type为数据类型。栈的主要操作: s.push(a);//将a压入栈顶 s.pop();//删除栈顶的元素,但不会返回 s.top();//返回栈顶的元素,但不会删除 s.size();//返回栈中元素的个数 s.原创 2021-08-09 17:46:42 · 557 阅读 · 0 评论 -
【YbtOJ高效进阶2021】【广搜BFS教程】【例题1】走迷宫图——超详细题解
题目:题目大意:题目让我们求两点间的最短路径长度,显然是需要广搜,因为广搜先搜到一定就是最短路,深搜可以搜索路径,但搜到的不一定最短,往往都需要多次回溯和判断,耗时太长,只能过1个点。做题思路:刚开始做这题时,我毫不犹豫的打完了深搜的代码(虽然我知道是广搜),然后一直TLE,我还全然没发现自己写错了算法,我的深搜错误代码:#pragma GCC optimize("Ofast","inline","-ffast-math")#pragma GCC target("abm,avx,mmx,pop原创 2021-08-10 11:33:40 · 332 阅读 · 0 评论 -
C++调试时出现<optimized out>问题的解决办法
问题场景:问题如下图原因分析:出现这种问题的原因大部分是因为GCC自动开启了O2优化选项,也有可能是人为的O1,O2,O3,Os优化,这都有可能导致在单步调试时出现<optimized out>的错误,比如下图所示代码就会导致无法单步调试:解决方案:对于GCC自动开启的优化:在编译选项中把 -O2 改为 -O0对于人为开启的优化:用//或者/* */把优化代码注释掉,或者删除有帮助的话点个赞再走呗~...原创 2021-08-10 10:18:47 · 8248 阅读 · 4 评论 -
进制转换方法总结(详细图解)
我们都会学习数学,也知道数学中基本上都是使用 十进制,当我们接触 OI 会认识 二进制,八进制,十六进制等,下面,让我来介绍一下这些进制:十进制:所为十进制,就是满十进一,在一串数字中,只有 0 1 2 3 4 5 6 7 8 9 这些数,不会出现 9 以上的数,这就是满十进一的十进制,也是人们最熟悉的一种进制,计算难度低。二进制:所为二进制,就是满二进一,在一串数字中,只有 0 1 这些数,不会出现 1 以上的数,这就是满二进一的二进制,是人们较为熟悉的一种进制,也是计算机使用的一种进制,原创 2020-07-28 17:24:58 · 3096 阅读 · 0 评论 -
C++随机数生成
使用方法:随机数头文件 #include <cstdlib>时间头文件 #include <ctime>在头文件下添加宏定义 #define random(a,b) (rand()%(b-a)+a)在主程序开头加上 srand((int)time(0));最后,在程序中加入 random(l,r); 就可以求 lll 到 rrr 之间的随机数了。5.程序示范: #include <iostream> #include原创 2021-08-09 18:01:19 · 1011 阅读 · 0 评论 -
C++语言简介
目录:什么是信息学奥林匹克竞赛什么是C++语言C++语言特点C++语言标准C++语言工作原理安装DEV C++推荐书籍内容:1. 信息学奥林匹克竞赛信息学奥林匹克竞赛是一项益智性的竞赛活动,核心是考查选手的智力和使用计算机解题的能力,选手首先应针对竞赛题目的要求构建数学模型,进而构造出计算机可以接受的算法,之后编写出计算机能够执行的程序。程序设计是信息学竞赛的基本,选手参与竞赛活动的第一步是熟练掌握一门程序设计语言,目前竞赛中允许使用的程序设计语原创 2021-08-09 19:50:38 · 1905 阅读 · 0 评论 -
C++并查集用法教程(文档&视频教程)
并查集,顾名思义,就是有合并,查找等操作的集合。文档教程????这里视频教程????这里∙\bullet∙ 程序模板: #include<iostream> #include<cstdio> using namespace std; int a[10001],i; int zhao(int x) { //用来查找x的祖宗 if(a[x]==原创 2021-08-09 17:57:26 · 205 阅读 · 0 评论 -
C++线性筛(模板&原理)
线性筛用途:快速的求范围 nnn 内的所有素数,其时间复杂度小于暴力求素数。线性筛原理:具体见这里程序模板: bool isPrime[100000010]; int Prime[5000010], cnt=0; void GetPrime(int n) { memset(isPrime, 1, sizeof(isPrime)); isPrime[1] = 0; ..原创 2021-08-09 17:58:00 · 451 阅读 · 0 评论 -
快速维护数列的中位数
例题:题目描述:在一个长度为 nnn 的数列 aaa 中,做 mmm 次操作,操作种类如下:操作1:查询当前数列的中位数,用 C 表示操作2:在数列的第 xxx 个数与第 yyy 个数中插入一个数 kkk ,用 T x y k 表示操作3:删除数列中的第 xxx 个数 ,用 S x 表示输入:第一行,两个数 n,mn,mn,m第二行,共 nnn 个数,即数列 aaa接下来m行,每行都有一个操作输出:输出每次查询的结果样例输入:4 21 2 3 4S 2C样例输出:3原创 2021-08-09 15:55:08 · 577 阅读 · 0 评论 -
【一本通高效进阶】E.1.划分数列详细题解
题面:题目描述给定一个长度为 n 的数列 ,要求划分最少的段数,使得每一段要么单调不降,要么单调不升。输入格式第一行一个整数 n 。接下来 n 个数表示数列 。输出格式输出最少的划分数。样例样例输入 161 2 3 2 2 1样例输出 12样例输入 291 2 1 2 1 2 1 2 1 样例输出 25样例输入 371 2 3 2 1 999999999 1000000000样例输出 33题解博主使用的是最好理解的模拟做法思路:用一次循原创 2021-08-08 18:27:02 · 420 阅读 · 0 评论 -
无旋Treap——FHQ-Treap详解
FHQ-treap——无旋treap前置知识:二叉排序树treap了解什么是函数式编程引入“平衡树好烦啊,转来转去的,而且treap遇到区间序列问题就gg。”“有一种不用旋转的treap,叫FHQ-treap,可以解决区间序列问题。”正文约定我们做出以下约定:int ch[MAXN][3];//0 左孩子,1右孩子int val[MAXN];//每个点的权值int rnd[MAXN];//每个点的随机权值int size[MAXN];//以每个点为根的树的大小转载 2021-01-29 20:16:57 · 704 阅读 · 0 评论 -
C++最短路径Dijkstra算法详解
第一步定义数组和变量:int f[101][101]; //将得到的数据转化成邻接矩阵int ans[101]; //用来记录答案(从1到各点的最短路径)int q1[105],l=0,r=1; //队列,详见《笔记——栈,队列,快速幂,线性筛,并查集,随机数》bool YN[101]; //记录一个点是否入队然后初始化:for(re int i=1;i<=n;++i){ YN[i]=false; for(re int j=1;j<=n;++j){ if(i!原创 2020-07-29 15:26:06 · 593 阅读 · 0 评论 -
C++程序优化方法总结
1. 读入优化(快读)原理:利用getchar读入更快的原理,读入字符后转换成数字代码:int qread() { int x(0),y(1),c=getchar(); while(c<'0'||c>'9') { if(c=='-')y=-1; c=getchar(); } while(c>='0'&&c<='9') { x=(x<<1)+(x<<3)+(c^48); c=getchar(); } return原创 2020-07-29 11:31:57 · 2157 阅读 · 0 评论 -
栈,队列,快速幂,线性筛,并查集,随机数
蒟蒻Andysun06的学习笔记本文章未经博主许可,不能转载!一、前言:本文章是蒟蒻我独立创作的,大部分内容都是基础,还包括一些其他东西的用法(例如随机数),本文章所涉及的知识大部分都是自学的(因为还没找到适合我的老师)。还有一部分,是@FCBM71 和@jijidawang 等大佬教我的,我在此感谢他们对我的教导,希望我可以和他们共同努力,变得更厉害,也谢谢广大谷友对我的帮助和支持,我会...原创 2020-03-28 13:26:48 · 234 阅读 · 0 评论 -
C++链式前向星详解
概念:链式前向星是一种主要根据存边号来存图的存储结构需要建立的变量: cnt,head[点数],to[边数],nxt[边数]。cnt是一个一直在递增的变量,表示正在建的是第cnt条边。head[u]表示从u点向外连的边的最后一条边(根据存边的顺序)的编号。to[i]表示第i条边指向的点。nxt[i]表示对于编号为i的边,它的起始节点所连的边根据建边顺序i编号的边的上一条边的编号。部分代码:inline void add(int u,int v){ //建立..原创 2020-07-28 16:26:10 · 915 阅读 · 0 评论 -
C++辗转相除法详解
求最大公约数有两种方法:1.暴力枚举,从两个数中较小的那个数开始,一个一个从大到小枚举,最先枚举到的,就是最大公约数,此方法很简单,但是速度较慢。2.欧几里德算法(也叫辗转相除法),公式:gcd(a,b) = gcd(b,a mod b)证明过程如下:辗转相除法的证明方法(摘自百度):证法一 a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则...原创 2020-03-06 13:38:47 · 4328 阅读 · 0 评论