自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

题解的个人总结,仅供参考

唯有源源不断地学习,才能让人感受到活着

  • 博客(101)
  • 收藏
  • 关注

原创 PTA L2-024 部落

题目复习一下并查集。首先将小部落内的人的father标记为部落序号,接着部落序号进行并查集的操作。#include <bits/stdc++.h>using namespace std;const int N=1e4+10;int n, tree[N], father[N];bool vis[N]={false};/*简单并查集int findFather(int x){ while(x!=father[x]){ x=father[x]; }

2022-04-20 21:11:51 357

原创 PTA L2-002 链表去重

题目注意一下,可能形成最原始的链表的结点数量不到n#include <bits/stdc++.h>using namespace std;const int N=1e6+1;int st, n, p1[N], p2[N], r1[N], r2[N];bool vis[N]={false};int main(){ scanf("%d%d", &st, &n); int a, b, c; for(int i=0; i<n; i++){

2022-04-20 15:33:09 947

原创 PAT (Advanced Level) Practice 1165 Block Reversing

题目没有用链表,感觉用指针写太麻烦了,想起当初刚学数据结构被链表支配的恐惧。坑点是可能的有不在链表的数据,链表的长度不一定为n.#include <bits/stdc++.h>using namespace std;const int N=1e6;int judge1[N], judge2[N], v[N];int main(){ int st, n, k, a, b, c; scanf("%d%d%d", &st, &n, &k);

2022-04-03 19:56:20 830 1

原创 PAT (Advanced Level) Practice 1135 Is It A Red-Black Tree

题目因为题目给的就是BST,所以直接按照BST的性质进行建树。需要满足红黑树的三个性质:一个是根结点为黑色,一个父结点为红色则子结点为黑色,一个相邻结点的路径中的黑色结点个数相同(个人认为,一个是比较兄弟结点,没有兄弟的就是最大值并记录,与其他无兄弟结点的叶子比较就行了)。以前不懂怎么写dfs的返回值不是void,这是第一次写,锻炼了。#include <bits/stdc++.h>using namespace std;const int N=33;int pre[N];int k

2022-04-03 18:27:22 760

原创 PAT (Advanced Level) Practice 1163 Dijkstra Sequence

题目通过本道题复习一下dijkstra算法,这也算是本菜鸡第一次不靠死记硬背的模板过题目了,也复习一下fill()函数对于初始化二维数组的用法。因为点的数量不多,所以选择了邻接矩阵的写法。#include <bits/stdc++.h>using namespace std;const int MAXV=1010;const int INF=0x3fffffff;int nv, ne;int edge[MAXV][MAXV], ver[MAXV], vis[MAXV], dis[M

2022-04-02 15:27:09 222

原创 PAT (Advanced Level) Practice 1167 Cartesian Tree

题目堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子结点的值。这是一道简单题。但是,本菜鸡对于堆的定义不了解。所以,卡住了。而且,这应该是本菜鸡第一次用指针的写法,完成的一道题目。#include <bits/stdc++.h>using namespace std;const int N=33;const int INF=0x3f3f3f3f;int num[N], res[N];struct node{ int data; node* l

2022-03-27 17:54:31 1081

原创 PAT (Advanced Level) Practice 1166 Summit (25 分)

题目因为只是判断是否是直接相连,所以觉得直接用暴力模拟,而且数据范围也很小。果然,许久不练题,A题的效率都下降了。不过,练题真的是打发时间的好途径。#include <bits/stdc++.h>#include <unordered_set>using namespace std;const int N=220;unordered_set<int> peo[N];int n, m;int main(){ scanf("%d%d", &

2022-03-27 14:35:33 390

原创 PAT (Advanced Level) Practice 1160 Forever (20 分)

PAT (Advanced Level) Practice 1160 Forever说来惭愧,许久不练题,思考一个问题很久——给定位数和总位数之和,求这样的数字有多少个。忘记了可以用dfs解决。因为这个问题纠结了许久。时间久了连gcd的板子写得都不熟练了这道题目,如果n=m+1n=m+1n=m+1的话,是不可能满足题意的,所以AAA的最后一位数字必然是9。其他位就不确定,所以暴力枚举。#include <bits/stdc++.h>using namespace std;#define

2022-03-07 19:48:26 110

原创 PAT (Advanced Level) Practice 1157 Anniversary

