
C++的世界
文章平均质量分 78
这是本蒟蒻对C++的理解
herobrineAC
信息学社会团体团长
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++杂谈——关于C++多文件编译时会想到的问题(头文件,函数作用域)
关于使用头文件的原因,并通过分析函数在多文件情况下的作用域讲解头文件的工作原理原创 2024-10-25 22:29:09 · 374 阅读 · 0 评论 -
修灯
题目:一行信号灯,有些坏了,要求修好最少的灯,使存在一条连续K个灯没有坏输入第一行给出N,K,B分别代表一共有N个灯,希望有连续K个灯是好的,目前有B个灯是坏的接下来B个数字,代表坏的灯的编号 1≤N≤100,0001≤B,K≤NN个灯,B个坏掉的灯输出输出最少需要修好的灯样例输入 10 6 5210159样例输出 1水题,前缀和记录区间里有多少个坏了的灯泡,然后只需要枚举长度为k的区间,取每个区间的最小值即可。考试时数组开小了就离谱代码:#in原创 2020-11-04 19:08:15 · 562 阅读 · 0 评论 -
test-2020-10-27 (公交换乘 对称二叉树 photo)
时隔多月,终于准备再水一篇博客了,还有9天就CSP提高了,考完没一等奖就当中考er了,应该就不会怎么动这个博客了。这次考三道题,两道CSP2019-J原题,重温一下那种感觉吧。T1:公交换乘这道题是CSP2019-J的T3,满满的怀旧,当年就挫败在了这道题之下,现在一看,就一道模拟嘛。思路:题目给的很明确:如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满足条件,则优先消耗获得最早的优惠票。我们保证出行记录是按照开始乘车的时间顺序给出的,且不会有两次乘车记录出现在同一分钟。记录既原创 2020-10-28 21:25:33 · 277 阅读 · 0 评论 -
详解最小生成树——Prim&Kruskal
生成树是指在一个有个点的图中由n-1条边构成的子图并且每一个点都在这个子图中,其中总边权值最小的生成树就被称为最小生成树。如图所示:PrimPrim算法是通过扩展边来求最小生成树,其思路和Dijkstra非常相似,它从一个未被加入最小生成树的点开始,枚举所以从其出发的所有边,选出其中权值最小的一条边,将其加入最小生成树,将其到达的点加入最小生成树并将点标记,直到最小生成树里有n-1条边。如图所示,就是prim构造最小生成树的过程。核心代码如下:void prim(){ memset(dis,原创 2020-08-03 17:26:50 · 408 阅读 · 0 评论 -
Wormholes——SPFA判负环
题目:描述John在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John的每个农场有M条小路(无向边)连接着N(从1…N标号)块地,并有W个虫洞。其中1<=N<=500,1<=M<=2500,1<=W<=200。现在John想借助这些虫洞来回到过去(出发时刻之前),请你告诉他能办到吗。John将向你提供F(1<=F<=5)个农场的地图。没有小路会耗费你超过10000秒的时原创 2020-07-31 20:30:58 · 354 阅读 · 0 评论 -
奖金——构造最小拓扑序
题目:描述Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。于是Mr.Z下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为员工a的奖金应该比b高!”Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位员工奖金最少为100元。输入第一行两个整数n,m,表示员工总数和代表数;以下m行,每行2个整数a,b,表示某个代表认为第a号员工奖金应该比第b号员工高。n<=10000,m<=20000原创 2020-07-31 19:14:15 · 341 阅读 · 0 评论 -
拓扑——判断是否有唯一的拓扑序
题目:描述从前有一个萌萌哒的图,它是一个有向无环图。它想知道自己的拓扑序是否唯一。但因为图不会写代码,所以它把这个任务交给了你。输入第一行两个正整数 n, m 表示图的点数和边数。接下来 m 行,每行两个整数 x, y,表示有一条从 x 到 y 的有向边。1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000输入保证图中无环。输出如果图的拓扑序唯一,输出一行一个字符串 ”YES”。否则输出 “NO“样例输入4 41 22 32 41 3输出NO原创 2020-07-31 16:55:25 · 6948 阅读 · 1 评论 -
Dijkstra算法及其优化——最短路算法
Dijkstra算法(一下简称Dij),是目前主流的求最短路的方法,自从CCF出题人公开表明SPFA它死了,并且在2018年卡了一次毒瘤数据SPFA,SPAF便退下主流最短路之位。Dij实在每次进行扩展时,都去找相邻且离起点最近的点,这样就能达到最短路当前最优,但是并不代表未来最优,但是我们现在不考虑,那是Astar的事。Dij算法如上右图,BFS如左图,可见,BFS不能处理带权的最短路,只是暴力的扩展,而Dij可以。下面我们通过一道例题来理解Dij的代码实现。热浪输入第1行:4个由空格隔开原创 2020-07-31 09:15:48 · 862 阅读 · 0 评论 -
Revamping Trails 道路升级——多维最短路
题目:描述每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1…M.道路i连接牛棚P1_i和P2_i (1 <= P1_i <= N; 1 <= P2_i<= N). John需要T_i (1 <= T_i <= 1,000,000)时间单位用道路i从P1_i走到P2_i或者从P2_i 走到P1_i 他想更新一些路经来减少每天花在路上的时间.具体地说,他想更新K (1 <=原创 2020-07-30 16:59:08 · 315 阅读 · 0 评论 -
最短路上的统计——Floyd
题目:描述一个无向图上,没有自环,所有边的权值均为1,对于一个点对(a,b)我们要把所有a与b之间所有最短路上的点的总个数输出。输入第一行n,m,表示n个点,m条边接下来m行,每行两个数a,b,表示a,b之间有条边在下来一个数p,表示问题的个数接下来p行,每行两个数a,b,表示询问a,bn<=100,p<=5000输出对于每个询问,输出一个数c,表示a,b之间最短路上点的总个数样例输入5 61 21 32 32 43 54 532 55原创 2020-07-29 18:57:15 · 307 阅读 · 0 评论 -
Roadblocks——SPFA求次短路
题目:描述贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友。贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路。 贝茜所在的乡村有R(1<=R<=100,000)条双向道路,每条路都联结了所有的N(1<=N<=5000)个农场中的某两个。贝茜居住在农场1,她的朋友们居住在农场N(即贝茜每次旅行的目的地)。 贝茜选择的第二短的路径中,可以包含任何一条在最短路中出现的道路,并且,一条路可以重复走多原创 2020-07-29 16:38:45 · 420 阅读 · 4 评论 -
Hide and Seek 捉迷藏 USACO 最短路板子题
题目:描述贝茜在和约翰玩一个“捉迷藏”的游戏.她正要找出所有适合她躲藏的安全牛棚.一共有N(2≤N≤20000)个牛棚,被编为1到N号.她知道约翰(捉牛者)从牛棚1出发.所有的牛棚由M(1≤M≤50000)条双向路连接,每条双向路连接两个不同的牛棚.所有的牛棚都是相通的.贝茜认为同牛棚1距离最远的的牛棚是安全的.两个牛棚间的距离是指,从一个牛棚到另一个牛棚最少需要通过的道路数量.请帮贝茜找出所有的安全牛棚.输入第1行输入两个整数N和M,之后M行每行输入两个整数,表示一条路的两个端点.输出原创 2020-07-28 19:03:44 · 284 阅读 · 0 评论 -
位运算——关于状压DP
位运算就是直接对整数在内存中的二进制位进行操作。简单的说就是二进制计算,我们的状压DP是通过将状态转为二进制的01来表示再转为十进制存到数组中来达到压缩状态,所以要学好状压,一定要学好位运算.& and&,也就是and,“按位与”,也就是两个二进制数每一位与每一位进行计算,如果都为1则返回1。如1011与0101进行&运算则得到0001,如下图| or|,也就是or,“按位或”,就是两个二进制数各个数字一一进行比较,如果两个数其中一个为1则返回1。如1011和0101进行原创 2020-07-28 14:27:15 · 292 阅读 · 0 评论 -
方格取数——移动类DP
题目:设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放人数字0。如下图所示(见样例 ,黄色和蓝色分别为两次走的路线,其中绿色的格子为黄色和蓝色共同走过的):某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从A点到B点共走两次,试找出2条这样的路径,使得取得的数之和为最大。输入输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数原创 2020-07-27 20:42:53 · 298 阅读 · 0 评论 -
数字三角形4——移动类DP
题目:描述一个数字三角宝塔。设数字三角形中的数字为绝对值不超过1000的整数。小K从最顶层走到最底层,每一步可向下或右斜线向下走。每走过一个节点他会把这个节点的数字加在自己计数器中。另外他最多只能向下走k次。现在小K想知道他到达底层后,计数器中可能的最大的值。输入输入数据的第1行是数字三角形的行数n和能够沿左斜线向下走的次数k,1<=n<=1000,0<=k<=100。接下来n行是数字三角形各行中的数字。所有数字都小于1000。输出如题样例输原创 2020-07-27 20:21:25 · 330 阅读 · 0 评论 -
数字三角形3——移动类DP
题目:描述一个数字三角宝塔。设数字三角形中的数字为绝对值不超过1000的整数。小K从最顶层走到最底层,每一步可沿向下或右斜线向下走。每走过一个节点他会把这个节点的数字加在自己计数器中。另外他有一次机会,将他的计数器的数清零,他可以在任意时刻使用这次机会。现在小K想知道他到达底层后,计数器中可能的最大的值.输入输入数据的第1 行是数字三角形的行数n,1<=n<=1000。接下来n行是数字三角形各行中的数字。所有数字都小于1000。输出程序运行结束时,将计算出的最大原创 2020-07-27 20:07:23 · 298 阅读 · 0 评论 -
数字三角形2——含绝对值的移动类DP
题目:描述一个数字三角宝塔。设数字三角形中的数字为绝对值不超过1000的整数。现规定从最顶层走到最底层,每一步可沿向下或右斜线向下走。求解从最顶层走到最底层的一条路径,使得沿着该路径所经过的数字的总和的绝对值最大,输出最大值输入输入数据的第1 行是数字三角形的行数n,1<=n<=1000。接下来n行是数字三角形各行中的数字。所有数字都小于1000。输出程序运行结束时,将计算出的最大值输出。样例输入413 24 10 14 3 2 20输出24原创 2020-07-27 19:45:32 · 260 阅读 · 0 评论 -
传球游戏之最小总代价——状压DP
题目:描述n个人在做传递物品的游戏,编号为1-n。游戏规则是这样的:开始时物品可以在任意一人手上,他可把物品传递给其他人中的任意一位;下一个人可以传递给未接过物品的任意一人。即物品只能经过同一个人一次,而且每次传递过程都有一个代价;不同的人传给不同的人的代价值之间没有联系;求当物品经过所有n个人后,整个过程的总代价是多少。输入第一行为n,表示共有n个人(16>=n>=2);以下为n*n的矩阵,第i+1行、第j列表示物品从编号为i的人传递到编号为j的人所花费的代价,特别的有原创 2020-07-26 20:28:31 · 318 阅读 · 0 评论 -
旅行者的背包——分组背包类
题目:描述cici去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,每组至多只能选一个,现在,他想知道最大的利用价值是多少。输入两个数m,n,表示一共有n件物品,总重量为m接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数1<=m<=1000 1<=n<=1000 组数t<=100输出一个数,最大的利用价值样例输入45 310 10 110 5 150 400 2输出10原创 2020-07-26 17:27:03 · 446 阅读 · 0 评论 -
石子合并2——环状合并DP
题目描述在一个环形跑道上有N堆石子,每次取相邻两堆进行合并最终合并成为一堆。请问将每次合并后的代价进行累加其总和最少为多少输入第一行为石子堆数N,N<=200第二行到第N行,每行一个正整数代表石子数,其小于10000输出一行,表示最小的总得分样例输入44594输出43此题是典型的合并类DP,板子题,它和石子合并1所不同的是这次的跑道是环状的,也就是首尾相连,最后一个可以和最开始一个合并了。所以我们可以将数组开成双倍的,从而达到环的效果。借此机会原创 2020-07-26 17:00:15 · 459 阅读 · 0 评论 -
数据结构之堆——从听说到掌握
定义堆其实是用数组实现的二叉树,并不是非常高大上。应用构建优先队列支持堆排序快速找出一个集合中的最小值(或者最大值)在朋友面前装逼:)对的分类堆分两种,其一叫大根堆,另一个叫小根堆。大根堆在大根堆中,父节点的值比每一个子节点的值都要大。也就可以理解为大根堆会对放进里面的数会自动排序。定义:priority_queue<pa,vector<pa>,gre...原创 2019-12-29 15:13:26 · 325 阅读 · 0 评论 -
图解DFS(深度优先搜索)模拟全过程
DFS搜索是搜索中的一种,即深度优先搜索(Depth First Search),其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。图示:如图,这是邻接矩阵,我们要从s走到e,且“*”不能走,求所有方案。首先,从s出发,标记s然后通过s只能走到下面一个点,重复几次,我们走到了第一个岔路口。这时,我们有两个方向可以走,先向右走。现在只能...原创 2019-06-09 11:43:49 · 2463 阅读 · 0 评论 -
二叉树的先序、中序、后序遍历
二叉树,就是每个节点至多只会有两个子节点,如下图就是一个二叉树。接下来就进入正题:在二叉树的遍历中,一共有三种分类:先序、中序、后序遍历。例图:先序遍历先序遍历:根节点,左子树,右子树为了让大家更容易理解,我们来模拟一下。如图,我们走到了根节点1。 1走左子树,到达了2。 1 , 2再继续走左子树到达了4。 1 , 2 , 4这时走到了叶节点,于是回到此节点...原创 2019-10-18 19:55:49 · 1933 阅读 · 0 评论 -
new! NOIP学习路线参考
1.常用基础数据结构2.图和树基础3.广度优先搜索4.栈和递归5.深度优先搜索6.抽象深度优先搜索7.动态规划基础8.最短路算法9.不带权图算法10.并查集11.树的基础算法12.二分进阶13.基础数论14.组合数学15.图连通性算法17.线段树和树状数组18.kmp和字典树19.离散化和哈希20.树上动态规划21.动态规划的优化22.动态规划的优化进阶2...转载 2019-05-04 10:39:51 · 1547 阅读 · 0 评论 -
C++二分查找算法_YCOJ
首先,我们来了解一下二分查找: 二分查找这种东西嘛,是一种算法。他需要三种东西,left,right,mid,简称l,r,mid(这个好像没改,就取了一个首字母而已)。相当于在一个数组里先分成两半,看我们的mid(也就是中间数,公式:(l+r)/2)是否大于或小于我们要找的那个数(就设他为x嘛);如果小于,就说明x在后一半;反之就说明x在前一半;然后在对剩下的做上述处理。以此类推,直到r-l&amp;amp;amp;...原创 2019-02-13 13:32:45 · 691 阅读 · 0 评论 -
C++结构体的应用_YCOJ
结构体是一种自定义的东西,用struct来定义。在他里面, 可以装许多东西,比如int,string,char,bool等等等等。 如: struct a{ string name; int a; int b; }; …… a s; cin &amp;amp;gt;&amp;amp;gt; s.name; 代码示范: 例题...原创 2019-02-13 13:29:11 · 475 阅读 · 1 评论 -
字符串_YCOJ
字符串就是许多个字符合在一起,就变成了字符串。用string来定义变量。 注:字符串需要头文件 #include &amp;amp;amp;lt;string&amp;amp;amp;gt;字符串具备属于自己的函数,如:s.size(); // 得到字符串长度s.find('a');//从字符串s里寻找'a'的位置,若存在'a'则返回子串开头字符下标,否则返回-1。s.find(&amp;amp;quot;hello&a原创 2019-02-13 09:32:28 · 368 阅读 · 0 评论 -
c++的文件读入方式
这里用A+B问题做例子#include &amp;lt;bits/stdc++.h&amp;gt;using namespace std;int main(){ int a,b; freopen(&quot;in.in&quot;,&quot;r&quot;,stdin); freopen(&quot;out.out&quot;,&quot;原创 2019-02-12 20:13:50 · 608 阅读 · 0 评论 -
拓扑排序(入门)
拓补排序是一种图论算法。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序,这种操作得出的顺序就称为拓补序列。那我们应该进行怎样的排序呢?这就是我们这次研究的重点了。这就是拓补排序的操作过程,下面我们来详解一下。1.找到一个入度为0的点2.删掉它的所有的边,将它放进队列3.找到另一个入度为0的点4.删掉它的所有的边,将它放进队列5.重复1和2,直到...原创 2019-05-03 17:01:48 · 363 阅读 · 0 评论 -
背包问题
背包问题01背包完全背包问题混合背包压缩01背包01背包,他名字的来源就是有两种概念,选和不选,所以叫01背包。这种背包的大致题目是:有N件物品和一个容量为V 的背包。放入第i件物品耗费的空间是Ci,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大。这就是最基础的背包问题。用子问题定义状态:即dp[i, v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态...原创 2019-02-15 16:54:02 · 371 阅读 · 0 评论 -
图和树基础
2. 图和树基础 2.1. 什么是图 在一个社交网络中,每个帐号和他们之间的关系构成了一张巨大的网络,就像下面这张图: 那么在电脑中,我们要用什么样的数据结构来保存这个网络呢?这个网络需要用一个之前课程里未提到过的数据结构,也就是接下来要讲解的 图 结构来保存。到底什么是图?图是由一系列顶点和若干连结顶点集合内两个顶点的边组成的数据结构。数学意义上的图,指的是...转载 2019-02-13 09:30:07 · 1062 阅读 · 1 评论 -
广度优先搜索
3.1. 队列这一节我们先学习一个新的数据结构——队列。队列(queue) 是一种线性的数据结构,和栈一样是一种运算受限制的线性表。其限制只允许从表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。一般允许进行插入的一端我们称为队尾,允许删除的一端称为队首。队列的插入操作又叫入队,队列的删除操作又叫出队。可以把队列想象成购物时排队结账的队伍,先排队的人会先结账,后排...转载 2019-02-13 14:32:31 · 413 阅读 · 3 评论 -
常用基础数据结构
1.1. 动态数组有些时候想开一个数组,但是却不知道应该开多大长度合适,因为我们需要用到的数组可能会根据情况变动。这时候我们就需要用到动态数组。所谓动态数组,也就是不定长数组,数组的长度是可以根据我们的需要动态改变的。动态数组的实现也不难,在 C++ 里面有已经写好的标准模板库(StandardTemplate Library),就是我们常说的 STL 库,实现了集合、映射表、栈、队列等数...转载 2019-02-14 07:53:31 · 695 阅读 · 1 评论 -
深度优先搜索
5.1. 从递归到深度优先搜索深度优先搜索,简称 dfs,是一个经典的搜索算法,能够把具体的方案找出来。现在我们要把 dfs 和递归联系起来。前面学习递归的时候,我们学习过用递归实现阶乘int factorial(int n) {if (n == 1) {return 1;}return n * factorial(n ‐ 1);}和用递归实现斐波那契数列 int fib(i...转载 2019-02-15 09:53:21 · 383 阅读 · 0 评论