- 博客(52)
- 收藏
- 关注
原创 Codeforces Round #815 (Div. 2) A ~ C
Codeforces Round #815 (Div. 2) A ~ C
2022-08-19 10:03:52
317
原创 数位统计 dp 问题
数位统计 dp文章目录数位统计 dp@[toc]简介解决的问题写法递推记忆化搜索例题例题 统计问题 The Counting Problem[P4124 [CQOI2016]手机号码](https://www.luogu.com.cn/problem/P4124)[SP17247 PR003004 - Digit Sum](https://www.luogu.com.cn/problem/SP17247)[SP10606 BALNUM - Balanced Numbers](https://www.lu
2022-05-29 22:37:16
639
原创 Tarjan算法(强连通分量)与缩点
Tarjan算法文章目录Tarjan算法简介前置知识强连通分量dfs过程产生的边算法时间戳过程代码实现缩点缩点的应用例题 P2746 [USACO5.3]校园网Network of Schools简介Tarjan算法可以求出一个有向图中的强连通分量的个数,同时还可以将强连通分量改造为一个点,也就是所谓的“缩点”。前置知识强连通分量强连通分量(或者极大连通子图),指的是在一个子图中,所有点能够两两互达,且再加入新的点时将破坏连通性。特别要注意的是,一个点可以被认为是一个强连通分量。dfs过程产生
2022-05-27 12:06:40
363
原创 P1297 [国家集训队]单选错位
P1297 [国家集训队]单选错位题目简述试卷上有nnn道单选题,第iii道单选题有aia_iai个选项,这aia_iai个选项的编号是1,2,3,⋯ ,ai1,2,3,\cdots,a_i1,2,3,⋯,ai,每个选项是正确答案的概率是相等的。现在将第iii道题的答案ansians_iansi做如下操作:ansi=ans(i+1)mod nans_i=ans_{(i+1)\mod n}ansi=ans(i+1)modn问期望做对题目的个数。思路考虑第i−1i-1i−1道题和
2022-04-24 19:22:56
287
原创 牛客xiao白月赛 47 CD
牛客小白月赛 47 CDC思路模拟就可以了。从后往前扫可以交换的个数,并记录个数和最后交换的位置,直到扫描到前面的已经出队了停止。这样答案就是最后交换的位置,因为除了交换以外还有可能交换不了需要等待的小猫咪。代码#include <bits/stdc++.h>using namespace std;int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n;
2022-04-10 12:56:02
248
原创 最长上升子序列(的长度)的求法
最长上升子序列给定一个长度为nnn的数列,问其最长上升子序列最大为多长。简单求法设f(i)f(i)f(i)为第iii个元素为末尾的最长上升子序列的长度。那么根据最长上升子序列的定义,则状态转移方程为:f(i)=max(f(j)+1)f(i)=max(f(j)+1)f(i)=max(f(j)+1)其中,第jjj个元素比第iii个元素小,且有j<ij<ij<i。代码实现如下。#include <bits/stdc++.h>using namespace std;
2022-04-08 16:16:01
782
原创 最长公共上升子序列(LCIS)
最长公共上升子序列(LCIS)大致题意给一个数字nnn,然后再给两个长度为nnn的数列,求它们的最长公共上升子序列。思路普通做法考虑这样的一个状态f(i,j)f(i,j)f(i,j),这样的一个状态描述为:截止到jjj(也就是第二个数列)的位置时,在含有第一个数列的前iii个数字中最长公共上升子序列的长度。这个过程就是LCS+LIS的思路。int solve(std::vector<int> &a, std::vector<int> &b) { s
2022-04-06 00:20:03
343
原创 逆序对问题的简单求法
逆序对暴力求逆序对根据逆序对的定义,也就是,所有元素前面元素比它大之和,具体可以看下面的代码。long long solve(std::vector<int> & a) { long long ans = 0; for (int i = 0; i < a.size(); ++ i) for (int j = i - 1; j >= 0; -- j) if (a[j] > a[i])
2022-04-04 10:21:07
572
原创 HDU 1503 Advanced Fruits(最长公共子序列)
HDU 1503 Advanced Fruits(最长公共子序列)HDU OJ 终于又活过来了。题目传送门题目The company "21st Century Fruits" has specialized in creating new sorts of fruits by transferring genes from one fruit into the genome of another one. Most times this method doesn't work, but somet
2022-04-02 18:57:46
342
原创 蓝桥 第十二届省赛 砝码称重
第十二届省赛 砝码称重题目传送门思路根据之前计算得到的质量求得个数(负数的质量在天平上反过来就是正的)。基于这种思路,很容易写出暴搜的错解。暴搜这是一种及其暴力的搜索方式。当然只过了一半的点。#include <bits/stdc++.h>typedef long long ll;int n;ll c[110];std::set<ll> cnt;void dfs(int id, int now) { cnt.insert(std::abs(now)
2022-04-01 21:17:29
272
原创 蓝桥 砝码称重(完全背包)
蓝桥 砝码称重题意给定nnn种砝码(每种砝码个数不限)和一个整数mmm,问至少需要多少个砝码才可以称量mmm。思路这题是完全背包的模板题(但是因为没看到无限砝码个数WA了)。考虑每个重量当前可以选取的最少砝码个数f(i)f(i)f(i)和目前法码ccc,可以知道这个状态可以是从i−ci-ci−c那边得到,也可以从自己得到。也就是说,目前的重量可以选择的最少砝码个数,要么是它现在的选择个数,要么就是之前的状态转移得到。因此,可以得到下面的状态转移方程:f(i)=min(f(i), f(
2022-04-01 20:24:07
444
原创 三元不定方程求解
三元不定方程求解原题:UVA12775 Gift Dilemma题意给定四个数:aaa, bbb,ccc,ppp,求以下方程的非负整数解个数:ax+by+cz=pax+by+cz=pax+by+cz=p思路这个方程乍一看有点类似于ax+by=cax+by=cax+by=c这个方程。既然类似,那么就把上面的方程转化为这个形式就好了:ax+by=p−czax+by=p-czax+by=p−cz这样,利用扩展欧几里得算法,可以快速的求出上面方程的非负整数解个数。zzz要怎么处理?一种简单
2022-03-30 07:52:15
1024
原创 蓝桥杯 2019省赛 后缀表达式
蓝桥杯 2019省赛 后缀表达式题目传送门思路完全错误的思路用贪心的想法,加大的,减小的。然后发现WA了正确思路后缀表达式加括号关于后缀表达式其实有个点是容易被忽略的(也是为什么上面暴力贪心忽略的一个要点):其实后缀表达式也是可以加括号的(为什么可以加括号?因为那道后缀表达式加括号的题我没过)换句话说,中缀表达式中括号加上减号的一些骚操作是可以在后缀表达式中实现的。括号与减号加法其实比较普通(毕竟加再多括号还是求个和),但是减法就有点特殊的性质了。如果将加法式子括起来,前面放个减号,
2022-03-28 21:06:22
327
原创 【补题】上帝与集合的正确用法(扩展欧拉定理的简单应用)
上帝与集合的正确用法题目传送门:P4139 上帝与集合的正确用法题意给定一个数字ppp,求:222⋯ mod p2^{2^{2^{\cdots}}} \bmod p222⋯modp思路因为可能存在ppp与2不互质的情况,所以要使用扩展欧拉定理。使用扩展欧拉定理构造一个同余式子:222⋯≡2222⋯ mod φ(p)+φ(p)(modp)2^{2^{2^{\cdots}}} \equiv 2^{ 2^{2^{2^{\cdots}}} \bmod \varphi(p) + \varphi(
2022-03-28 15:21:05
538
原创 【补题】Codeforces Round #779 (Div. 2) A ~ D1
Codeforces Round #779 (Div. 2) ABC掉分……A思路纯模拟,两个0相隔位置小于2的考虑,其他的不考虑。代码(C++)#include <bits/stdc++.h>using namespace std;int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int t; cin >> t; while (t -
2022-03-28 11:00:00
297
原创 【日志】0x2 可能是很有用的东西——关于Python的字符问题
Python的字符问题可能是很有用的东西。前言Python中的''表达的是字符串而并非是当个字符,涉及到一些麻烦的'a' + 2这种转换ASCII码的时候,如果使用c++的话会很方便(然而有的题目int128都炸),python的话需要借助两个函数实现。Python中实现直接转换的方法chr方法Python中有个方法,叫chr(),作用就是把数字转换为单个字符。ord方法这个方法的作用就是把单个字符转换为数字。具体题目这道题正解不是这么做的虽然这么做很河里,题解中的做法很妙(还有秦九昭)
2022-03-26 11:02:19
1170
原创 【日志】伯特兰-切比雪夫定理的小应用
伯特兰-切比雪夫定理内容对于一个整数nnn,且n>3n>3n>3,则至少存在一个素数ppp,且这个素数符合n<p<2n−2n<p<2n-2n<p<2n−2。另一种说法:对于一个任意大于111的整数nnn,至少存在一个素数ppp,符合n<p<2nn<p<2nn<p<2n。例题 P5535 【XR-3】小道消息题目传送门思路考虑当这个人为素数时,他会告诉谁?因为一个素数ppp能够保证互质的一个区间为[2,2
2022-03-26 10:39:53
659
原创 【补题】CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes) ABC
CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes!) A-C太菜了……剩下的题目还得补。A题意给一个数列,任选两个位置i,ji,ji,j,这两个位置可以重叠,使得∣ai−ak∣+∣aj−ak∣=∣ai−aj∣|a_i-a_k|+|a_j-a_k| = |a_i-a_j|∣ai−ak∣+∣aj−ak∣=∣ai−aj∣。kkk位置也是任意。思路因为位置可重叠,所以直接找最大值和最小值的位置即可。代码(c++)#include <b
2022-03-25 13:53:08
388
原创 【日志】扩展中国剩余定理
扩展中国剩余定理(P4777 【模板】扩展中国剩余定理)原题传送门中国剩余定理被划分为useless算法了不过中国剩余定理能做的,扩展中国剩余定理(应该)都能做到过程考虑两个同余方程。x≡a(modb)x≡c(modd)x \equiv a \pmod b\\x \equiv c \pmod dx≡a(modb)x≡c(modd)从模的定义上,可以将第一个式子转化为:x=bt+ax = bt + ax=bt+a之后再将方程带入二式,得:bt+a≡c(modd)bt + a \
2022-03-25 00:10:37
1385
原创 【日志】常用的判断素数方法——Miller-Rabin素性检验
Miller-Rabin素性检验Miller-Rabin素性检验是一种能够判断素性的高效算法。费马小定理当ppp是一个素数,且1≤a≤p−11\le a \le p-11≤a≤p−1时,有:ap−1≡1(modp)a^{p-1} \equiv 1 \pmod pap−1≡1(modp)这就是费马小定理。通过费马小定理进行素性检验如果逆着推过来,当1≤a≤p−11\le a \le p-11≤a≤p−1时,如果上述式子成立,则ppp不就是一个素数了嘛?然而,这个是错误的。仍然存在一些(无穷
2022-03-21 00:51:43
296
原创 【日志】Debug和简单对拍代码
面向样例编程的调试有时候写完代码需要进行Debug,还需要对拍。下面基于vscode进行说明。测试样例插件 CPHcph是一个很好用的插件,可以对测试样例进行快速方便测试(虽然在我这里经常出现奇奇怪怪的bug)。不过其他条件下一般是用不了这个插件的,所以需要一点其他的测试方式。通过可变参数Debug(c++)从c++11之后,宏、函数模板可以支持任意参数,只需要像下面这样就可以:#define defv(...) defuse(__VA_ARGS__)template<typena
2022-03-18 16:37:54
767
原创 【补题】P1082 [NOIP2012 提高组] 同余方程
P1082 [NOIP2012 提高组] 同余方程题目传送门:P1082 NOIP2012 提高组 同余方程。思路是一道使用扩展欧几里得算法的模板题。扩展欧几里得算法可以求出两个整数xxx和yyy,使得:ax+by=gcd(a,b)ax+by=\gcd(a,b)ax+by=gcd(a,b)题目要求的式子则为:ax≡1(modb)ax \equiv 1 \pmod bax≡1(modb)(实际上是求a在模b意义下的逆)。所以,可以直接使用Exgcd求出解。代码一种可行的c++代
2022-03-18 00:00:10
1389
原创 【日志】0x1 Python在一些题目中的输入与输出
Python在题目中的输入输出有时候做题需要用点Python(主要是其他东西写C++太麻烦了)。这里使用的是python3。输入对于输入来说,可以使用input()函数进行输入。一个数字或者一组字符串单个数字的输入如下。# 1n = int(input())print(n)# print(int(input()))这样就可以进行输入了。多个数字或者多个字符串由于input()方法是读入一行字符串,因此需要调用split()方法进行分裂。另外,还需要使用map(函数,一个或多个元素
2022-03-17 23:15:42
578
原创 【补题】UVA11992 Fast Matrix Operations(使用类包装的线段树)
UVA11992 Fast Matrix Operations题目传送门题目大意需要对一个初始全为0的矩阵进行操作。给定两个点,并执行下面三个操作:对给定两个点中间的范围加上val。将给定两个点中间的范围全部赋值为val。询问给定两个点中间的范围中所有元素的和和其中的最大值与最小值。矩阵不超过20行。思路因为矩阵不超过20行,可以考虑每一行直接开一棵线段树进行维护。区间加法与查询区间加法和查询很简单,只需要参照正常线段树,一颗一颗维护就行。要注意的一点,区间加法对于最大值和最小
2022-03-15 23:09:50
85
原创 【日志】旋转Treap
旋转TreapTreap树的名字来自于Tree+Heap,因为它结合了树(二叉搜索树)和堆(二叉堆)。(所以可以翻译为树堆?)。虽然感觉除了代码长点,这个旋转Treap也不是不好,但是fhp能做到的它做不到……虽然Treap相对简单,但是下面这行代码对写平衡树很有用。#define debug(x) std::cerr << #x << " " << x << '\n'结点性质在Treap中,各个结点的值val具有跟二叉搜索树一致的性质。同时,每
2022-03-12 22:23:13
1145
原创 【日志】珂学——珂朵莉树
珂朵莉树(珂学)珂朵莉树(或者老司机树)起源于CF896C。前置知识点STL中set的使用(list也行,但是效率差点)set的排序规则inserteraselower_bownd暴力使用珂朵莉树通过直接对区间进行暴力维护。不同于线段树或者树状数组对于区间的维护,珂朵莉树相当于直接把区间拆出来进行修改。下面的代码基于CF896C。定义珂朵莉树的定义如下:// using ll = long long;class ODT { private: class
2022-03-10 14:51:04
568
原创 【模板】带旋转的Treap模板
旋转Theap模板这是一种可行的旋转Theap模板(用了结构体包装,但是不一定是最好的)。简介Theap看名字就知道,Tree+Heap。其中,节点的val按照搜索二叉树排列,而关键的结点权值rank按照堆的规则排列。其中比较关键的就是旋转操作,跟AVL树类似。插入操作要维护一下rank。删除操作可以按照二叉树的删除或者堆的删除进行。一种可行的代码如下。class Theap { private: class Node { public:
2022-03-10 10:36:45
1060
原创 【日志】C++的仿函数与Lambda表达式的简单用法
C++的仿函数与Lambda表达式的简单用法仿函数仿函数,就是类中重载了()的类,比如这个:class Cls { private: int x; public: bool operator () { } };可以注意到,仿函数作为一个类,也是可以有自己的成员。一些小用途在c++中,仿函数可以替代c的回调函数(而且还有带有成员)。比如sort或者是一些stl的容器中可以使用仿函数。struct Cmp { boo
2022-03-10 00:24:53
835
原创 【模板】Kruskal重构树
Kruskal 重构树模板知识点Kruskal 算法LCA(倍增LCA或者Trajan算法)模板这里使用用倍增LCA。例题为:P1967 火车运输。除了Kruskal求生成树含在main函数里面,其他都已经用结构体封装好。#include <bits/stdc++.h>using namespace std;#define all(x) std::begin(x), std::end(x)const int MAXN = 1e6 + 10;int n, m;vec
2022-03-09 10:56:24
255
原创 【日志】01背包(简单讨论)
01背包01背包问题简单来说,是允许放置是放或者不放这个物品的问题。状态转移方程虽然这玩意叫做状态转移方程,但是一直感觉还是属于递推的方式,但是由于暴力一般的01背包问题都有如下这个状态转移方程。f(i,j)=max{f(i−1,j),f(i−1,j−v)+w}f(i,j)=\max\{ f(i-1,j),f(i-1,j-v)+w\}f(i,j)=max{f(i−1,j),f(i−1,j−v)+w}其中,iii指的是考虑第iii个物品(前面i−1i-1i−1个物品是不考虑的,默认已经得到了
2022-03-06 00:36:21
147
原创 【日志】可持久化线段树2(静态主席树)
可持久化线段树求区间第kkk小值(主席树)例题:P3834 【模板】可持久化线段树 2考虑一个问题:给定nnn个数字,之后询问在[l,r][l,r][l,r]内的第kkk小的值是多少。暴力写法考虑暴力写法。简单来说,给这几个数字直接sort一下,就求到了。然后ttt组询问直接把时间复杂度卡上天。主席树主席树一种基于线段树的数据结构,全称是可持久化权值线段树(然而思想更重要)。对于求区间第k小,可以使用主席树(如果想尝试每一次都开一棵线段树也行,MLE)使用主席树求区间第k小问题先不考虑怎
2022-03-06 00:34:03
207
原创 【日志】逆元
逆元逆元,听起来有点高深(之前学长讲解逆元的时候只给了个公式,然后说对除法取模要用逆元)。逆元的简单定义简单来说,逆元的条件需要先满足下面这个式子:ax≡1(modm)ax \equiv 1 \pmod max≡1(modm)其中,gcd(a,m)=1\gcd(a,m)=1gcd(a,m)=1,也就是aaa和mmm是互质的。这时候,xxx就是aaa的逆元,可以记为a−1a^{-1}a−1。(如果你想要更专业的说明的话,请看一本书,叫做《初等数论及其应用》,机械工业出版社(也就是黑皮书)的)
2022-03-05 00:44:13
104
原创 CF1622C Set or Decrease
CF1622C Set or DecreaseC Set or Decrease题目大意:给定一个序列ai{a_i}ai和一个数字kkk,和两个操作:选择任意一个位置iii的数,使得ai=ai−1a_i=a_i-1ai=ai−1。或者选择两个位置iii和jjj,使得ai=aja_i=a_jai=aj。求最少执行上述操作多少次,使得∑i=1nai≤k\sum_{i=1}^{n}{a_i} \le k∑i=1nai≤k。可以看出,对于单独的操作2,让最大值等于最小值是最好的方法(因
2022-03-04 08:36:33
933
原创 【日志】LCA 倍增求法
LCA 倍增法这里是求树上两点最近公共祖先的倍增求法。倍增简单来说,倍增就是:1,2,4,8,16,32,⋯1,2,4,8,16,32,\cdots1,2,4,8,16,32,⋯像上面这个数列(其实准确来讲应该是思维),任何大于0的正整数,它都能够表示,这就是倍增。倍增求LCA这个点的祖先不考虑如何求得那个祖先。考虑这个结点到祖先节点的路径,发现使用上面的倍增方法可以很好的描述(因为上面那个玩意可以很好的表达出这条路径长度嘛)。考虑从小到大去表示这条路径,会发现很难描述用上面的方法如何
2022-03-03 19:31:54
384
原创 【补题】序列操作
序列操作这题来自于DamayuanOJ的每日一题Dv1。题目大意给定一段序列,需要对其执行以下给定操作:给定一个位置和一个数字y,将该位置的数字改为y给定一个数字y,将目前数组中的所有低于y的数字改为y只需要在执行完毕操作后即可。大佬用离线算法解决了这道题,我太菜撸了棵线段树上去硬模拟这个过程。因为这道题只需要执行操作后再输出,所以过程其实不重要。不过貌似用线段树做也可以……具体思路虽然是使用了线段树,但是实际上数组仍然是操作的对象。使用线段树可以更方便的管理区间元素,所有的操作结果
2022-03-03 09:02:28
167
原创 【模板】复数的简单模板
复数复数类的模板。(然而如果你实现了一个template向量模板的话,只需要修改一点东西就可以变成复数)形同a+bia+bia+bi的数就称为复数,其中i=−1i=\sqrt{-1}i=−1。c++里面有std::complex,不过自己实现一个会更快。模板下面是以double实现的复数,也可以使用template。struct Complex { double x, y; // 实部与虚部 Complex(double x = 0, double y = 0) : x(x),
2022-03-03 00:23:56
226
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人