PAT (Advanced Level) Practice 1157 Anniversary这道题也不难,但是讲一个我自己需要注意的点:对于求最值的问题,不是总要通过排序来解决,可以在遍历的时候不断地进行比较(首先赋予最大值,或是最小值)。还有对于这道题目,让我疑惑的是,校友年龄最大的,是放在所有的校友范围,还是在仅出席的校友范围里比较得出的。不知道,不明了,不想要…复习在STL标准容器中,只有vector、string、deque是可以使用sort的。像set、map这种容器是用红黑树实现的,元素

2022-03-05 18:17:23 175

原创 PAT (Advanced Level) Practice 1156 Sexy Primes

PAT (Advanced Level) Practice 1156 Sexy Primes题目不难,本质上还是判断素数,直接暴力即可,但是受到某君影响,想通过线性筛解决本题。我本来不会线性筛,因为不懂原理,所以从来不用。但是对于这道题目,真心觉得没有必要,因为线性筛的范围无论是108还是题目输入数字n,都不好。前者直接爆掉,后者对于(n+6)的判断不友好(要么是重新调用线性筛,要么直接判断是否是素数)。所以采用直接判断n,(n-6),(n+6)是否是素数的暴力做法即可。不过通过这一题,我也再次学习线性筛

2022-03-05 15:38:18 210

原创 Codeforces Round #744 (Div. 3)

题目这是一场欢乐场(div3)的题目。当时写这道题目,想得太复杂了。就是先将数组进行从小到大的排序,排序之后的位置为l,寻找在原序列中值相同的位置r(即使有重复的值,也没有关系,标记一下就行了),然后对原序列进行操作(这个也有规律的,自己举个栗子,就知道了),直到排序完成。就是一道单纯的模拟题。#include <bits/stdc++.h>using namespace std;const int N=55;#define T int T; scanf("%d", &T);

2021-11-18 14:17:12 411

原创 Codeforces Round #755 (Div. 2, based on Technocup 2022 Elimination Round 2)

题目.看了这道题目,发现自己的脑子太死了。似乎很久没有从遍历数组的值得角度出发去做题(当然这道题目的范围很小),也没有通过将输入的数字进行偏移,便于数组存储。已经习惯暴力地使用unordered_map或map。这道题目就是贪心的想法,将b[i]的值分为a[i-1](优先分为这个,使得尽可能多的数字参与变化)与a[i]。#include <bits/stdc++.h>using namespace std;#define T int T; scanf("%d", &T); wh

2021-11-15 10:32:07 345

原创 2021-11-14

