自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 动态规划的本质

本文讲解了动态规划的一般步骤,能够帮助读者更加深刻的理解动态规划的本质。

2022-03-23 22:57:47 830 5

原创 51nod1290 Counting Diff Pairs

题面题目连接解题思路使用莫队+树状数组的做法是显然的,但是复杂度是O(nnlogn)O(n \sqrt{nlogn})O(nnlogn​)。介绍一种基于二次离线的做法,复杂度O(nn)O(n\sqrt n)O(nn​)。在莫队区间移动时,例如从[l,r][l,r][l,r]变成[l,r+1][l,r+1][l,r+1]时,我们需要求得[l,r][l,r][l,r]中有对少个数和r+1有关。这可以拆分成对于[1,l−1][1,l-1][1,l−1]和[1,r][1,r][1,r]的两个前缀的询问。

2021-09-20 19:45:34 195

原创 关于阶乘的快速算法的研究

解决问题求一个的阶乘n! modPn! \ mod Pn! modP。总述本文提出一种快速阶乘算法,对于模数P没有质数或是合数的要求,假设PPP对于素数ppp的最大分解是pkp^kpk,该算法能够做到在O(maxpk∣Pk2plogpn)O(max_{p^k|P}k^2plog_pn)O(maxpk∣P​k2plogp​n)的时间复杂度内将阶乘分解成r∗ptr*p^tr∗pt的形式,其中rrr与ppp互质。本文在文末指出了优化方向,能够将该算法优化至O(maxpk∣Pplog2p

2021-09-15 14:40:04 1447

原创 51nod1121 机器人排队

题面题目链接解题思路考虑如何求解阶乘,跟这篇题解类似,是求阶乘的最低十八位。组合数能够写成阶乘的形式。代码#include <cstdio>#include <algorithm>#include <cstring>using namespace std;#pragma GCC optimize(2)typedef long long ll;typedef __int128 Int;Int add(Int a, Int b, Int mo

2021-07-16 09:40:50 165

原创 51no1037 最长的循环节V2

题面题目链接解题思路其实就是找到一个尽可能大的质数且原根是10。通过大数质因子分解算法:Miller_Rabin和Pollard_rho来解决。网上能找到的分解板子七八成都是错的。代码#include <cstdio>#include <algorithm>#include <cstring>#include <ctime>#include <vector>#include <random>using nam

2021-07-15 18:56:42 177

原创 最大子段和 从入门到入土

洛谷P1115链接洛谷P4513单点修改,区间最大子段和。链接洛谷P5073链接洛谷P4118链接牛客挑战赛32F链接

2021-07-12 11:06:24 134 1

原创 51nod1387 移数字

题面题目链接解题思路当nnn是偶数是,答案是n!n!n!,当nnn是奇数时,答案是n!2\frac{n!}{2}2n!​。这里记录一份跑的很快的MTT和求n!n!n!的模板,给出来源博客链接。代码#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>using namespace std;#define fp(i,a,b) for(int i=(a

2021-07-10 00:19:49 108 1

原创 51nod1408 随机函数

题面题目链接解题思路我们要求的是满足seed2x%P≡k(mod n)seed^{2^x} \%P \equiv k(mod\ n)seed2x%P≡k(mod n)的最小的xxx。首先我们要求出满足seedx≡1(mod P)seed^x \equiv 1(mod\ P)seedx≡1(mod P)的最小的xxx,称其为ordordord,即seedseedseed在ppp模系下的阶。考虑对nnn进行分类讨论,定义阈值TTT。1,当n<Tn&lt

2021-07-09 14:00:52 135 1

原创 51nod2576 k维空间套娃

题面题目链接解题思路该题题目描述是有问题的,根据其题解可以分析出,该k维物体每一位的大小是相同的。令dp[i][j]dp[i][j]dp[i][j]表示已经套了iii层,第iii层的宽度是jjj。有如下转移dp[i][j]=∑i=1ndp[i][j−1]∗(n−i+1)kdp[i][j]=\sum_{i=1}^ndp[i][j - 1]*(n-i+ 1) ^kdp[i][j]=∑i=1n​dp[i][j−1]∗(n−i+1)k。复杂度O(n2d)O(n^2d)O(n2d)。考虑将转移系数写成矩

2021-07-08 15:36:11 281 1

原创 51nod1263 广义斐波那契序列

题面题面链接解题思路唐老师在评论区里写的很清楚,只要加上若干常数优化即可。这里提供一份能跑过的代码。代码#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;#define MP make_pairtypedef long long ll;const int N = 1e5 + 100;ll q

2021-07-07 16:27:35 95

原创 51nod1961 Power Sum

题面题目链接解题思路按题解模拟即可,这里提供一份能跑过的代码。代码#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int MOD = 786433;const int G = 10;const int N = MOD * 8 + 5;int add(int a, int b) { return a + b >= MOD ?

2021-07-06 18:38:31 168 1

原创 51nod1796 二进制表

题面题目链接解题思路首先确定解题方向,我们发现对同一行至多操作一次,枚举行的操作情况,共有2n2^n2n种,然后依次计算每列是否需要翻转。复杂度O(m2n)O(m2^n)O(m2n)。考虑优化这个过程,设dp[i][j][k]表示行操作是j,有dp[i][j][k]个数最低的i位和j有k位不同,最高的n-i位和j完全相同的。转移即可,转移过程类似FWT,复杂度O(n22n)O(n^22^n)O(n22n)。代码#include <cstdio>#include <algor

2021-07-02 14:27:18 188 2

原创 51nod1907 小C的游戏

题目题目链接解题思路题目可以转化成在一个仙人掌图上,求所有子图的连通块大小。对于树边而言,其生成函数是1+x,代表选了不会产生更多连通块,不选会产生一个连通块。对于环边而言,我们先将其环上的边多项式合并后,将大于0的项左移一位。比如三元环而言,其边多项式是(1+x)3=1+3x+3x2+x3(1+x)^3=1+3x+3x^2+x^3(1+x)3=1+3x+3x2+x3对于环而言,其多项式是4+3x+x24+3x+x^24+3x+x2如此可以进行多项式的启发式合并,复杂度O(nlog2n)O

2021-06-17 14:21:24 99 1

原创 51nod1145 斐波那契序列

题面题目链接解题思路需要一个前置知识fib[i]mod  10kfib[i]\mod 10^kfib[i]mod10k是有周期的,周期是6∗10k6*10^k6∗10k。具体证明见51nod1195的题解。考虑按位倍增处理答案。先处理出所有的位置i,fib[i]≡n (mod 10)i,fib[i]\equiv n \ (mod\ 10)i,fib[i]≡n (mod 10)。然后考虑如何扩展到mod100。我们知道所有的位置j,fib[j]≡n(mod&

2021-06-16 18:01:59 154 1

原创 51nod1151 N!的非0最低18位

题面题目链接解题思路我们将101810^{18}1018拆成218∗5182^{18}*5^{18}218∗518分别求解,再用CRT合并。考虑n!%pkn!\%p^kn!%pk如何求解。我们首先应将n!中所有的p因子剔除。这一步可以递归求解,令f(n,p,k)表示n!%pkn!\%p^kn!%pk且剔除了p的所有因子。则有f(n,p,k)={∏i=1ni,n<pf(n/p,p,k)∗∏i=1,i∤pni,n>=pf(n,p,k)= \left\{ \begin{array} {l

2021-06-01 20:13:48 240 2

原创 51nod1764 随机着色

题面题目链接解题思路我们可以通过三组特征值来代表一颗子树,从而消除前效性。第一组是子树大小的奇偶性。第二组是子树左右翻转后是否相同,即从最左端开始染色和从最右端开始染色是否相同。第三组是子树从最左边开始染白色和从最右边开始染黑色是否相同。依据这三组特征值,我们可以代表一颗子树,从而进行转移。复杂度O(64n)。代码#include <cstdio>#include <algorithm>#include <cstring>#include &l

2021-05-28 11:08:36 82

原创 51nod1790 输出二进制数

题面题目链接解题思路dp1[i][j]表示上次选择到j的区间是[i,j],则可以向两个方向转移:1.dp1[i][j+1]表示直接+1到[i,j]这个数字2.dp1[j+1][j+1+j-i],表示将[i,j]输出后的结果,需要注意的是如果s[i,j]比s[j+1,j+1+j-i]大,那么应该向dp1[j+1][j+2+j-i]转移。考虑怎么处理最小操作,我们发现+1操作的次数只会由最终状态决定,因此我们只要记录输出操作的次数即可。本题卡空间,需要空间复用。本人的vs编译器递归爆栈,用st

2021-05-27 21:12:30 144

原创 Atcode120E 1D Party

题面题目链接解题思路我们能够观察出如下性质:1.每个人要么一开始往左,再一直往右,要么一开始往右再一直往左。2.每个人都是在不停的运动。我们可以二分一个时间t,考虑在t时间内相邻的两个人是否都能够碰面一次。我们发现每个人只会有两种策略,考虑使用dp消除两种策略的前效性。dp1[i]表示在t时刻,第i个人先向左i-1碰面后往右能够到达的最远位置。dp2[i]表示第i个人在t时刻和i-1碰面且一开始能够向右走dp2[i]的时间。转移即可。复杂度O(nlogn)。代码#include

2021-05-27 00:04:50 1253 4

原创 51nod1726 构造回文串

题面题目链接解题思路考虑令dp[t][i][j]表示处理到了长度为t的回文串,表示左边取到第i - 1个字符,右边取到第j + 1个字符的方案数。考虑转移1.s[i] == s[j]:dp[t + 1][i][j] += 25 * dp[t][i][j]dp[t+1][i + 1][j - 1] += dp[t][i][j]2.s[i] != s[j]:dp[t+1][i][j] += 24 * dp[t][i][j]dp[t+1][i + 1][j] += dp[t][i][j]d

2021-05-25 17:37:05 172 1

原创 D.Interval

题面无。 类似51nod、博客链接。解题思路这种题目本质上先获得维护确定区间的方法,然后利用一种奇怪的方式扩展到任意子区间。令ans[l,r]表示把[l,r]区间并起来的结果我们先考虑对于确定的询问[l,r],ans[l,r]如何求解。我们可以枚举r然后维护这样的一个数组,∑i=lrres[i]\sum_{i=l}^rres[i]∑i=lr​res[i]表示[l,r]的答案。其实对于确定的r而言,res[i]表示已经添加了[l+1,r]的区间后,加入l这个区间会获得的增量。考虑使用线段树维护,由于

2021-05-24 22:44:19 307 1

原创 洛谷P7594 五月赛 Clear Up

题目解题思路首先,一次的打击是一个以中心点位置和高度为关键信息的直角三角形。观察发现,如果两次打击影响范围相交,则合并更优。如果包含,则删除被包含的打击。用类似单调栈的维护即可。代码#include <cstdio>#include <algorithm>#include <cstring>using namespace std;void read(int &x) { x = 0; char c = getchar(); while (

2021-05-10 18:24:07 175 3

原创 洛谷P4135 作诗

题目题目链接解题思路考虑使用分块。使用res[i][j]表示完整考虑第i个块到第j个块的答案。对于每个询问l,r,我们只要其最近的块的答案,左右只可能多余两个不完整块。考虑不完整块对答案的影响即可。复杂度O(nn)O(n\sqrt{n})O(nn​)。代码#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int N = 1e5 +

2021-04-08 21:43:17 88 2

原创 CF1045G AI robots

题面题目链接解题思路如果两个人i,j能够相互看到,我们不妨令x[i]<x[j],用j去统计i。考虑离线的维护,我们扫描距离,当到x[i]时,将这个点插入,到x[i]+r[r]时,将其删除。当统计到i时,我们知道此时数据结构里的都是能够看到i的,我们要询问数据结构内有多少个j,q[i] - k <= q[j] <= q[i] + k,且x[i]-r[i]<=x[j]<=x[i]。用树套树维护即可。复杂度O(nlog2n)O(nlog^2n)O(nlog2n)。代码

2021-04-08 11:16:12 133 2

原创 洛谷P7480 四月赛 Reboot from Blue

题目题目链接解题思路首先油价是大于0的,油箱是无限的。因此我们不会从油价低的地方到油价高的地方去加油。我们可以根据每个地方油价的从高到低依次更新。考虑某次到达点t后,其油价是v,那么对另一点s的贡献是v*abs(t-s)。这是两条直线。考虑到我们是动态的确定点,并添加直线,因此维护下凸壳即可。使用线段添加的李超树,复杂度O(nlogn)O(nlogn)O(nlogn)。代码#include <cstdio>#include <algorithm>#include

2021-04-05 20:25:19 527 1

原创 USACO21Open Plantinum题解

讲一下大致思路,代码赛后贴。1 Unite Cows of Farmer John简单的权值线段树练手题,考虑枚举r,每个点l维护以[l,r]为区间,中间还能够选择的个数。那么需要三种操作:1.将某个位置删除2.区间加3.区间求和用权值线段树简单维护即可,复杂度O(nlogn)O(nlogn)O(nlogn)。2 Routing Schemesk=2时,令dp[i][j]表示一个点走到i,第二个点走到j,其余路径都合法的方案数。我们枚举两个路径走到反向边的起点。当然,原图不具有很好的dp性质

2021-04-04 23:54:01 341 1

原创 51nod2117 Meatycake

题目题目链接解题思路首先,将询问固定到一个确定区间。可以用树状数组来简单解决。具体的来说,我们从[1,n]枚举r,树状数组的query(l)表示区间[l,r]的答案,这是可以简单维护的。进一步的,我们将询问[l,r]增大到区间[l,l],[l,l+1]…[l,r]这些前缀区间,我们可以增加一个时间维度,即用两个树状数组来维护。再进一步,我们将询问增大到现有问题。我只只要再加一维距离维度,就可以用四个树状数组简单维护了。复杂度O(nlog2n)O(nlog_2n)O(nlog2​n)。跑的飞快。

2021-04-01 11:08:59 137

原创 51nod1360 K-序列

题目题目链接解题思路S(n)={n,(0<=n<K)∑i=0K−1bi∗an%K∗S((⌊nK⌋)−1)∗K+i),n>=KS(n)= \left\{ \begin{array} {lc} n, (0<=n<K) \\ \sum_{i=0}^{K-1}b_i*a_{n\%K}*S((\lfloor\frac{n}{K}\rfloor)-1) * K+i),n>=K \end{array} \right.S(n)={n,(0<=n<K)∑i=0K−1​

2021-03-31 21:51:40 76

原创 51nod1336 RMQ逆问题

题目题目链接解题思路首先将区间离散化,求每一块区间的最大值。对于出现过的值,只能出现在所有存在区间的交集中,且只能存在于交集中最大值比它要大的区间。对于没有出现过的值,能像所有区间最大值大小比他小的区间存放。如此就是个匹配问题,看二分图是否慢流即可。如果加上线段树建图优化,m可能可以出到100000。代码#include <cstdio>#include <algorithm>#include <cstring>#include <vect

2021-03-31 12:14:45 93

原创 51nod1488 帕斯卡小三角形

题目题目链接解题思路首先有一个关键性质:我们一定是从某个点开始一直往下走,然后一直往右下走。从(1,i)(1,i)(1,i)走到(x,y)(x,y)(x,y)的代价是sum[y]−sum[i]+(x−y+i)∗a[i]sum[y]-sum[i]+(x-y+i)*a[i]sum[y]−sum[i]+(x−y+i)∗a[i]。由于查询的是整点,我们直接使用李超树维护下凸壳即可。代码#include <cstdio>#include <algorithm>#includ

2021-03-31 00:50:09 1307 2

原创 51nod1511 与或式

题目题目链接解题思路首先,一个变量只会至多出现两次。我们将只出现一次的和只出现一种的看作自环,将本身和它的非都出现的看成边,我们发现一个无环连通块是不合法的。用并查集维护连通块的大小和边数即可,当连通块边数不小于点数时,必定有环。复杂度O(n+m)O(n+m)O(n+m)。代码#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using na

2021-03-26 11:11:10 88 1

原创 51nod1547 塔瓦斯路径

题目题目链接解题思路使用树链剖分和离线。按照权值大小不断添加边,将边权转化成点权,用线段树维护区间值。复杂度O(nlog22n)O(nlog_2^2n)O(nlog22​n)。代码#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;typedef long long ll;void read(int

2021-03-25 23:14:12 133 3

原创 若干简单题

目录不重复的子段数量方格染色共线k-element3和5和好数过河k次方和不重复的子段数量问题 给你一个由小写字符组成字符串,问由多少连续子串没有重复字符。解法一枚举右端点,因为只由26个小写字母组成,所以可能合法的左端点只有26个,一次判断即可。复杂度O(26n)。解法二令f(r)f(r)f(r)表示r对应的最小且合法的左端点。我们发现有性质f(r)<=f(r+1)f(r) <= f(r + 1)f(r)<=f(r+1)。因此,左右端点各扫描一次,复杂度O(n)。核心

2021-03-25 10:49:27 168

原创 51nod2614 小b爱旅行

题面题目链接解题思路先不考虑删边,我们能够观察到如下重要的性质:1.做出图的生成树,则任意一条路径可以由生成树的上路径异或上若干环组成。2.一条路径可以并上任何一个环,即使不相邻。 因为我们可以直接走到那个环,走一圈然后原路返回。因为异或性质,中间路径被消除了。我们可以将环的权值扔进线性基里,1到任何一点的距离去和线性基求答案。我们可以用线性基将一个距离削成最小表示。如果两个距离的最小表示相同,则他们通过线性基构成的东西也相同。则答案是 最小表示不同的距离个数 * 2^(线性基的大小)。考

2021-03-24 22:10:50 142 3

原创 51nod1725 程序监控

题面题目链接解题思路首先,应排除若干输入不合法的情况。其次,考虑使用区间dpdpdp。设dp[l][r]dp[l][r]dp[l][r]表示区间[l,r][l,r][l,r]的点组成了若干森林,且森林的根呈递增关系。以如下两种方式不重不漏的转移:1.区间[l,r][l,r][l,r]构成一棵树,则有dp[l][r]+=dp[l+1][r]dp[l][r]+=dp[l+1][r]dp[l][r]+=dp[l+1][r]。2.区间[l,r][l,r][l,r]构成一棵树构成若干森林,每次给区间在

2021-03-23 22:25:19 83 3

原创 51nod1702 卡牌游戏

题面题目链接解题思路最朴素的想法是将图建出来跑最短路。观察后发现如下两条性质:1.边权是1,可以用广度优先搜索代替最短路。2.因为是广度优先搜索,每条边只会被松弛一次。但是图的大小可能是n2n^2n2级别的。我们考虑使用线段树维护隐式图来支持搜索。复杂度O(nlog2n)O(nlog_2n)O(nlog2​n)。代码#include <cstdio>#include <algorithm>#include <cstring>#include &

2021-03-23 10:50:19 126 3

原创 51nod1664 电子阅读显示器

题目题目链接解题思路不考虑顺序的话,最优解是唯一的。我们首先观察点(1,n),只会被一个点对影响,处理完它后(2,n)和(1,n-1)都只被一个点对影响。当一个点只被一个点对影响时,我们很容易的知道这个点对选和不选了。复杂度O(n2)O(n^2)O(n2)。代码#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int N = 2e3

2021-03-22 21:16:17 107 4

原创 51nod1783 取格子

题目题目链接解题思路设dp[i]表示前一列取到从下往上数第i个格子方案数。我们发现dp数组是个二值函数。即当1<=i<=id1<=i<=id1<=i<=id时,dp[i]=xdp[i]=xdp[i]=x,当id+1<=i<=h[i−1]id+1<=i<=h[i - 1]id+1<=i<=h[i−1]时,dp[i]=1dp[i]=1dp[i]=1。记录这个二值点,及其权值,转移即可。复杂度O(n)。代码#include &l

2021-03-21 23:51:03 86 2

原创 51nod1660 二进制分解

题目[题目链接](http://www.51nod.com/Challenge/Problem.html#problemId=1660)解题思路使用动态规划解决该问题。dp[i][0]dp[i][0]dp[i][0]表示前i个数都匹配上的最小代价。dp[i][1]dp[i][1]dp[i][1]表示前i个数都匹配上除了最后还需要减−ai-a_i−ai​来产生1。转移即可。复杂度O(n)。代码#include <cstdio>#include <algorithm&gt

2021-03-20 15:22:11 151 2

原创 51nod1687 方差求和

解题思路简化公式∑i=1n(ai−aˉ)2=∑i=1n(ai2−2aiaˉ+aˉ2)=∑i=1nai2−2aˉ∑i=1nai+naˉ2=∑i=1nai2−2naˉ2+naˉ2=∑i=1nai2−naˉ2\sum_{i=1}^n(a_i-\bar a)^2\\=\sum_{i=1}^n(a_i^2-2a_i\bar a+\bar a^2)\\=\sum_{i=1}^na_i^2-2\bar a\sum_{i=1}^nai+n\bar a^2\\=\sum_{i=1}^na_i^2-2n\bar a^2+n

2021-03-19 12:58:18 946

原创 51nod2940 交换棋子

题目题目链接解题思路使用费用流算法解决此题。首先如果始末状态黑子数量不等肯定无解。如果两个子的路径有交叉,可以通过调整移动顺序避免实际的碰撞。将棋盘上的每个点拆成三个点,中间点代表到达了当前点,以此来满足交换次数的上限。我们向以源点向起始状态每个黑子的中间点连一条流量1,费用0的边。以终止状态黑子的中间点向汇点连流量1,费用0的边。最后相邻点连容量INF,费用1的边。跑费用流即可。代码#include <cstdio>#include <algorithm>

2021-03-18 16:51:08 2100 1

空空如也

空空如也

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

TA关注的人

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