自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

CUCUC1的博客

弱鸡一个

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

原创 博客迁移公告

  最近新搭了自己的个人博客, 所以本博客将暂停更新, 近期会把一些写的自我感觉良好的文章加工修改一下搬迁到新的博客, 以及一些近期写的关于项目和源码的分析文章.博客传送门: cu1universe.icu 欢迎来玩!也可以把一些有意思的算法或者源码发到该文章评论区, 会定期看下, 如果有时间和精力就会学习并发布到个人博客里...

2021-11-27 13:36:52 335

原创

递归回溯C H I GEOJ Monthly 2020.7 Sponsored by TuSimpleA C D E

2020-07-17 23:10:34 196

原创 Codeforces Global Round 14

Codeforces Global Round 14A.Phoenix and Gold题意: 给定n个数, 问按照什么顺序从左到右将这n个数加起来, 期间不会出现和为x的状态思路: 首先求一遍数组的和, 如果等于x那么加和过程中一定会出现x这个状态,否则就将原数组从小到大排序, 然后从左到右依次加和,若中间和第一次出现了x, 那么就将当前的数先减去, 加上数组的最后一个,之后再将剩下的依次加起来即可, 如果加和过程中没有出现和为x的情况, 那么就皆大欢喜直接按照这个顺序输出即可代码#incl

2021-05-03 11:06:17 223

原创 Codeforces1516 C. Baby Ehab Partitions Again(思维,dp, 数学)

题目链接题意:给定一个序列, 若这个序列任意划分出的两个集合的和都不相等,那么称这个序列为好序列, 否则就判断是否可以通过删除某个值来将其转换为好序列思路:对整个序列求和得到sum, 若sum为奇数, 那么无论如何划分, 最后都会划分为一个奇数一个偶数的和, 所以此时该序列一定为好序列若sum为偶数, 就需要判断是否存在一个子序列可以组成 sum2\frac{sum}{2}2sum​ 这里需要利用01背包进行处理判断是否可以构成 sum2\frac{sum}{2}2sum​一、若不能构成sum2

2021-05-02 01:53:24 360 5

转载 [数据结构]——单调栈

单调栈笔者在做leetcode的题(下一个出现的最大数字)时,接触到了单调栈这一种数据结构,经过研究之后,发现单调栈在解决某些问题时出奇的好用,下面是对单调栈的性质和一些典型题目。什么是单调栈?从名字上就听的出来,单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈和单调递减栈单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大模拟单调栈的数据push和pop模拟实现一个递增单调栈:现在有一组数10,3,7,4,12。从左到右

2021-03-05 13:13:53 224

原创 皮克定理

算法:皮克定理 + 最大公约数时间复杂度: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 <= gcd(x,y) 这样就可以通过求出两点之间的gcd

2021-02-28 20:34:04 666

