- 博客(42)
- 收藏
- 关注
原创 STL函数库大全
【pair】//pair的一些用法pair<int,int> p1;//定义一个pair类型的变量,类似与结构体p1=make_pair(4,5);//制造一个pair,把它的值赋值给p1pair<int,int> p2(3,4);//定义一个pair类型的变量p2,把(3,4)赋值给p2p2=p1;//把p1的值赋给p2cout<<make_pair(3,4).first<<endl;//制造一个pair,输出它的第一个类型的数cout<
2022-01-16 21:48:36 2845
原创 数论入门之整数
整除定义一个整数 aaa 能被另一个整数 ddd 整数, 记作 d∣ad \mid ad∣a,且意味着存在一个整数 kkk,使得 a=dka=dka=dk。特别的 000 能被任何数整除。一些简单的性质若a∣b&b∣a,a=b若a \mid b \And b\mid a,a=b若a∣b&b∣a,a=b若b∣a&c∣b,c∣a若b\mid a\And c\mid b,c\mid a若b∣a&c∣b,c∣a若c∣a&d∣b,cd∣ab若c\mid a\And
2022-05-10 20:29:23 262
原创 数论入门之欧拉函数
欧拉函数欧拉函数的定义1⋯n1\cdots n1⋯n 中与 nnn 互质的数的个数被称为欧拉函数,记为 φ(n)\varphi(n)φ(n)当我们把 NNN 看作 N=p1c1×p2c2×p3c3×p4c4×⋯×pmcmN=p_1^{c_1}\times p_2^{c_2}\times p_3^{c_3}\times p_4^{c_4}\times \cdots \times p_m^{c_m}N=p1c1×p2c2×p3c3×p4c4×⋯×pmcm 的形式我们发现对于 NNN
2022-04-30 17:35:30 397
原创 P3379 【模板】最近公共祖先(LCA)
【题目链接】link【解题思路】对于这道题,我们用暴力的思路其实很好写,先dfs一遍把树的深度求出来,来后我们求两点的最近公共祖先只需要先一步一步跳到同一高度。如果已经是同一高度,直接返回。到时只要两个同一高度的点一步一步同时向上跳即可。但是这种暴力的做法,显然时间复杂度太高了,我们要想办法优化?可以一次跳多步吗?这是我们就需要用到倍增的思想,我们从它能跳的最多步数 2i2^i2i 每次当 2i−12^{i-1}2i−1 步不能跳时,我们就继续将步数减半,这样我们能把原来求LCA的 Θ(n)\The
2022-01-19 11:13:19 283
原创 拓扑排序模板
【定义】拓扑排序应用于有向无环图之中,排序完以后会出现这样的性质:对于一个点p,只对排序位置在它之后的点有边。如果有环,则环上的点以及环上点所能到达的点都不会被放进拓扑序列中。举例来说,如果我们将一系列需要运行的任务构成一个有向图,图中的有向边则代表某一任务必须在另一个任务之前完成这一限制。那么运用拓扑排序,我们就能得到满足执行顺序限制条件的一系列任务所需执行的先后顺序。当然也有可能图中并不存在这样一个拓扑顺序,这种情况下我们无法根据给定要求完成这一系列任务,这种情况称为循环依赖(circular de
2022-01-14 12:02:54 282
原创 强连通分量的个数(Kosaraju)
【题目描述】求一个有向图中强连通分量的个数。【解题思路】先解释一下强连通分量的定义:一个有向图中,如果每两个点都相互连接(可以不直达),那么这个图就是一个强连通,我们可以把一个有向图分解成若干个强连通分量。那么我们应该怎么做呢?首先,从任意一个点开始遍历,记录每个点出栈的顺序。 原理,但我们对一个图进行dfs遍历的时候,我们从最深层开始出栈,如果我们把一个点的出度看作是通往下一层的话,那么我们最先出栈的肯定就是没有出度的了,当一个点的所有出度的点全部出栈了,那么我们也可以看作这个点的出度
2022-01-14 09:51:25 3131
原创 P6175 无向图的最小环问题(Floyd)
【题目链接】link【解题思路】题目中说了,至少要有三点才能算一个环,那么我们其实只需要枚举这三个点再将连接他们几个的三条边加起来就可以了。如果做完了Floyd再跑一次枚举三个点,我们会发现时间复杂度会慢一点,所以我们考虑进行一些优化,一边Floyd,一边求最小环,这样我们的时间复杂度会快一点。证明:当我们以 kkk 为中转点的时候,我们 1∼k−11\sim k-11∼k−1 的点一定是处理过的并且结果为最优,那么我们就以 kkk 为一个点,再在 1∼k−11\sim k-11∼k−1 枚举两个
2022-01-13 19:59:28 250
原创 P1037 [NOIP2002 普及组] 产生数题解(Floyd求联通问题)
【题目链接】link【解题思路】我们看见这道题很容易就会想到排列组合的乘法原理,但是我们每一位都有多少种可能呢,我们其实可以把这个问题转换成当前这位数字与多少个数字联通,我们这里处理是否联通用的是一种比较大众并且简单易懂的方法——Floyd变形那么我们怎么变形呢我们看一下Floyd的模板For (k = 1; k <= n; k++) For (i = 1; i <= n; i++) For (j = 1; j <= n; j++) If (dis
2022-01-13 15:35:52 236
原创 2650 最短缩减路径 (扩展域最短路)
【题目链接】link【解题思路】【思路一】首先,我们看到题目第一时间,可能就想到跑一遍最短路,然后选一条最长的边减半,但是显然我们这种做法是错误的,很容易就可以证伪,你们可以自己思考一下。我们要选择换一种思路,既然他只能把一条边减半,为是么我们不可以建两个图呢,我们在第一个图上的每一个点上都有一个机会减半进入下一层,但是第二层我们是不能返回第一层的,这样我们就可以把题目是实现啦。如图:其中 SSS 为起点 TTT 为终点。这样我们用SPFA跑一遍最短路,答案就轻松求出来了。这道题我们运用
2022-01-13 11:17:47 126
原创 最短路模板大全
【题目链接】link【spfa】#include<bits/stdc++.h>using namespace std;int n,m,s;struct note{ int x,y,next,w;}g[500010];int h[500010],tot=0,u,v,w;int d[500010],used[500010]={false};void add(int a,int b,int c){ g[++tot].x=a; g[tot].y=b; g[tot].w=c
2022-01-12 16:28:06 130
原创 最短路径问题SSL 1613(Floyed)
【题目描述】平面上有n个点(N<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点直线的距离。现在的任务是找出从一点到另一点之间的最短路径。【解题思路】这是一道最短路径问题的模板题,我们有很多种算法,这里我选用的是Floyed,Floyed的时间复杂度是 Θ(n3)\Theta(n^3)Θ(n3),但是他有一些优点,就是能够处理有负数的边权。那么我们的Floyed应该怎么实现呢?我们如果要
2021-12-25 16:00:09 1359
原创 P2449 [SDOI2005]矩形(矩形判重)题解
【题目链接】link【解题思路】这道题目所求的是形成不同块的个数,其实就是求图的连通分量,那么我们就可以使用并查集算法,如矩形 xxx 和矩形yyy 是重叠的,并且处于不同一个集合那么我们就把矩形 xxx 和矩形 yyy 连接,最后我们只要记录有多少个集合就可以了。这样子的做法,我们很容易就能够想到,但是问题在于如何判断两个矩形是否重叠。但是如果我们直接判断两个矩形是否重叠,我们会发现比较难判断,那么我们可以把两个矩形没有重叠的情况判断,剩下的就是重叠的情况而了。我们不重叠有分为两种情况,第一
2021-12-24 21:00:47 354
原创 P2502 [HAOI2006]旅行题解(暴力并查集判环)
【题目链接】link【解题思路】我们可以先对他的每一条边进行排序,这样我们就可以确定一条路径中的速度最大和最小值的位置。然后我们再枚举路的起点,显然我们把起点的速度当作最小速度,那么我们就只需要从前往后不断的加边,这样子我们就可以同过连接了一些边,间接的把 sss 和 ttt 连上,而最大的速度显然就是在最后那一条边上面,这样我们就求出了一条合法的路径,但这一条路径不一定是最优的,所以我们定义一个最大和最小值,只要将最大和最小值给更新,当找完所有的路径后,再进行输出。最后输出的时候再进行一些处理,
2021-12-18 15:52:25 291 1
原创 1416两点(DFS/BFS/并查集判环)题解
【题目链接】link【解题思路】这道题其实就是一道爆搜得题目,我们使用两种方法都是可以的,但是在这边我更推荐一点深搜,因为深搜我们是一条路走到底,那么我们只要找到一条首尾相连且长度大于 444 的路径就行了,注意不能走回头路。#include<iostream>#include<queue>#include<cstring> using namespace std;int n,m,zx,zy,h,t,flag,tot;int v[150][150];i
2021-12-18 10:11:26 270
原创 2667 染车题解
【题目链接】link【解题思路】一道bfs很简单的一道题,我们只要想明白一个点,我们如果当前位置是一辆车的话,那么我们的攻击力就只有一行一列,再讲遇到的没有重复的车放入队列,最后我们再将有多少个联通块统计出来即可。【CODE】#include<bits/stdc++.h>using namespace std;int n,m,s;int v[25][25];int fx[15]={0,0,1,0,-1};int fy[15]={0,1,0,-1,0}; char a[25]
2021-12-17 21:55:55 112
原创 SSL 1759求连通分量(七种做法)
【题目描述】【深搜(邻接矩阵)】#include<bits/stdc++.h>using namespace std;int G[1010][1010],v[1010];int n,x,y,s,ans=-0x7ffffff;void dfs(int x){ for (int i=1;i<=n;i++) if (G[x][i]&&!v[i]) v[i]=1,s++,dfs(i);}int main(){ cin>>n; ci
2021-12-17 20:43:33 129
原创 P1434 [SHOI2002]滑雪题解
【题目链接】link【解题思路】这道题目我们很容易就能够想到搜索的做法,但是如果是裸的搜索显然是过不了的。怎么办呢?我们发现这道题如果用裸的搜索的话,有一些位置我们会重复走很多次,我们可以把从当前位置我们可以给他加上一个记忆化,这样我们接可以愉快的AC了。...
2021-12-11 16:50:50 675
原创 P1435 [IOI2000] 回文字串 / [蓝桥杯 2016 省] 密码脱落题解
【题目链接】link【解题思路】这题我们要将一个长度为 nnn 的字符串改成一个回文字符串,最坏情况下我们也只需要插入 nnn 个字符,但是很显然有些字符是不需要我们插入的,那么我们就可以考虑去重。怎么去重呢?我们可以吧这个字符串反过来,和原字符串形成一个对照,求一个最长公共子序列(也就是相同的部分),用字符串的长度减去最长公共子序列的长度(也就是不同的部分),即为问题所求。证明:Ab3bd反过来为db3bA这样子我们就发现其实 b3bb3bb3b 是重复的,我们只要将 ddd 和
2021-12-08 17:26:09 866
原创 SSL1653数字游戏题解
【题目描述】【Description】小W发明了一个游戏,他在黑板上写出了一行数字a1,a2,a3,……,an,然后给你M个回合的机会,每会回你可以从中选择一个数字擦去它,接着剩下来的每个数字ai都要递减一个值bi。如此重复m个回合,所有你擦去的数字之和就是你所得的分数。 小W和他的好朋友小Y玩了这个游戏,可是他发现,对于每个给出的a和b序列,小Y的得分总比他高,所以他就很不服气。于是他想让你帮他算算,对于每个a和b序列,可以得到的最大得分是多少。【Input】输入文件的第一行是一个整数n(1&
2021-12-04 16:38:18 151
原创 P1908 逆序对 (归并排序)题解
【题目链接】link【解题思路】对于这道题我们很容易就能想出 Θ(n2)\Theta(n^2)Θ(n2) 的冒泡做法for (int i=1;i<n;i++) for (int j=1;j<=n-i;j++) if (a[i]>a[j]) { ans++; swap(a[i],a[j]); } 但是题目中说了对于所有数据,n≤5×105n \leq 5 \times 10^5n≤5×105Θ(n2)=105×105=1010\Theta(n^2)
2021-12-04 12:23:30 1378
原创 P2439 [SDOI2005]阶梯教室设备利用 And P1868 饥饿的奶牛 题解
系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例
2021-12-04 10:11:58 165
原创 SSL 1633农田个数解题思路
【题目描述】【Description】你的老家在河北农村。过年时,你回老家去拜年。你家有一片NM农田,将其看成一个NM的方格矩阵,有些方格是一片水域。你的农村伯伯听说你是学计算机的,给你出了一道题: 他问你:这片农田总共包含了多少个不存在水域的正方形农田。 两个正方形农田不同必须至少包含下面的两个条件中的一条: 边长不相等 左上角的方格不是同一方格【Input】输入数据第一行为两个由空格分开的正整数N、M(1<=m 第2行到第N+1行每行有M个数字(0或1),描述了这一片农田。
2021-12-03 19:54:59 86
原创 SSL 1638 PKU2756拔河比赛题解
【题目描述】【题干】一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近。【Input】输入数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight<=450)。【Output】输出数据应该包含两个整数:分别是两个组的所有人的体重和,用一个空格隔开。注意如果这两个数不相等,则请把小的放在前面输出
2021-12-02 17:31:37 573
原创 P1282 多米诺骨牌题解
【题目链接】P1282【解题思路】这道题我本来是想用贪心,用sort从大到小排序后,减去两张骨牌的差直到最小,结果却发现自己WA了。很显然我的贪心是错误的,于是我后来就用了老师教的 dpdpdp (其实贪心也是可以的)。我们首先把它当作一道判定性的问题来思考发现其实并不难。定义 fi,jf_{i,j}fi,j 代表前 iii 张骨牌能否凑成差为 jjj,当自己辛辛苦苦码好了代码,却发现问题问的是最少步骤。不过也没有太大的关系,我们将判定的是否存在的 truetruetrue 和 falsef
2021-11-27 15:04:40 388
原创 P1006 [NOIP2008 提高组] 传纸条题解
【题目链接】P1006【解题思路】与这个一模一样,直接上code。【CODE】#include<iostream>using namespace std;int n,m,p;int x,y,z;long long a[51][51];long long d[51][51][51][51];int main(){ cin>>n>>m; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++)
2021-11-27 11:58:59 361
原创 P1004 [NOIP2000 提高组] 方格取数题解
【题目链接】P1004双倍经验【解题思路】这道题它只能向下和向右走,没有后效性,我们考虑用 dpdpdp 来做。它说找两条路,我们其实可以两条路一起进行操作。定义 di,j,k,ld_{i,j,k,l}di,j,k,l 是第一条路走到 (i,j)(i,j)(i,j),第二条路走到 (k,l)(k,l)(k,l) 的最大值,这样我们很轻松就可以推出动态转移方程。di,j,k,l={max(di−1,j,k−1,l,di−1,j,k,l−1,di,j−1,k−1,l,di,j−1,k,l−1)+
2021-11-27 10:58:59 345 1
原创 取数字问题题解
【题目链接】1644【解题思路】【方法一】这道题看着那么小的数据范围就很像是 dfsdfsdfs,我们先考虑用 dfsdfsdfs 来做,可是普通的 dfsdfsdfs 是会超时的,我们考虑剪枝。因为它得到的值可能会有些重复,我们可以用上以前学过的记忆化,把当前位置的值有没有算出过存起来,一次再算出这个值,直接退出。然后我们就可以愉快AC了。【CODE】#include<iostream>using namespace std;const int M=11000;int n,
2021-11-27 09:55:04 293
原创 竞赛真理题解
【题目链接】1377【解题思路】用了完全背包的思想,分两组做01.【CODE】#include<iostream>using namespace std;int n,V;int v1,v2,v3,v4;int d[1080010];int main(){ cin>>n>>V; for (int i=1;i<=n;i++) { cin>>v1>>v2>>v3>>v4; for (int
2021-11-27 08:23:43 512
原创 P1757 通天之分组背包题解
文章目录【题目链接】【解题思路】【题目链接】洛谷P1757【解题思路】和题目名一样,本题就是一道分组背包的模板题,我来讲一下分组背包。首先,全部的背包都是可以转化成01背包来做的。例如:完全背包102 3 4我们可以将其转化成102 2 2 2 2 3 3 3 4 4来做01背包。但是当背包容量很大时,我们会发现这样子的效率太低了。怎么办呢?我们可以利用二进制优化。例如:1001我们拆的时候可以拆成1001 2 4 8 16 32 37这样我们也可以用这
2021-11-27 07:59:08 172
原创 书的复制(normal)题解
书的复制题目描述Description现在要把m本有顺序的书分给k个人复制(抄写),每个人的抄写速度都一样,一本书不允许分给两个或两个以上的人抄写,分给每个人的书,必须是连续的,比如不能把第一、第三、第四本书给同一个人抄写。现在请你设计一种方案,使得复制时间最短。复制时间为抄写最多的人用去的时间。Input第一行两个整数,m,k(k<=m<=500)第二行为m个整数,第i个数表示第i本书的页数。Output最短时间Sample Input9 31 2 3
2021-11-26 20:58:12 253 1
原创 P5380 [THUPC2019]鸭棋题解
目录鸭棋题解题目描述解题思路CODE鸭棋题解题目描述传送门 鸭棋解题思路按照题解模拟即可,要注意各种棋子移动的数组有没有写错,我调这个用了一个多月。CODE#include<bits/stdc++.h>using namespace std;string qipan[1001][1001]={ {"red car","red horse","red elephant","red guard","red captain","red guard","red elephant",
2021-11-26 20:34:02 417
原创 P1000 超级玛丽游戏 题解
P1000 超级玛丽游戏 题解题目传送门分析:这道题特别毒瘤 bushi,我打了老久才过它特别考验你对coutcoutcout与printfprintfprintf的掌握话不多说,上CODECODE:#include<iostream>using namespace std;int main(){ cout<<" ********"<<endl; cout<<" **
2021-08-25 07:49:13 820 3
原创 SSL2863石子合并 题解
SSL2863石子合并 题解题目描述:有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动相邻的2堆石子合并,合并花费为新合成的一堆石子的数量。求将这N堆石子合并成一堆的总花费最小(或最大)。分析:我们先把方案数用图画出来方案一代价为10+9+19=38方案二代价为5+11+19=35分析:这是石子归并的简化版本,石子处于一排。由于发现只能是相邻的2堆石子进行归并。我们会发现,贪心算法在此处便失去作用,局部最优解并不能带来整体最优解。因此,不难让我们想到,此题应该采取DP(d
2021-08-21 09:35:14 189 5
原创 P1439 【模板】最长公共子序列 题解
P1439 【模板】最长公共子序列 题解题目传送门分析:如果大家看它是道最长公共子序列的模板题,就直接打个O(n2)O(n^2)O(n2)的模板的最长公共子序列上去,你会发现你的程序愉快地RE了,只拿到了50分RE瞬间50分的CODE:#include<iostream>#include<cstdio>#include<cstring>using namespace std;int d[10001][10001],n,a[10001],b[10001]
2021-08-21 09:01:09 219 7
原创 P1474 [USACO2.3]Money System / [USACO07OCT]Cow Cash G题解
P1474 [USACO2.3]Money System / [USACO07OCT]Cow Cash G题解题目传送门分析:这道题我们看到货币能无限使用就能够像到这是一道完全背包求方案数问题我们先设一个ddd数组,did_idi表示凑成iii的方案数然后我们就只要考虑一个初始化的问题因为他只有凑满了iii才能算一种方案,我们就可以就是将d0d_0d0初始化为1动态转移方程就很容易推出来了did_idi=max(di−w[i]d_{i-w[i]}di−w[i]+1,did_idi
2021-08-19 16:34:07 224 11
原创 SSL1045 01背包题解
SSL1045 01背包题解题目描述:一共有N件物品每件物品有两个属性:重量 : wiw_iwi价值 : pip_ipi现在有一个背包容量为W. 问这个背包最多可以装价值为多少的物品?输入:4 10 //第一个数表示物件个数n,第二个数表示背包重量5 8 //第一个表示物体得量,第二个表示价值,以此类推3 64 72 5输出:19 //最大价值分析:显然这个题可用深度优先方法对每件物品进行枚举(选或不选用0,1控制). 程序简单,但是当n的值很大的时候不能满足时
2021-08-19 11:43:51 137 3
原创 SSL 1459最长上升子序列题解
SSL 1459最长上升子序列(DP经典例题)题目描述:设有整数序列b1,b2,b3,…,bm,若存在下标i1<i2<i3< …<in,且bi1<bi2<bi3< …<bin,则称 b1,b2,b3,…,bm中有长度为n的不下降序列bi1 , bi2 ,bi3 ,…,bin 。求序列b1,b2,b3,…,bm中所有长度(n)最大不下降子序列输入:整数序列。输出:最大长度n和所有长度为n的序列个数输入:103 18 7 14 10 12 23 4
2021-08-18 21:25:29 137 4
原创 SSL1277骑士游历 题解
骑士游历SSL 1277题解问题描述:问题描述:如下图所示有m*n一个棋盘,在棋盘左下角的A(1,1)点,有一个中国象棋〈马〉,并约定马走的规则:①走日字;②只能向右走。找出从A点(1,1)到B点(m,n )的路径条数。输入:8 9输出:10分析:DFS模板题CODE:#include<iostream>#include<cstdio>#include<cstring>using namespace std;int M,N,ANS=0;i
2021-08-17 21:50:16 309 4
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人