<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[CUCUC1的博客]]></title><description><![CDATA[弱鸡一个]]></description><link>https://blog.youkuaiyun.com/CUCUC1</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; CUCUC1]]></copyright><item><title><![CDATA[博客迁移公告]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/121576057</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/121576057</guid><author>CUCUC1</author><pubDate>Sat, 27 Nov 2021 13:36:52 +0800</pubDate><description><![CDATA[  最近新搭了自己的个人博客, 所以本博客将暂停更新, 近期会把一些写的自我感觉良好的文章加工修改一下搬迁到新的博客, 以及一些近期写的关于项目和源码的分析文章.
博客传送门: cu1universe.icu 欢迎来玩!
也可以把一些有意思的算法或者源码发到该文章评论区, 会定期看下, 如果有时间和精力就会学习并发布到个人博客里

...]]></description><category></category></item><item><title><![CDATA[Codeforces Global Round 14]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/116374824</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/116374824</guid><author>CUCUC1</author><pubDate>Mon, 03 May 2021 11:06:17 +0800</pubDate><description><![CDATA[Codeforces Global Round 14
A.Phoenix and Gold
题意:
 给定n个数, 问按照什么顺序从左到右将这n个数加起来, 期间不会出现和为x的状态
思路:
 首先求一遍数组的和, 如果等于x那么加和过程中一定会出现x这个状态,否则就将原数组从小到大排序, 然后从左到右依次加和,若中间和第一次出现了x, 那么就将当前的数先减去, 加上数组的最后一个,之后再将剩下的依次加起来即可, 如果加和过程中没有出现和为x的情况, 那么就皆大欢喜直接按照这个顺序输出即可
代码
#incl]]></description><category></category></item><item><title><![CDATA[Codeforces1516 C. Baby Ehab Partitions Again（思维，dp, 数学）]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/116337236</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/116337236</guid><author>CUCUC1</author><pubDate>Sun, 02 May 2021 01:53:24 +0800</pubDate><description><![CDATA[题目链接
题意:
给定一个序列, 若这个序列任意划分出的两个集合的和都不相等,那么称这个序列为好序列, 否则就判断是否可以通过删除某个值来将其转换为好序列
思路:
对整个序列求和得到sum, 若sum为奇数, 那么无论如何划分, 最后都会划分为一个奇数一个偶数的和, 所以此时该序列一定为好序列
若sum为偶数, 就需要判断是否存在一个子序列可以组成 sum2\frac{sum}{2}2sum​ 这里需要利用01背包进行处理判断是否可以构成 sum2\frac{sum}{2}2sum​
一、若不能构成sum2]]></description><category></category></item><item><title><![CDATA[[数据结构]——单调栈]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/114386984</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/114386984</guid><author>CUCUC1</author><pubDate>Fri, 05 Mar 2021 13:13:53 +0800</pubDate><description><![CDATA[单调栈
笔者在做leetcode的题(下一个出现的最大数字)时，接触到了单调栈这一种数据结构，经过研究之后，发现单调栈在解决某些问题时出奇的好用，下面是对单调栈的性质和一些典型题目。
什么是单调栈?
从名字上就听的出来，单调栈中存放的数据应该是有序的，所以单调栈也分为单调递增栈和单调递减栈

单调递增栈：单调递增栈就是从栈底到栈顶数据是从大到小
单调递减栈：单调递减栈就是从栈底到栈顶数据是从小到大

模拟单调栈的数据push和pop

模拟实现一个递增单调栈：

现在有一组数10，3，7，4，12。从左到右]]></description><category></category></item><item><title><![CDATA[皮克定理]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/114239323</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/114239323</guid><author>CUCUC1</author><pubDate>Sun, 28 Feb 2021 20:34:04 +0800</pubDate><description><![CDATA[算法：皮克定理 + 最大公约数
时间复杂度：O(1)
皮克定理_百度百科
具体为 S=a+b / 2−1，其中 a 为三角形内部点的数量，b 为三角形边上点的数量，S 为三角形的面积。
面积 S =  (p * m) / 2 ，那么问题的关键就在于如何去求解b
对于每一条边，其斜率为 x / y将其上下都化简为不可约分的形式即
x1 / y1 对于该条边上的点 (a ,b) 可以得出 a / b = m * (x1 / y1) m为整数且 m &lt;= gcd(x,y) 这样就可以通过求出两点之间的gcd]]></description><category></category></item><item><title><![CDATA[线段树 +扫描线]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/113835242</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/113835242</guid><author>CUCUC1</author><pubDate>Wed, 17 Feb 2021 21:09:50 +0800</pubDate><description><![CDATA[ 关于线段树辅助扫描线的基本思想，已经有很多大佬去详细的解释了，可以去看一下传送门
这里主要说一下线段树辅助扫描线的一些问题以及两种变形

关于数据的离散化，离散化很多时候是为了减小空间消耗，但是我认为在线段树辅助扫描线时，基本都是需要进行离散化的，因为在以x(y)为坐标轴时，维护的是[1, m] (m不确定)，但是显然坐标轴上的区间点坐标不一定是从1开始的，所以要离散出一个区间其范围是 [1, m]
在一般线段树进行区间划分的时候，通常采用下面的方式

mid = l + r &gt;&gt; 1;
(操]]></description><category></category></item><item><title><![CDATA[最长公共上升子序列(LCIS)]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/113706736</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/113706736</guid><author>CUCUC1</author><pubDate>Sat, 06 Feb 2021 03:48:45 +0800</pubDate><description><![CDATA[前置知识


LCS



LIS


注意：
  刚开始看这个问题的时候，第一反应是先求出LCS再求出LCS的LIS，事实上这是有问题的，我们并不能保证这么求出的LCIS是最长的,比如下面这个例子

Example
a:7 1 5 6 4 2 7
b:7 1 5 4 6 7 2
按照递归的取“最长公共子序列”,取出：
7 1 5 6 2
此序列的“最长上升子序列”为：
1 5 6 (len=3)
但原序列的“最长公共上升子序列”为：
1 5 6 7 (len=4)

求解
 设第一个串为a，第二个串为b
]]></description><category></category></item><item><title><![CDATA[第k短路(A*)]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/113185677</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/113185677</guid><author>CUCUC1</author><pubDate>Tue, 26 Jan 2021 18:11:06 +0800</pubDate><description><![CDATA[题目链接Remmarguts’ Date
如果不了解A*算法可以先去看一下
 由A*算法可以直到,当目标点第一出优先队列时，一定是最优解，所以当目标点T第k次出队时，就是第k短路，这是可以用反证法证明的:

 假设这是第m次出队(m &gt; 1) ，那么这一次出队是当前所有解中最优(A*性质)，所以假设此次路径短于第m - 1次出队长度，显然上一次出队的值应该就是此次出队的值，与假设不符，故该路为第m短路

h(x)就可以采用终点到各个点的最短路作为启发式函数,因为可以保证在找第k短路的过程中某点到终点的]]></description><category></category></item><item><title><![CDATA[BFS 进阶之 A*， 双向bfs]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/112714835</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/112714835</guid><author>CUCUC1</author><pubDate>Fri, 22 Jan 2021 04:21:01 +0800</pubDate><description><![CDATA[双向BFS
 在由起点状态到目标状态进行搜索时,搜索树是以指数层级递增的,所以说在一些情况下,时间复杂度会导致单向的bfs TLE掉或者 MLE掉,这时候就需要对bfs进行一些优化,双向bfs就是一种,双向bfs适用于得知起点和目标点状态时适用,使用两个队列分别从起点和目标点进行双向搜索,当两个方向的状态第一次相遇,即为最短转移路径,这样可以限制搜索树的深度一般在原搜索树的一半左右,极大的降低了所需的复杂度
可以参考一下这个图 引用自

当两种颜色相遇的时候，说明两个方向的搜索树遇到一起，这个时候就搜到了答]]></description><category></category></item><item><title><![CDATA[次短路径]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/111310818</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/111310818</guid><author>CUCUC1</author><pubDate>Thu, 17 Dec 2020 12:04:11 +0800</pubDate><description><![CDATA[文章目录次短路径求次短路的方式1、起点终点各跑一遍最短路，然后枚举中间点2、边更新最短路边记录次短路
次短路径
求次短路的方式
 顾名思义,就是除最短路最外的最短路径，求次短路的方法一般有两种，第一种是从起点跑一遍最短路，终点跑一遍最短路，然后枚举中间点，第二种则是在求最短路时顺便去维护次短路，下面将分别进行详细说明
下面代码都是以poj3255作为例题传送门
1、起点终点各跑一遍最短路，然后枚举中间点
 先说一个结论，节点x到节点y的次短路可以看作
min( mindis(x,k1) + length(k]]></description><category></category></item><item><title><![CDATA[关于树状数组的区间修改以及单点查询和区间查询]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/111244467</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/111244467</guid><author>CUCUC1</author><pubDate>Wed, 16 Dec 2020 02:27:13 +0800</pubDate><description><![CDATA[题目链接
下面的题解转于传送门
对于想要学习区间修改和单点输出的同学们可以去看这篇文章
  传送门
假设数组a是原数组，b是a的差分数组，由前缀和的定义，我们求前n个元素的和，即

详细过程如下：
a1 + a2 + … + an = b1 + (b1 +  b2) + …+ (b1 + b2 + b3 + … bn) -&gt;n * b1 + (n - 1) * b2 + … + bn
所以我们要先对原数组a进行差分，得到差分数组b，才对b[i]和b[i]*i分别维护一个树状数组tb和tc，
而l到r的]]></description><category></category></item><item><title><![CDATA[状压dp(自用)]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/110938649</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/110938649</guid><author>CUCUC1</author><pubDate>Wed, 09 Dec 2020 21:54:41 +0800</pubDate><description><![CDATA[状压dp:
前言：
 前几周遇到了状压dp的题,不会,所以学习了一下状压dp,本想着上一周写一篇博客,但是由于太忙    懒 ,这周补一下…
1、位运算
这部分摘取自 传送门




名称
符号
运算法则
举例




按位与
a&amp;b
两者同时为1则为1，否则为0
00101&amp;11100=00100


按位或
a l b
有1为1，无1为0
00101 l 11100=11101


按位异或
a^b
相同为0，不同为1
00101^11100=11001


按位取反
~a
是1为0，是]]></description><category></category></item><item><title><![CDATA[Rational Ratio]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/110340949</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/110340949</guid><author>CUCUC1</author><pubDate>Sun, 29 Nov 2020 17:57:53 +0800</pubDate><description><![CDATA[题目连接
题意:
  给一个无限循环小数,并给出它的循环节长度,让你把这个小数转化为分数
思路:
 这里先说一个结论,有了这个结论,就很好处理了,例如: 0.123123123… = 123 / 999 ,这样我们就可以把小数部分转化为分数,如果有整数部分,就先转小数,然后再进行合并,由于要求分数是最简,所以要进行化简
 这样就把问题完全解决了吗？并没有,如果第一个循环节前面有一部分小数呢?例如: 123.4565656…这样的话,我们可以把4提到整数部分,最后再除个十就可以了 也就是转化为 ----&gt]]></description><category></category></item><item><title><![CDATA[容斥原理]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/110311455</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/110311455</guid><author>CUCUC1</author><pubDate>Sun, 29 Nov 2020 14:08:46 +0800</pubDate><description><![CDATA[传送门

]]></description><category></category></item><item><title><![CDATA[找零]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/109901675</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/109901675</guid><author>CUCUC1</author><pubDate>Sat, 21 Nov 2020 16:50:50 +0800</pubDate><description><![CDATA[题目链接
思路：
 这个题就是求能恰好构成 &gt;= 给出钱数的最小值和最小硬币数量，且能支付的钱最少为第一优先级。
 就是一个恰好装满的01背包问题
dp[j] 表示 恰好能组成 j元钱所花费的最小硬币数
求出dp数组后，我们从给出的价值V开始遍历，找到第一个 恰好能由硬币组成的且大于V的值，并将组成它的最小硬币数输出即可
#include &lt;bits/stdc++.h&gt;
#define ss system("pause");

using namespace std;

const int]]></description><category></category></item><item><title><![CDATA[捡苹果 (贪心 + 完全背包)]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/109899950</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/109899950</guid><author>CUCUC1</author><pubDate>Sat, 21 Nov 2020 16:39:03 +0800</pubDate><description><![CDATA[题目链接
思路：
 由于这个题目背包容量太大了，先不说会超时的问题，连dp数组都开不出来，所以我们要想办法减少背包容量，由此我们可以想到贪心。
 我们先按照密度最大到小对三个苹果进行排序，然后分出两个空间，一个较小的空间和一个较大的空间，较大的空间我们直接用密度最大的填满(也可能会剩一部分空间，就把剩下的自动分配给较小的空间)，然后对较小的部分进行完全背包，这样就解决了背包容量过大的问题
 但是要注意，利用贪心的时候，留出的这部分较小空间，不能太小
举个例子：
3个苹果；
4 7
3 5
6 2

容量 6]]></description><category></category></item><item><title><![CDATA[Chemist’s vows]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/109899062</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/109899062</guid><author>CUCUC1</author><pubDate>Sat, 21 Nov 2020 15:41:13 +0800</pubDate><description><![CDATA[Chemist’s vows 
题意:
 输入一个字符串，如果这个字符串可以由元素周期表的元素组成，就输出YES,反之则输出NO
思路：
 其实这个题可以用dp做，确实刚开始做的时候没想到，之前倒是做过一个类似的，这类问题，我就先叫它状态dp吧 大名叫啥还真不知道
dp状态
dp[n] 表示前n个字符能否全部由元素周期表构成，如果可以就是true，反之为false
那么我们就可以通过O(n)枚举的方法来得到状态转移方程
dp[j] = (dp[j - 1] &amp; (字符j是否为元素符号)) | (dp]]></description><category></category></item><item><title><![CDATA[01背包变式 要求恰好装满的01背包]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/109775409</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/109775409</guid><author>CUCUC1</author><pubDate>Wed, 18 Nov 2020 17:54:30 +0800</pubDate><description><![CDATA[先给出关于01背包恰好装满情况的的一篇文章，写的很好 传送门

题目链接
题意：
   KTV里面有n首歌曲你可以选择,每首歌曲的时长都给出了. 对于每首歌曲,你最多只能唱1遍. 现在给你一个时间限制t (t&lt;=10^9) , 问你在最多t-1秒的时间内可以唱多少首歌曲num , 且最长唱歌时间是多少time (time必须&lt;=t-1) ? 最终输出num+1 和 time+678 即可.
 注意: 你需要优先让歌曲数目最大的情况下,再去选择总时长最长的.
思路:
 别看给的时间是1e9，因为每]]></description><category></category></item><item><title><![CDATA[小张的困惑 烟大校赛 01背包变式]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/109728321</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/109728321</guid><author>CUCUC1</author><pubDate>Mon, 16 Nov 2020 21:38:24 +0800</pubDate><description><![CDATA[题目链接
 题目是中文的，就不再过多进行赘述了。
 这个题有两种思路

1、带剪枝的暴力搜索，就是我利用DFS去暴力搜索所有的选择，从中选出一个满足条件的数，剪枝则是采用是否超过N如果超过就比较完返回，其次就是由于序列1 3 4 和  4  3 1和 3 1 4是一样的，所以我们只需要找出所有单调递增的数列组合就可以了，所以每次递归的起点都是上一次递归的值 + 1，这里对于DFS不进行过多赘述

code
#include &lt;cstdio&gt;
#include &lt;iostream&gt;
#]]></description><category></category></item><item><title><![CDATA[背包问题]]></title><link>https://blog.youkuaiyun.com/CUCUC1/article/details/109680957</link><guid>https://blog.youkuaiyun.com/CUCUC1/article/details/109680957</guid><author>CUCUC1</author><pubDate>Sat, 14 Nov 2020 09:39:59 +0800</pubDate><description><![CDATA[1､问题描述:
  给N件物品和一个容量为C的包，每件的价值和重量分别为v[i]和w[i]且每件物品的数量为num[i]  ,问怎么拿可以使得包中物品的价值最大
其实这个问题和之前的01背包和完全背包比较类似，所以如果没有上面两个基础的话，可以先去看下01背包和完全背包。

2､重复背包dp状态和过程

1､先说下未经优化的最朴素的dp过程
 我们只需要仿照完全背包的过程就可以，只不过第三层循环
是每件物品的数量所以我们可以得到状态转移方程


...]]></description><category></category></item></channel></rss>