原创 线段树 +扫描线

 关于线段树辅助扫描线的基本思想,已经有很多大佬去详细的解释了,可以去看一下传送门这里主要说一下线段树辅助扫描线的一些问题以及两种变形关于数据的离散化,离散化很多时候是为了减小空间消耗,但是我认为在线段树辅助扫描线时,基本都是需要进行离散化的,因为在以x(y)为坐标轴时,维护的是[1, m] (m不确定),但是显然坐标轴上的区间点坐标不一定是从1开始的,所以要离散出一个区间其范围是 [1, m]在一般线段树进行区间划分的时候,通常采用下面的方式mid = l + r >> 1;(操

2021-02-17 21:09:50 344

原创 最长公共上升子序列(LCIS)

前置知识LCSLIS注意:  刚开始看这个问题的时候,第一反应是先求出LCS再求出LCS的LIS,事实上这是有问题的,我们并不能保证这么求出的LCIS是最长的,比如下面这个例子Examplea:7 1 5 6 4 2 7b: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

2021-02-06 03:48:45 3186 1

原创 第k短路(A*)

题目链接Remmarguts’ Date如果不了解A*算法可以先去看一下 由A*算法可以直到,当目标点第一出优先队列时,一定是最优解,所以当目标点T第k次出队时,就是第k短路,这是可以用反证法证明的: 假设这是第m次出队(m > 1) ,那么这一次出队是当前所有解中最优(A*性质),所以假设此次路径短于第m - 1次出队长度,显然上一次出队的值应该就是此次出队的值,与假设不符,故该路为第m短路h(x)就可以采用终点到各个点的最短路作为启发式函数,因为可以保证在找第k短路的过程中某点到终点的

2021-01-26 18:11:06 250

原创 BFS 进阶之 A*, 双向bfs

双向BFS 在由起点状态到目标状态进行搜索时,搜索树是以指数层级递增的,所以说在一些情况下,时间复杂度会导致单向的bfs TLE掉或者 MLE掉,这时候就需要对bfs进行一些优化,双向bfs就是一种,双向bfs适用于得知起点和目标点状态时适用,使用两个队列分别从起点和目标点进行双向搜索,当两个方向的状态第一次相遇,即为最短转移路径,这样可以限制搜索树的深度一般在原搜索树的一半左右,极大的降低了所需的复杂度可以参考一下这个图 引用自当两种颜色相遇的时候,说明两个方向的搜索树遇到一起,这个时候就搜到了答

2021-01-22 04:21:01 663

原创 次短路径

文章目录次短路径求次短路的方式1、起点终点各跑一遍最短路,然后枚举中间点2、边更新最短路边记录次短路次短路径求次短路的方式 顾名思义,就是除最短路最外的最短路径,求次短路的方法一般有两种,第一种是从起点跑一遍最短路,终点跑一遍最短路,然后枚举中间点,第二种则是在求最短路时顺便去维护次短路,下面将分别进行详细说明下面代码都是以poj3255作为例题传送门1、起点终点各跑一遍最短路,然后枚举中间点 先说一个结论,节点x到节点y的次短路可以看作min( mindis(x,k1) + length(k

2020-12-17 12:04:11 1804 3

原创 关于树状数组的区间修改以及单点查询和区间查询

题目链接下面的题解转于传送门对于想要学习区间修改和单点输出的同学们可以去看这篇文章  传送门假设数组a是原数组,b是a的差分数组,由前缀和的定义,我们求前n个元素的和,即详细过程如下:a1 + a2 + … + an = b1 + (b1 + b2) + …+ (b1 + b2 + b3 + … bn) ->n * b1 + (n - 1) * b2 + … + bn所以我们要先对原数组a进行差分,得到差分数组b,才对b[i]和b[i]*i分别维护一个树状数组tb和tc,而l到r的

2020-12-16 02:27:13 210

原创 状压dp(自用)

状压dp:前言: 前几周遇到了状压dp的题,不会,所以学习了一下状压dp,本想着上一周写一篇博客,但是由于太忙 懒 ,这周补一下…1、位运算这部分摘取自 传送门名称符号运算法则举例按位与a&b两者同时为1则为1,否则为000101&11100=00100按位或a l b有1为1,无1为000101 l 11100=11101按位异或a^b相同为0,不同为100101^11100=11001按位取反~a是1为0,是

2020-12-09 21:54:41 216

原创 Rational Ratio

题目连接题意:  给一个无限循环小数,并给出它的循环节长度,让你把这个小数转化为分数思路: 这里先说一个结论,有了这个结论,就很好处理了,例如: 0.123123123… = 123 / 999 ,这样我们就可以把小数部分转化为分数,如果有整数部分,就先转小数,然后再进行合并,由于要求分数是最简,所以要进行化简 这样就把问题完全解决了吗?并没有,如果第一个循环节前面有一部分小数呢?例如: 123.4565656…这样的话,我们可以把4提到整数部分,最后再除个十就可以了 也就是转化为 ----&gt

2020-11-29 17:57:53 414

转载 容斥原理

传送门

2020-11-29 14:08:46 158

原创 找零

题目链接思路: 这个题就是求能恰好构成 >= 给出钱数的最小值和最小硬币数量,且能支付的钱最少为第一优先级。 就是一个恰好装满的01背包问题dp[j] 表示 恰好能组成 j元钱所花费的最小硬币数求出dp数组后,我们从给出的价值V开始遍历,找到第一个 恰好能由硬币组成的且大于V的值,并将组成它的最小硬币数输出即可#include <bits/stdc++.h>#define ss system("pause");using namespace std;const int

2020-11-21 16:50:50 385

原创 捡苹果 (贪心 + 完全背包)

题目链接思路: 由于这个题目背包容量太大了,先不说会超时的问题,连dp数组都开不出来,所以我们要想办法减少背包容量,由此我们可以想到贪心。 我们先按照密度最大到小对三个苹果进行排序,然后分出两个空间,一个较小的空间和一个较大的空间,较大的空间我们直接用密度最大的填满(也可能会剩一部分空间,就把剩下的自动分配给较小的空间),然后对较小的部分进行完全背包,这样就解决了背包容量过大的问题 但是要注意,利用贪心的时候,留出的这部分较小空间,不能太小举个例子:3个苹果;4 73 56 2容量 6

2020-11-21 16:39:03 1403 1

原创 Chemist’s vows

Chemist’s vows 题意: 输入一个字符串,如果这个字符串可以由元素周期表的元素组成,就输出YES,反之则输出NO思路: 其实这个题可以用dp做,确实刚开始做的时候没想到,之前倒是做过一个类似的,这类问题,我就先叫它状态dp吧 大名叫啥还真不知道dp状态dp[n] 表示前n个字符能否全部由元素周期表构成,如果可以就是true,反之为false那么我们就可以通过O(n)枚举的方法来得到状态转移方程dp[j] = (dp[j - 1] & (字符j是否为元素符号)) | (dp

2020-11-21 15:41:13 153

原创 01背包变式 要求恰好装满的01背包

先给出关于01背包恰好装满情况的的一篇文章,写的很好 传送门题目链接题意:  KTV里面有n首歌曲你可以选择,每首歌曲的时长都给出了. 对于每首歌曲,你最多只能唱1遍. 现在给你一个时间限制t (t<=10^9) , 问你在最多t-1秒的时间内可以唱多少首歌曲num , 且最长唱歌时间是多少time (time必须<=t-1) ? 最终输出num+1 和 time+678 即可. 注意: 你需要优先让歌曲数目最大的情况下,再去选择总时长最长的.思路: 别看给的时间是1e9,因为每

2020-11-18 17:54:30 320

原创 小张的困惑 烟大校赛 01背包变式

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

2020-11-16 21:38:24 157

原创 背包问题

1、问题描述:  给N件物品和一个容量为C的包,每件的价值和重量分别为v[i]和w[i]且每件物品的数量为num[i] ,问怎么拿可以使得包中物品的价值最大其实这个问题和之前的01背包和完全背包比较类似,所以如果没有上面两个基础的话,可以先去看下01背包和完全背包。2、重复背包dp状态和过程1、先说下未经优化的最朴素的dp过程 我们只需要仿照完全背包的过程就可以,只不过第三层循环是每件物品的数量所以我们可以得到状态转移方程...

2020-11-14 09:39:59 318

原创 B - Fabricating Sculptures

题目链接:Fabricating Sculptures题意: 给定一个底座的列数,要求底座必须填满,且上层方块的组成不能出现凹槽的形状,问底层为n,共有m个方块的摆放方式有几种思路: 我们可以发现,每一层向上,所有的方块都必须是连续的且保持从上到下满足递减的顺序,那么我们可以得到先定义dp状态:dp[n,m] 以n为底层时剩余m个方块的摆放方式的数量那么可以得到递推公式如下dp[i,j] = i * dp[1,j - 1] + (i - 1) * dp[2,j - 2] ... (i -

2020-11-12 21:19:31 124

转载 Improve SPAM(拓扑+BFS)

Improve SPAM题意给你一个有向图,N个点中有1-L个为发送点,剩下的为接收点。点1发送一封邮件给他相邻的点,其他的点接着发送,可能会收到多封邮件,每封发送。问接收点一共接收到了多少封邮件,以及多少个接收点收到了邮件。思路建图,跑一遍bfs可以求出能到达几个接收点,同时优化得到一个连通图。每个接受点受到的邮件数目等于所有上一级发送的邮件数目之和。所以跑一遍拓扑排序即可,每次更新该点可以接收邮件数目ci[edge[i].to] = ci[p] + ci[edge[i].to]code#i

2020-11-12 20:07:13 86

原创 分组背包

本篇参考自传送门问题 有N件物品和一个容量为V的背包。第i件物品的费用是w [ i ],价值是v[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。思想 这个问题就转化为了每一组都可以有多种取法,但是只能取一个物品,也可以不取,则可以设 dp[i,j] 表示前i 组物品容量为 j 时的最大收益则状态转移方程为dp[k][j]=max(dp[k−1][j],dp[k−1][j−c[i]]+w[i]∣物品i属于

2020-11-10 14:09:51 158

原创 维修数列-平衡树的硬板子

题目链接  题意就是一个简单的平衡树的板子,但是在实现上有很多细节,蒟蒻的我竟然debug了3天,只能说自己的板子不硬,更新下板子 因为细节挺多的(至少我觉得是,所以就直接以注释的形式写在代码里了)但是要注意,这里说的子列是连续的子列。 因为看网上的题解说的好像在bzoj上一直开新点会内存超限,为了防止也出现这个情况,我特意学了一手节点回收分配(虽然最后也没啥用好像)超长代码(捂脸)#include <bits/stdc++.h>#define ss system("pause");

2020-11-08 17:05:23 176

原创 Balls poj3783(dp,最坏情况最优解)

poj3783 Balls题意: 有一些鸡蛋,我们现在想知道这些鸡蛋的硬度。然后现在有一座很高很高的大楼里,我们现在要在这座大楼上测试鸡蛋的硬度。每个鸡蛋的硬度相同,鸡蛋的硬度定义为:如果鸡蛋从第 m 层上掉下来没有破裂,而从第 m+1 层上掉下来就破裂了,那么这个鸡蛋的硬度就是 m 。某个鸡蛋如果在实验中破裂了就永远的损失了。我们现在有 n 个鸡蛋。那么在最坏情况下我们最少需要做多少次实验呢?思路:  这是一个很经典的dp问题,设dp[n,m]是第i层楼,有k个鸡蛋时找到符合条件的最少测试次数

2020-10-31 21:00:32 1544 5

原创 矩阵快速幂以及求斐波那契数列

先序1、 先说一般数的快速幂,就是把幂指数拆成了二进制进行运算这样就把时间将到了logN(N为幂次数)2、矩阵快速幂就是将快速幂中的数变成了矩阵,但是要注意这里矩阵必须是n✖n的因为下面要介绍矩阵快速幂在logN的时间内求斐波那契数列所以我们暂定矩阵为2 ✖ 2的矩阵乘法的实现//矩阵乘法的实现void marix_mul(ll a[][2],ll b[][2]){ int c[2][2]; memset(c,0,sizeof c); for(int i = 0;

2020-10-30 13:36:40 376

原创 欧拉函数及欧拉函数表

欧拉函数Phi(n)=n(1-1/p1) (1-1/p2)…… (1-1/pk)其中p1, p2 ,pk是n的所有素数因子Phi(n):所有小于等于n的且与n互素的数的个数(1)直接实现 int oula(int n) { int rea=n; for(int i=2; i<=n; i++) if(n%i==0)//第一次找到的必为素因子 { rea=rea-rea/i;

2020-10-30 13:20:36 3007 1

原创 ACM ICPC Greater NewYork Region 2015(补)

E: A Rational Sequence 2题意理解:就是让你在满二叉树上寻找规律,根据给出的p,q推出对应的编号;利用每个左子节点编号是父节点遍号 * 2 ,右子节点编号是父节点编号 * 2 + 11 并且如果 p > q那么是往上找到第一个p < q的节点一直沿其右节点走那么这个节点的编号是往上找到第一个p < q的节点的编号 * pow(2,k) + pow(2,k) - 1,k是起始节点向下多少层到目标节点(毕竟每向下一层都要*2 + 1,最后就能推出来上面那个

2020-10-28 21:27:38 150

原创 ICPC模拟选拔 Greater New York Regional 2009 (补题)

文章目录ICPC模拟选拔 Greater New York Regional 2009 (补题)该题解参考并转自https://blog.csdn.net/u013050857/article/details/45080467**C**:[poj3783](http://poj.org/problem?id=3783)**D** : [poj3748](http://poj.org/problem?id=3784)题意:思路:代码:**F** :题意:思路:代码ICPC模拟选拔 Greater New

2020-10-25 21:51:06 138

原创 codeforces 1422 (#675 div2)

B. Nice Matrix传送门题意:给出一个矩阵,让你做变换(给任一元素加减1)使得矩阵任一行列均为回文,求出最少的变换次数.因为数据很小,而且我们发现,枚举一个点,需要把他对应的四个角都要求出来,所以我们直接暴力枚举左上四分之一部分就可以了,但是要注意,如有奇数行或者列出现的时候,枚举的时候要加上,并进行特判借一个图图片地址中间红色就是特判区域#include <iostream>#include <algorithm>#include <cstd

2020-10-18 11:11:23 140

原创 manacher算法 +例题

目录Manacher参考博客 ~~(懒惰的我)~~:模板hdu3294hdu3068Manacher参考博客 (懒惰的我):简单而有通俗的讲解,讲的太好了证明对于一些我的理解,我会以代码注释的形式写在代码里, 我不懒模板char str[maxn];char temp[(maxn <<1) + 10];//扩展后的字符串int Len[(maxn <<1 ) + 10];//扩展后字符串第i个位置回文串从中间到第有边界的长度//相当于 回文子串长度 / 2 +

2020-10-14 21:07:00 333

原创 欧拉回路的判定和求解

欧拉回路的判定1无向图 无向图:连通(不考虑度为 0 的点),每个顶点度数都为偶数。hdu 1878ac代码#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <string>#include <cmath&g

2020-10-14 15:06:17 569

原创 2020牛客国庆集训派对day8 (补)

2020牛客国庆集训派对day8 E题意: n个人 ,要出k道题,每个人都有一个题目难度的序列,每一轮按照从1-n的顺序说题目难度,如果说的这个数大于等于之前它之前的题目难度和,就把这个题的难度加进去,如果最后放进去的题目< k 那么就用50填充剩余的,但是要注意如果当前人没有题目了,但是还有人的题目剩余,那么这一次的填充也为50虽然我没做出来,但是作为一个签到题我选择直接piao代码代码出处#include <bits/stdc++.h>#include <iostr

2020-10-12 21:30:16 225 1

原创 2020牛客国庆集训派对day4 F What Goes Up Must Come Down

What Goes Up Must Come Down题意:给一段序列,每次只能移动相邻两位,问最少要移动多少次,才能使整段序列先不单调递减,再不单调递增(允许整段序列单调)思路: 对于这个序列,是不是要把除了最大以外的数想最大项的左右移动,那么我们按照从小到大的顺序移动,对于当前数为我们有两个方向去移动它,第一种是向左移动,第二种是向右移动,所以我们要求出这个数左右两个方向的逆序数,比较我们应该向哪边移动步数最小,当然是选逆序数少的一端,那为什么移动的步数是逆序数呢?因为我们是按照从小到大的顺序进行

2020-10-06 19:19:22 181

原创 2020牛客国庆集训派对day4(补题)

2020牛客国庆集训派对day4B题意:  题意:求最长等差序列的长度。DP:摊派了我讲不明白,参考下这两篇博客吧(捂脸)传送门1传送门2#include<cstdio>#include<iostream>#include<queue>#include<set>#include<algorithm>#include <cstring>#include <string>using namespac

2020-10-04 21:47:50 971 4

原创 回文自动机/回文树(模板)

洛谷3649还是封装了比较香#include <iostream>#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <string>#include <stack>#include <queue>#include <map>#include <vector>

2020-10-03 20:38:53 150

原创 2020牛客国庆集训派对day3(补)

2020牛客国庆集训派对day3(补)J题意:  一共有n种花,每种花数量为a[i],要用这些花来做成花束,每个花束必须正好有M多花,且都是不同品种,问最多能做成多少束花思路(引用了牛客大佬的题解):  假设能做成x束花,那么就需要花的总量为xm,一共有n种花,如果a[i]>x,也就是这种花可以用在每一束,也就是第i种花最多用x个,如果a[i]<x,那第i种花就要全部用完才可以。我们用tot来记录在x个花束的情况下,现有的能提供多少花也就是看当前x的情况下,每一种花

2020-10-03 20:22:17 187

原创 2020牛客国庆集训派对day2(补题)

2020牛客国庆集训派对day2(补题)2020牛客国庆集训派对day2CELI’S CURIOUS MIND῟ 题意很简单,这个题采用了递推的思想,首先,我们要知道,我们只需要求得从1和开始递推的序列数就可以了,当我们从大于3的数开始取,那么由于第二条规则,这个数能取到,那么必能取到1和2中的某一个数,所以一个序列一定是从1和2开始的,其次,增加到第i个试管,那么这些试管混合得到的种类就是i - 2和i - 3的种类和,因为由于第二条规则,我们只需要将每一个原序列再后顺延一位,这样可以发现,当试

2020-10-03 19:44:38 191

原创 数位dp

title: 数位dp数位dp文中提到的引用均来自巨佬数位dp,一般是求一段区间内满足给定条件的数的个数,数位:顾名思义,就是按照一个数的位数进行dp,比如一个三位数,就按照百位、十位、个位进行。但是我感觉,有些带记忆的dfs内味了数位dp实质还是一种暴力枚举的方法对于区间 [l,r] 求满足条件的数的个数,最简单的暴力做法如下:for(int i = l; l <= r; i++){ if(fair(i)) ans++;}但是这样如果l 是1而r是1e9,这种暴力的做.

2020-09-27 12:36:25 167

空空如也

空空如也

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

TA关注的人

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