题目看了题目,一直在想质因子分解,但是质因子分解的个数如何分配也是令人头秃。看了题解,原来如此啊~题目很简洁,就是这两个条件:A∗B∗C≤NA*B*C\leq NA∗B∗C≤N 和 A≤B≤CA\leq B \leq CA≤B≤C对于A来说:1≤A≤N31\leq A \leq \sqrt[3]{N}1≤A≤3N​;对于B来说:A≤B≤NA2A\leq B \leq \sqrt[2]{\frac{N}{A}}A≤B≤2AN​​;对于C来说:B≤C≤NABB\leq C \leq \frac{N}{

2021-11-14 19:37:00 171

原创 PAT (Advanced Level) Practice 1155 Heap Paths

题目从今天起,逆序开始重新刷一遍PTA甲级真题。重新写一遍这道题目,又探索出不一样,比以前简单一些的写法。当然简单体现在对于堆的判断。也就是对遍历得到的在一条链上的树的节点,进行排序,再与未排序的判断,进而确定堆是哪一种。其实就是利用大顶堆和小顶堆的性质。也不知道下一次能不能写出更简洁的算法。也希望这次重新刷甲级的过程,重新回顾以前学过的知识,掌握基础数据结构,甲级分数更高。#include <bits/stdc++.h>using namespace std;const int N=1

2021-11-13 16:25:20 1181

原创 2021-11-12

题目01背包的变式,以前看到动态规划,直接走人;今天重新看了01背包和完全背包等最基础的知识,觉得突然理解一些动态规划的思想。继续努力吧,虽然时间不多了。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e3+10;const int M=310;int n, H, S;int h[N], s[N];ll w[N], dp[M][M];int main(){

2021-11-12 21:00:30 51

原创 2021-11-11

题目这道题目上半年没有补,现在训练依旧不会。看了其他人的题解真的觉得精妙无比,想法就是判断这个正方块左右两边是否存在,就是这两边是否记录,上下两边必然存在(所以没有访问过的点,周长+2),虽然有数组去记录累计数,但是每层情况都是一样的。仅以纪念这些思考的岁月。#include <bits/stdc++.h>using namespace std;const int N=2e5+10;typedef long long ll;ll hor[N], ver[N];ll sumh=0,

2021-11-11 20:47:16 56

原创 2021-11-09

题目二分是没有想到的,两个人耗时最短也需要分情况讨论,也是不能确定的。而函数cal()就是判断某种情况下两个人的朝着哪个方向走的问题。#include <bits/stdc++.h>using namespace std;#define T int T; scanf("%d", &T); while(T--)inline double cal(double x, double p, double v){ return (min(p, x-p) + x) / v;}

2021-11-09 19:11:20 59

原创 2021-11-08

题目终究是题目没有读清,而且父目录和子目录之间的关系,联系树,一定要清楚什么是父亲,什么是祖先,什么是儿子。这道题目就是模拟题,太悲伤了。#include <bits/stdc++.h>using namespace std;#define T int T; scanf("%d", &T); while(T--)int n, m;vector<string> v;set<string> part, vis;int main(){ T{

2021-11-08 17:35:58 61

原创 2021-11-07

l题目训练的时候不认真,看到题解的时候才发现,题目理解错了,所以当做出来题目的时候还是要多读题。当时思考的时候,也想过取反操作。看了题解不懂,吃饭的时候想出了思路,当时还有点质疑,晚上补题的时候,补过去了。当然代码写得太傻了。01图,所有位置取反之后数字总和不变#include <bits/stdc++.h>using namespace std;const int N=1e3+10;char a[N][N], a1[N][N], b[N][N];int main(){

2021-11-07 15:47:39 56

原创 2021-11-03

题目比赛的时候一直写,按照找出来的规律,不是T就是WA。令人十分无语,而且觉得这场比赛对我们来说着实不太友好,后来就放弃了。看了别人的题解,发现可以以dfs和异或^的方式来模拟博弈的过程,而且数据量在1e5中。但是没有用我们埃氏筛+质因子分解个数的方法,着实存在许多的疑惑。还有一点,就是文件的读入和读出。也算是学到了这一点。#include <bits/stdc++.h>using namespace std;int n, m;bool flag=false;int res(int

2021-11-03 13:46:28 62

原创 2021-11-02

题目题解上说,容易发现不管经过了多少天,概率分布都不会改变,所以令sumsumsum为所有www的和,则ansi=wi+wi×ksumans_i=w_i+\frac{w_i\times k}{sum}ansi​=wi​+sumwi​×k​一直不明白为什么,然后手动推导一下:第一个萝卜,每个兔子最终体重为wi+wisumw_i+\frac{w_i}{sum}wi​+sumwi​​;第二个萝卜,每个兔子最终体重为wi+wisum+wi+wisumsum+1=wi(1+1sum)+wi(1+1sum

2021-11-02 22:15:27 52

原创 2021-11-02

题目设集合S={‘h’, ‘a’, ‘r’, ‘b’, ‘i’, ‘n’};大致思路是用vector[‘h’]存入出现‘h’的第i个字符串的i。然后用dfs进行选择哪一个字符串选择集合S中的哪一个字母。用set会T,所以只能使用这样傻的方式,想不出来更好的了。而且很久都没有写dfs了,导致训练的时候WA好了几发。继续努力!!!#include <bits/stdc++.h>using namespace std;#define T int T; scanf("%d", &T);

2021-11-02 17:20:29 45

原创 2021-10-27

题目水题,陷入了思维定势,高中三年,我为什么,为什么不好好读书啊!!!这两种是不同的。#include <bits/stdc++.h>using namespace std;#define T int T; scanf("%d", &T); while(T--)typedef long long ll;const int N=1e9;vector<int> v;void init(){ v.push_back(1); for(int i=2; i&

2021-10-27 22:22:40 64

原创 2021-10-26

题目这道题目训练的时候,因为A题受挫,所以到后来队员们都没信心写下去了,就提前下班了。补题的时候,读题读了很久,不知道为什么好像越训练自己的读题能力越来越差。题意解释:就是将两个1∗1∗11*1*11∗1∗1的正方体块拼接在一起看成一个block,总共有n中颜色,一个1∗1∗11*1*11∗1∗1的正方体涂上一种颜色,需要输出n(n+1)2\frac{n(n+1)}{2}2n(n+1)​中block的颜色情况及位置(在坐标系)的情况。当然需要满足情况:全部是connected(正方体A和正方体B有一个面

2021-10-26 20:20:28 46

原创 2021-10-25

题目.训练的时候队友开出来的,赛后补题的时候实在是不会这种规律题。怎么说呢,就是有种感觉,但是无法总结出来。自己的一种缺陷吧。在这里链接一个大佬的题解代码,写的已经很清楚了m+n−2=m−1+n−1m+n-2=m-1+n-1m+n−2=m−1+n−1详细题解#include <bits/stdc++.h>using namespace std;#define T int T; scanf("%d", &T); while(T--)typedef long long ll;

2021-10-25 22:01:11 49

原创 2021-10-25

题目是水题,但是训练的时候总是WA。主要是英语不好(果然出来混的,都要换)而且对于upper_bound()和lower_bound()的用法还是不熟悉。这道水题写了很久,悲伤,难过,无奈。日期的缩写表示法1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10th 11th 12th 13th 14th 15th 16th 17th 18th 19th 20th 21st 22nd 23rd 24th 25th 26th 27th 28th 29th 30th 31stup

2021-10-25 20:18:01 79

原创 2021-10-22

题目题目看了很久才看懂,然后自己又研究了很久,虽然找出一点规律,但是暴力写,必然无法过。悲伤,看别人的题解,才觉得精妙无比,需要从行和列分别考虑。题意:就是一个稻草人周围必须都稻草。稻草人占据一个矩形,问符合这样条件的矩形有多少个?计算过程如下:令x=n−2x=n-2x=n−2,y=m−2y=m-2y=m−2,对于一个n∗mn*mn∗m的矩形,最先寻找x∗yx*yx∗y中存在多少子个矩阵;然后再分别寻找(n−1)∗m(n-1)*m(n−1)∗m的矩形(x−1)∗y(x-1)*y(x−1)∗y的矩形中存

2021-10-22 21:21:50 57

原创 2021-10-21

题目这道题写了很久,最开始是没有思路,之后看到别人的解题思路之后,自己开始敲代码。暴露出两个问题,一个是对于埃氏筛的理解不够到位。首先,将2到n范围内的所有整数写下来。其中最小的数字是2是素数。将表中所有2的倍数都划去。表中剩余的最小数字是3,它不能被更小的数整除,所以就是素数。再将表中所有3的倍数都划去。以此类推,如果表中剩余的最小数字是m时,m就是素数。然后将表中所有m的倍数都划去。像这样反复操作,就能依次枚举n以内的素数。也就是埃氏筛的过程中,不需要判断某个数字是否为素数。第二个就是数组的空

2021-10-21 19:26:00 52

原创 2021-10-18

提交地址题目:比赛的时候,状态比较浮躁,题目也没有认真读,也没有A出这道水题。之所以想记录,还是因为通过一点点的规律,计算出每年的第几个月的第几个周几这样的方法。#include <bits/stdc++.h>using namespace std;#define T int T; scanf("%d", &T); getchar(); while(T--)typedef long long ll;int f[100], s[100];bool judge(int

2021-10-18 18:46:26 100

原创 2021-10-16

题目比赛的时候,不会做,因为知道涉及到dp。虽然是简单的dp,但是本菜鸡只要一想到dp,就连最简单的都不会做。可见,要多练dp题,掌握基础。这道题目考察dp+排列组合+快速幂。现在看来,按照题意的要求,真的不难。一个排列组合的结论:Cn1+Cn2+...+Cnn=2n−1C_{n}^{1}+C_{n}^{2}+...+C_{n}^{n}=2^{n}-1Cn1​+Cn2​+...+Cnn​=2n−1#include <bits/stdc++.h>using namespace std;

2021-10-16 14:31:51 48

原创 2021-09-25

题目题目不难,但是就是不会写,这道题目是最简单的01背包的变式。题目含义是求最少数量∑ia≥x\sum_{i}a\geq x∑i​a≥x和∑ib≥y\sum_{i}b\geq y∑i​b≥y。这道题目敲不好,还是最基本的dp没有掌握,还要加油!!!#include <bits/stdc++.h>using namespace std;const int N=305;int dp[N][N], a[N], b[N];//dp[N][N]第一维描述x的情况,第二维描述y的情况,其值表

2021-09-25 09:56:23 40

原创 PTA 1146

题目这道题目考察拓扑排序的原理,最近准备甲级考试,忽然发现缺了拓扑排序这一块内容,昨天晚上补了一下,做这道题目的时候还是想着板子,今天大致看了一下别人的思路,自己敲出来了。其实就是对于每次询问,判断每个点的入度是否为0,如果为0,将该点指向的下一结点的入度减1。边遍历边进行这样的操作,判断n个点是否全部点的入度为0。希望明天甲级考试顺利愉快!!!#include <bits/stdc++.h>using namespace std;const int N=1100;vector<

2021-09-10 09:32:15 54

原创 2021-09-08

题目首先,判断是否形成一棵树。因为一共只有n-1条边,如果没有形成树,那一定形成了一个非连通图,并查集所得到的集合个数必然超过1,所以可以用并查集进行判断。其次,思维过程就是求树的直径,两次dfs(说实话,本菜鸡还是不懂求树的直径的原理,似懂非懂的样子,考完甲级后,认真研究一下)。#include <bits/stdc++.h>using namespace std;const int N=1e5+10;int n, father[N];vector<int> G[N]

2021-09-08 14:48:28 45

原创 PTA 1013

因为需要考PAT甲级,所以最近一直在重新刷以前不知道怎么就刷过(主要是当时实在是什么都不懂,学习了什么知识,都是一知半解的)的题目,觉得收获很大。看了《算法笔记》,这道题目,转化过来,其实就是求图中连通块的个数问题。这里两种做法,一种是dfs执行的次数,一种是并查集中集合个数。也明白了连通块的含义(离散数学没学好,就是一直刷题,理论上不知道叫这个名字)dfs版:#include <bits/stdc++.h>using namespace std;const int N=1e3+10

2021-09-08 12:58:57 64

原创 PAT 1103

昨天晚上一直写,但是写不出来,今天再重新看了《算法笔记》上的代码,突然有了新的感受。首先根据已知的n和p,得到因子可能出现的范围(包括0),因为vector的因子是升序的,根据题目的要求,从最大值开始进行选择,但是注意一个数字可以出现多次,也可以一次都不出现。这决定了dfs如何转移状态.递归的终止条件很好判断。这也是很暴力的深搜。#include <bits/stdc++.h>using namespace std;vector<int> num, temp, ans;int

2021-09-08 09:35:52 50

原创 PAT 1143

BST(二叉搜索树)与其先序遍历(preorder traversal sequence ),即先序遍历中每个点都可以看做是所在子树的根结点。而本题需要求出两个点的lca问题。根据BST的性质与先序遍历,可直接进行暴力,得到结果。顺便在这里回顾一下以前的知识,BST的中序遍历就是BST中各结点从小到大排列好的结果。#include <bits/stdc++.h>using namespace std;const int N=1e5+10;int pre[N];map<int,

2021-09-07 10:48:28 121

原创 PAT 1149

题目题目不难,但是应该是看到的这个思路,感觉挺不错的,记录一下这个思路,有一种入栈出栈的感觉(个人感觉)#include <bits/stdc++.h>using namespace std;const int N=1e5+10;vector<int> v[N];int main(){ int n, m, a, b; scanf("%d%d", &n, &m); for(int i=0; i<n; i++){

2021-09-06 19:42:31 51

原创 2021-09-06

题目好久没练题了,一直忙许多乱七八糟的事情。最近要考甲级,所以重新刷甲级真题。这道题目不难,就是简单的查找与排序(说来说去,还是字符串的处理)。但是有个以前不知道,现在知道的点,关于C++中的endl与"\n"之间的区别。在没有必要刷新输出流的时候应尽量使用cout<<"\n",过多的endl是影响程序执行效率底下的原因。endl除了写’\n’进外,还调用flush函数,刷新缓冲区,把缓冲区里的数据写入文件或屏幕,考虑效率就用’\n’因为大量使用endl,导致后面两个测试点一直运行超

2021-09-06 15:19:08 62

原创 2021-08-20

题目.先提前声明,本篇博客的代码过题会T,但是思路没问题,就是暴力打表。说实话,对于这样的博弈题,打表实在是从未想过的做法。其实,从最初的状态的进行按照题意的操作,现在的状态建立以前已知的转态,就可以判断出现在的状态下,两人的输赢情况。#include <bits/stdc++.h>using namespace std;const int N=5e3+10;#define T int T; scanf("%d", &T); while(T--)int a[N][N];

2021-08-20 21:26:58 46

原创 2021-08-20

题目利用本题回顾有关最短路径的相关知识。本菜鸡觉得自己不是不能理解最短路径的想法,但是码力太弱了,所以对于这样的知识点很容易忘记。继续努力!!!#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll INF=0x3f3f3f3f3f3f3f3f;const int N=2e5+10;const int M=4e5+10;int d[8][N];int head[N], nex[M], v

2021-08-20 20:01:38 45

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除