<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[lots_的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/lots_</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; lots_]]></copyright><item><title><![CDATA[（AcWing 4440. 照相，408操作系统-进程的通信，fast r-cnn和faster r-cnn的初步理解）]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/131709822</link><guid>https://blog.youkuaiyun.com/lots_/article/details/131709822</guid><author>lots_</author><pubDate>Thu, 13 Jul 2023 22:06:11 +0800</pubDate><description><![CDATA[管道通信发送进程向管道中写入信息，接收进程读取信息，读信息一般比写入信息更快，当管道为空时，读进程会进入阻塞态，直到管道中有数据，唤醒读进程。可以知道的是，分别有G、H字符，因为是偶数前缀反转，并且我们的目的是将奇数位的G反转到偶数位上，于是我们可以将N个字符看作是N/2个字符串，可能出现的字符序列GH、HG、HH、GG。这里解释一下反转的意思，就像是题目举出的14字符的例子，我原以为是将前六个字符的G、H反转，即G变为H，H变为G，后来发现是将前六个字符串倒过来，也就是顺序反转。使用发送原语和接收原语。]]></description><category></category></item><item><title><![CDATA[学习记录21]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122938762</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122938762</guid><author>lots_</author><pubDate>Tue, 22 Feb 2022 16:42:54 +0800</pubDate><description><![CDATA[上午



根据题意可以看出，此题用floyd就可以了。Floyd是用来求每个点之间的最短路径，尽管时间复杂度有些高，但在这一题中是完全可以满足的了。

代码如下：



#include &lt;bits/stdc++.h&gt;
using namespace std;
int n,m,v,s;
const long long int inf=1e9+5;
int low[110][110];
void floyd()
{
   for(int i=1;i&lt;=n;i++)
    for(int.]]></description><category></category></item><item><title><![CDATA[学习记录20]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122932353</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122932353</guid><author>lots_</author><pubDate>Tue, 15 Feb 2022 10:45:40 +0800</pubDate><description><![CDATA[写题，到目前为之最短路的题只写了一个，急，很急。



对于最短路还是没太多的认识和理解，写这题有点麻，最后用dp写的。

题目中的最少租金这四个字就已经勾起了“背包”这两个字，我最开始一想，dp无疑了。就是最开始对于那个所谓的“半矩阵”搞不太清楚，都不太理解这几个数代表着什么……

我们将dp[i]设定的意义为游艇出租站i到游艇出租站n的最少租金。dp定义好就开始根据初始值一步步推出答案。实现的代码如下：


#include &lt;cstdio&gt;
#include &lt;iostream&gt]]></description><category></category></item><item><title><![CDATA[学习记录19]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122906050</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122906050</guid><author>lots_</author><pubDate>Sun, 13 Feb 2022 19:24:37 +0800</pubDate><description><![CDATA[上午

写最后一道题：



现在大概能懂一些了。

我们使用kmp匹配做出这一题。

实现代码如下：


#include &lt;cstdio&gt;
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;cstring&gt;
using namespace std;
#define ull unsigned long long int
int ani,kmp[1000010];
char a[1000010],an[100]]></description><category></category></item><item><title><![CDATA[学习记录18]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122905334</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122905334</guid><author>lots_</author><pubDate>Sun, 13 Feb 2022 10:34:11 +0800</pubDate><description><![CDATA[上午

题目如下：

kmp的模板题，因为next数组的值没有设定好，导致求最长border的时候出现问题。后来修改了next的值的初始设定，然后所谓的border就是直接输出next数组里的值就好了。

就像之前说过的，kmp利用字符串的对称性来节省时间复杂度，next数组中的值其实就是当两字符串进行字符匹配的时候，如果失配了，该从哪个下标位置重新开始匹配。而我们的next值是根据i字符前所构成的字符串中前后缀相同的个数，比如：abab，此时next[4]=2(下标从0开始)。使用kmp的话，当abab后]]></description><category></category></item><item><title><![CDATA[学习记录17]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122849827</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122849827</guid><author>lots_</author><pubDate>Wed, 09 Feb 2022 22:49:54 +0800</pubDate><description><![CDATA[惭愧，折腾了一天的KMP，写了个模板题，这题写详细些好了。

题目如下：



首先我们要知道KMP是怎么用的，是干些什么的。KMP主要适用于字符串的匹配，就是上面的这题，当我们需要在两个字符串之间进行判断是否另一方在主串中出现时，一旦字符的长度大了起来，使用朴素算法的话就会显得时间复杂度过大，于是在前人的研究下，我们得到了如今的KMP。

因为KMP是利用字符串的对称性来节省时间复杂度的，我们将子串以相同的前后缀个数来编出另一个整型数组，此前后缀个数也是字符串中非重复字符的下标位置。借由这个数组我们可以节]]></description><category></category></item><item><title><![CDATA[学习记录16]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122831678</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122831678</guid><author>lots_</author><pubDate>Tue, 08 Feb 2022 21:56:34 +0800</pubDate><description><![CDATA[上午

开始写hash的题目，最开始是这个：



最开始写出来会出现时间超限的情况，因为我没有用hash的方法，只是直接写出解决方法。这是看了下题解的做法。双指针法，用两个变量表示两个下标位置。关键的是我们要知道，如果我们把数组从小到大排序起来，当到达一个减去数组中的最前方（后面会改变位置）数后&lt;c的元素再之后的元素，再从头一个个找，找到一个减去N[i]&gt;c的第一个元素，此两个数之间的元素一定是符合题目要求的。大概有点拗口了，理解就好了。


#include &lt;iostream&gt;]]></description><category></category></item><item><title><![CDATA[学习记录15]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122656956</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122656956</guid><author>lots_</author><pubDate>Sun, 23 Jan 2022 21:06:51 +0800</pubDate><description><![CDATA[上午

写5个题解，分别是“P1177 【模板】快速排序”、“P1111 修复公路”、“P2078 朋友”、“P1455 搭配购买”和’P1551 亲戚”。哦对了，这是一天的量。不想分散了，就写上午了。

还看了《大话数据结构》里关于“图”的内容，没看完，不过也算了解了一些。

下午

复习了一下“二叉树”的知识内容，之前没有看树就直接看来二叉树了，这次把树看了一遍，还行，不难理解。

然后就开始了2小时的周测……心碎时间开启……

晚上

开始了一周一次的答辩环节，我们讲了讲一周写的题和学了的知识点，师傅]]></description><category></category></item><item><title><![CDATA[P1177 【模板】快速排序]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122648728</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122648728</guid><author>lots_</author><pubDate>Sun, 23 Jan 2022 20:41:49 +0800</pubDate><description><![CDATA[首先，我们需要知道快速排序的理论知识。快速排序，又名快排，嗯，具体实现是从以数组中第一个数据为基点，然后首先以数组的右边开始（至于为什么是从右边开始，后面会提）寻找比此基点小的（看你的需求，如果是要从小到大的话，就是从右边找比基点小的）数，然后退出来，再从数组最左边开始找，找比基点大的，我们这样一直递归下去，因为我们想要达到的是数组左边的数据都是比基点小右边都是比基点大的，最后把基点放入左右边的中点。随着递归的一点点深入，分割的数目也越来越少，这就达成了一个排序的效果。

为什么要从右边开始寻找呢，...]]></description><category></category></item><item><title><![CDATA[P1111 修复公路]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122648028</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122648028</guid><author>lots_</author><pubDate>Sun, 23 Jan 2022 10:59:00 +0800</pubDate><description><![CDATA[这一题主要的问题是，如何判断一个时间是可以让所有的村庄都互通的。我们可以知道的是，这样的时间一定是修复某个桥的时间，最多也就是花费时间最长的那个，因为我们是可以同时修补所有的桥的。我们可以使用结构体数组记录这三个数据，然后按照时间从小到大给他们排序，那么第一个满足所有村庄互通的时间就是所谓”最早时间”。

那么怎么判断那个时间是可以让所有村庄互通的呢？我们设一个循环，每次循环在结构体数组中取出此道路修补需要的时间，然后再设一个循环，此循环中，我们开始建树，并且以上一个循环中取出的时间为时间限制，修补不...]]></description><category></category></item><item><title><![CDATA[P2078 朋友]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122647925</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122647925</guid><author>lots_</author><pubDate>Sun, 23 Jan 2022 10:22:59 +0800</pubDate><description><![CDATA[我们计算出与小明是朋友的人的个数，再计算小红的，可以知道的是如果人数不一致，那么数目小的那个就是可组成一对的个数。依旧是并查集，因为有小明和小红两人，所以我们可以设立两个并查集数组。其他的就是普通的并查集建立了。

代码如下：


#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
int pre[30000],pre1[30000];
int fini(int t,int x)//并查集合并,因为我要建立两个并查集，所以我用t来把它们区分开
{
  ...]]></description><category></category></item><item><title><![CDATA[P1455 搭配购买]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122647733</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122647733</guid><author>lots_</author><pubDate>Sun, 23 Jan 2022 10:13:52 +0800</pubDate><description><![CDATA[依旧是并查集为主，这一题我们还需要注意的是“尽量多价值的云”和“一些云朵是搭配买的”，一看到“尽量多价值的云”我们就应该能想到01背包问题，毕竟一般求局限内的最高什么什么值都是关于背包问题的。对于“一些云朵是搭配买的”，我们可以在把他们的总共所需钱放在他们的“根节点”中，然后需要注意的是，在把价钱加入根节点里后，自己节点里的值需要清零，不然的话，背包问题就不容易实现了。

代码如下：



#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
int ...]]></description><category></category></item><item><title><![CDATA[P1551 亲戚]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122647644</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122647644</guid><author>lots_</author><pubDate>Sun, 23 Jan 2022 09:54:40 +0800</pubDate><description><![CDATA[典型的并查集吧，将属于亲戚的放入一个“集合”中，也就是把他们全都放进同一个树里，最后要是想判断他们是否是亲戚的话，就去找他们的根节点，如果根节点相同，也就是处于同一棵树中，那么他们就是亲戚关系。注释中有详细解释。

代码实现如下：



#include &lt;iostream&gt;
#include &lt;cstring&gt;
using namespace std;
int pre[10000];
int findi(int x)//这个函数的作用是找出x的根节点
{
    if(pr...]]></description><category></category></item><item><title><![CDATA[学习记录14]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122647546</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122647546</guid><author>lots_</author><pubDate>Sun, 23 Jan 2022 09:45:28 +0800</pubDate><description><![CDATA[上午

写出一个题：

题目描述

给出每个节点的两个儿子节点，建立一棵二叉树（根节点为 11），如果是叶子节点，则输入0 0。建好树后希望知道这棵二叉树的深度。二叉树的深度是指从根节点到叶子结点时，最多经过了几层。

最多有 10^6106 个结点。

输入格式

无

输出格式

无

输入输出样例

输入 #1


7
2 7
3 6
4 5
0 0
0 0
0 0
0 0

输出 #1


4

通过的代码是：


#include &lt;stdio.h&gt;

#include &lt;std]]></description><category></category></item><item><title><![CDATA[P3367 【模板】并查集]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122623692</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122623692</guid><author>lots_</author><pubDate>Fri, 21 Jan 2022 16:26:13 +0800</pubDate><description><![CDATA[题目描述

如题，现在有一个并查集，你需要完成合并和查询操作。

输入格式

第一行包含两个整数N,M ,表示共有 N 个元素和 M 个操作。

接下来 M 行，每行包含三个整数 Zi​,Xi​,Yi​ 。

当 Zi​=1 时，将 Xi​ 与 Yi​ 所在的集合合并。

当 Zi​=2 时，输出 Xi​ 与 Yi​ 是否在同一集合内，是的输出 Y ；否则输出 N 。

输出格式

对于每一个 Zi​=2 的操作，都有一行输出，每行包含一个大写字母，为 Y 或者 N 。

输入输出样例

输入 #1复制

]]></description><category></category></item><item><title><![CDATA[P1229 遍历问题]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122622605</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122622605</guid><author>lots_</author><pubDate>Fri, 21 Jan 2022 16:04:02 +0800</pubDate><description><![CDATA[题目描述

我们都很熟悉二叉树的前序、中序、后序遍历，在数据结构中常提出这样的问题：已知一棵二叉树的前序和中序遍历，求它的后序遍历，相应的，已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序遍历，你却不能确定其中序遍历序列，考虑如下图中的几棵二叉树：



所有这些二叉树都有着相同的前序遍历和后序遍历，但中序遍历却不相同。

输入格式

输A数据共两行，第一行表示该二叉树的前序遍历结果s1，第二行表示该二叉树的后序遍历结果s2。

输出可能的中序遍历序列的总数，结果]]></description><category></category></item><item><title><![CDATA[P4913 【深基16.例3】二叉树深度]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122621785</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122621785</guid><author>lots_</author><pubDate>Fri, 21 Jan 2022 15:29:23 +0800</pubDate><description><![CDATA[题目描述

给出每个节点的两个儿子节点，建立一棵二叉树（根节点为 1），如果是叶子节点，则输入0 0。建好树后希望知道这棵二叉树的深度。二叉树的深度是指从根节点到叶子结点时，最多经过了几层。

最多有 10^6 个结点。

输入格式

无

输出格式

无

输入输出样例

输入 #1


7
2 7
3 6
4 5
0 0
0 0
0 0
0 0

输出 #1


4

建树也有一个技巧，我们可以使用结构体数组分别存储左右节点，因为这样刚好符合题意，第一个节点收第一行的左右子树，即下标为1的结构体数组，以]]></description><category></category></item><item><title><![CDATA[P1030 [NOIP2001 普及组] 求先序排列]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122616369</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122616369</guid><author>lots_</author><pubDate>Fri, 21 Jan 2022 11:03:11 +0800</pubDate><description><![CDATA[题目描述

给出一棵二叉树的中序与后序排列。求出它的先序排列。（约定树结点用不同的大写字母表示，长度≤8）。

输入格式

2行，均为大写字母组成的字符串，表示一棵二叉树的中序与后序排列。

输出格式

1行，表示一棵二叉树的先序。

输入输出样例

输入 #1


BADC
BDCA


输出 #1


ABCD

首先我们可以知道的是，后序遍历序列的最后一位一定是根节点，即先序遍历序列的第一位，然后我们可以知道的一个抽象特性是“后序遍历序列的最后一位一定是此先序遍历序列的第一位”，以此为根据，我们以中序]]></description><category></category></item><item><title><![CDATA[P1305 新二叉树]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122615106</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122615106</guid><author>lots_</author><pubDate>Fri, 21 Jan 2022 10:38:40 +0800</pubDate><description><![CDATA[题目描述

输入一串二叉树，输出其前序遍历。

输入格式

第一行为二叉树的节点数 n。(1≤n≤26)

后面 n行，每一个字母为节点，后两个字母分别为其左右儿子。

空节点用 * 表示

输入输出样例

输入


6
abc
bdi
cj*
d**
i**
j**

输出 #1


abdicj


二叉树的前序遍历。

我主要说一说我的做法，肯定有别的更好的办法，我这里只陈述我的思路。

首先我们需要了解到二叉树的建树方法。


Bitree *creat()
{
    Bitree *t;
  .]]></description><category></category></item><item><title><![CDATA[学习记录13]]></title><link>https://blog.youkuaiyun.com/lots_/article/details/122608546</link><guid>https://blog.youkuaiyun.com/lots_/article/details/122608546</guid><author>lots_</author><pubDate>Thu, 20 Jan 2022 21:43:10 +0800</pubDate><description><![CDATA[上午

写”修复公路“，还是并查集，根据题目有变化。



通过的代码：


#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
using namespace std;
int pre[100010];
int fini(int x)
{
    if(pre[x]==x)
        return x;
    return pre[x]=fi.]]></description><category></category></item></channel></rss>