自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zhendong

天下事以难而废者十之一,以惰而废者十之九

  • 博客(40)
  • 资源 (15)
  • 收藏
  • 关注

原创 信息学算法竞赛中一种特殊的数据读入方式

数据的输入输出流,操作的对象是string。在算法竞赛中,有时会出现一些特殊的数据读入,比如每行的数据元素个数不确定,更复杂一些的是连续多行的数据个数不确定。读入完整的一行,该函数会把换行符读进来,但是保存的时候不会保存换行符。需要注意一点的是,如果使用该函数的时候,前面有换行,应该用。每行的末尾是换行符号"\n",可以判断是否读到该字符作为该行读入完毕的依据。有n行数据,每行数据个数不等,输出每行数据的平均值。中读取数据存到变量中,返回值是成功读取的数据个数。中,返回值是成功输出的数据个数。

2023-05-18 16:33:55 753

原创 NOIP2010普及组复赛 解题分析

1.数字统计算法分析剥数。#include <iostream>#include <cstdio>#include <cstring>#include <string>#define ll long longusing namespace std;int main(){ int l, r; scanf("%d%d", &l, &r); int ans = 0; for (int i = l; i <= r; +

2022-04-28 18:24:26 504

原创 NOIP2011普及组复赛 解题分析

1.数字反转算法分析反转后需要考虑前导0。重新组数就可以规避这个问题。就是剥数和组数的过程。#include <iostream>#include <cstdio>#include <cstring>#define ll long longusing namespace std;int main(){ int n; scanf("%d", &n); if (n < 0) { n = -n; printf("-"); }

2022-04-28 12:56:08 628

原创 NOIP2012普及组复赛 解题分析

1.质因数分解算法分析nnn是两个不同的质数的乘积,如果求出较小的那个,也就求出较大的那个了。较小的那个小于根号nnn。枚举法。#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#define ll long long using namespace std;int isprime(int n){ int i = 2, t = sqrt(n); w

2022-04-28 12:44:34 523

原创 NOIP2013普及组复赛 解题分析

1.计数问题算法分析剥数。#include <iostream>#include <cstdio>#include <cstring>#define ll long longusing namespace std;int main() // 剥数 { int n, x; scanf("%d%d", &n, &x); int sum = 0; for (int i = 1; i <= n; ++i) { int t =

2022-04-27 15:36:36 1030 1

原创 NOIP2014普及组复赛 解题分析

1.珠心算测试算法分析有人可能会误读题意。题意说的是,有多少个数,能够由集合中的另外两个数构成。不是说集合中的数a、b、c,由多少对能组成等式“a + b = c”。下面数据:51 2 3 4 5输出的是3,不是4。枚举每一个数,然后再枚举集合中的数,判断能否构成,一旦找到break退出。#include <iostream>#include <cstdio>#include <cmath>#include <cstdlib>using

2022-04-26 16:32:18 742

原创 NOIP2015普及组复赛 解题分析

1.金币算法分析直接模拟。#include <iostream>#include <cstdio>#include <cstring>using namespace std;int main(){ int i=1,sum=0,ans=0,n; scanf("%d",&n); while(1) { sum+=i; // sum是天数 if(sum>n) break; ans+=i*i; ++i; } ans+=

2022-04-24 17:02:30 1742

原创 NOIP2016普及组复赛 解题分析

1.买铅笔算法分析不能整除则加1。#include <iostream>#include <cstdio>#include <cstring>#define ll long longusing namespace std;int main(){ int n; scanf("%d", &n); int snum, sprice; int ans = 1e8, t; for (int i = 1; i <= 3; ++i) { s

2022-04-24 16:02:00 632

原创 NOIP2017普及组复赛 解题分析

1.成绩算法分析据说这题当年官方评测时也闹出过乌龙。小数会产生异变,比如以下代码:inta=80∗0.2int \quad a = 80 * 0.2inta=80∗0.2赋值号右侧是实数,最后结果可能会为16.000001或15.999999,赋值给aaa的话,aaa的值可能是16或15,产生错误。解决方法:化乘为除(A,B,C 都是 10的整数倍),或定义为doubledoubledouble,最后结果保留0位输出。#include <iostream>#include <c

2022-04-24 11:15:09 1685

原创 NOIP2018普及组复赛 解题分析

1.标题统计算法分析由于算法竞赛中已经用不了getsgetsgets函数,可以考虑用getchargetchargetchar或stringstringstring。因为字符串有空格,不能用scanfscanfscanf读入,因为scanfscanfscanf读入时遇到空格就停止了。题面说只有一行字符串,但是包括换行符,因此换行符只能是文末换行符。正好用getchargetchargetchar读入时可以判断是否结束。#include <iostream>#include <cst

2022-04-11 18:01:30 1338

原创 CSP-J2019第二轮 解题分析

1.数字游戏算法分析共8个字符,可以用循环读入,也可以用scanfscanfscanf一次性读入。然后判断计数。#include <iostream>#include <cstdio>#include <cstring>#define ll long longusing namespace std;int main(){ char c; int num = 0; for (int i = 1; i <= 8; ++i) { cin&gt

2022-04-11 12:02:37 1954 1

原创 CSP-J2020第二轮 解题分析

1.优秀的拆分算法分析奇数不存在优秀的拆分。偶数一定存在优秀的拆分。从大到小枚举2的iii次方,从24到1。如果nnn能被2i2^i2i整除,说明2i2^i2i是他的一个拆分项,输出。2i2^i2i可以表示为1<<i1<<i1<<i。#include <iostream>#include <cstdio>#include <cstring>using namespace std;int main(){ int n; s

2022-03-29 18:32:11 2289

原创 CSP-J2021第二轮 解题分析

1.分糖果算法分析糖果总数k属于[l,r][l, r][l,r],其中l>=nl >= nl>=n,每个小朋友最少会分到⌊l/n⌋\lfloor l / n \rfloor⌊l/n⌋块糖果。分完这⌊l/n⌋\lfloor l / n \rfloor⌊l/n⌋块糖果后,还剩余[l−n∗⌊l/n⌋,r−n∗⌊l/n⌋][l - n * \lfloor l / n \rfloor, r - n * \lfloor l / n \rfloor][l−n∗⌊l/n⌋,r−n∗⌊l/n⌋]

2022-03-22 20:22:54 2656

原创 基础博弈练习题 建树问题

题目链接:基础博弈练习题算法分析主要解释建树问题。对于最后一列来说,如果该列是奇数,谁先走到该列必胜。那么该列往前倒推mmm列是必败的。如果最后一列是偶数,那么谁先走到该列必败。倒数第二列如果是奇数,则谁先走到该列必胜。以此类推。以上是以整个区间[1,n][1, n][1,n]为例来说明的。可以得出,对于全部区间,所有的偶数都是必败点,一部分奇数是必败点,必胜点一定是奇数。但是对于同一个奇数,如果区间右端点不同,则胜败情况需要讨论。假如m=3m=3m=3,最后一列和倒数第二列是奇数,对于[1,n][

2022-02-28 20:41:01 178

原创 2021统一省选 A卷 day1解析

题面,就参照洛谷的吧。卡牌游戏矩阵游戏图函数现在官方数据没出来,所以下面解析不能保证结果正确性。重点看思维过程。卡牌游戏爆搜的话,过前两个点没问题。枚举要翻牌的数量m,然后从n张中翻m张,直接统计最大最小值。考虑到卡牌是按照正面数值由小到大排序的,从结果出发,设最大值为maxn,最小值为minn,那么正面数值在这个区域的,是不用翻牌的。对于正面来说,假设最小值minn的下标为i,最大值maxn的下标为j。如下:那么区间[i,j]是不需要翻牌的。区间[1,i-1]和[j+1,n]

2021-04-13 17:16:06 207

原创 扫描线 窗内的星星

题目链接:248. 窗内的星星算法分析经过亚特兰蒂斯 那题的洗礼,这道扫描线题目就显得简单多了。但是很多细节还是得注意。这里只说细节。1.边框上的星星不算怎么处理。如下图:左下角的星星坐标为(x,y)(x,y)(x,y),如果边框上的星星算的话,那么整个蓝色区域都可以放置边框的右上角顶点。如果不算的话,因为星星的坐标都是整数,边框的宽高也是整数,所以可放置的区域范围大致如上图绿色,在绿色区域中放置边框的右上角顶点,该星星肯定能被包含在内。假设就这一颗星星,为了方便计算,可以考虑将星星和区域整体向

2021-04-07 18:00:46 154

原创 扫描线 亚特兰蒂斯

题目链接:247. 亚特兰蒂斯算法分析只说细节。这道题目不是特别严格的线段树,因为线段树维护的信息具有区间可合并性,这道题目想了很久想不出可以区间直接合并的信息。我们在这里维护的是离散化后表示小段的数组,设为a[]a[]a[]吧,对于一个边界的两个纵坐标,设为y1y1y1和y2y2y2,离散化后的结果为[al,ar][al,ar][al,ar],这是点,如果要对应到小段,那么则是[al,ar−1][al,ar-1][al,ar−1]。在每个区间结点上,设cnt表示该区间被完整扫过的次数,这里强调下,

2021-04-03 19:31:22 184

原创 255. 第K小数

题目链接:255. 第K小数算法分析据说这道题可以用来练习多种高级数据结构,本题是用可持久化线段树解的。算法分析可参考进阶指南。需要注意的是:线段树的空间开销。离散化后,取值区间最大为[1,n]。这是值域。在值域上建立初始线段树,因为不是按照层次编号,所以开销为2∗n2*n2∗n。后面nnn个数字分别插进去,建可持久化树,每次开销为lognlognlogn,共nnn次。nnn最大为100000,所以空间总开销2∗n+18∗n=20n2*n+18*n=20n2∗n+18∗n=20n足矣。时间开

2021-03-31 20:08:37 226

原创 250. 磁力块

题目链接:250. 磁力块算法分析先按照质量排序,然后分块,在每块内再按照距离排序。每块大小n\sqrt nn​。计算出一个k,满足[1,k]块内的每个磁石的质量都小于等于队头的磁石的磁力。最坏的情况下,会换nnn次磁石,总共会有nnn块磁石入队,因此均摊时间复杂度是O(1),暴力计算第k+1k+1k+1块的时候,复杂度是O(n)O(\sqrt n)O(n​)。因此,总复杂度是O(n∗n)O(n*\sqrt n)O(n∗n​)。在计算kkk的时候,可以优化。存下每块内磁石的最大质量,因为之前是排序的,

2021-03-30 19:29:56 603

原创 249. 蒲公英

题目链接:249. 蒲公英算法分析进阶指南上算法描述已经很清晰了。这里是用vector维护的每个数在序列中出现的下标。假设总共T块,预处理出每两个块之间的最小众数,需要时间O(nT)。m个查询小块内每个数的出现次数为O(mn/T*logn),总体时间复杂度为两者之和。根据均值不等式,如果时间复杂度最低,应满足nT=mn/TlognnT=mn/TlognnT=mn/Tlogn,求得T=nlognT=\sqrt {nlogn}T=nlogn​,这里面n<=40000,求得T约等于52。因此:blo

2021-03-23 17:40:31 187

原创 小Z的袜子

题目链接:251. 小Z的袜子算法分析这道题目是典型的离线分块问题。由于只有询问,没有修改,我们可以将询问进行分块。先按照左端点进行排序,然后分成n\sqrt nn​块,在每一块内,再按照右端点由小到大排序。这里的分块指的是对应到原始的序列上分块,询问对应到不同的块内。第一个询问可以暴力求出,之后的每个询问都在它前面的询问基础上修改。对于每个块内,是按照右端点由小到大排序的,左端点多出一部分或者少一部分,但是不会超过n\sqrt nn​,一个块内的询问最多是n\sqrt nn​,所有的右端点因为是单调

2021-03-18 19:22:32 81

原创 分块

分块入门hzwer 分块分块扩展:莫队题目参考上面博客中的题目。文章比较系统,有入门有扩展,所附题目质量高。

2021-03-09 17:01:38 47

原创 235. 魔法珠

题目链接:235. 魔法珠算法分析有明显的sg函数特征,因为每堆有数字,可以入sg函数的下标。类似于尼姆博弈的取石子。双人、相同规则、必胜或必败,符合公平组合游戏规则。可以用sg函数。有nnn堆魔法珠,这是有向图游戏和的问题,需要求出来单堆的sg函数,最后异或和即可。所以,需要预处理出[1,1000][1,1000][1,1000]的sg函数。明显地,sg[1]=0sg[1] =0sg[1]=0是边界。对于任意的数量r,假设其约数有t1、t2、t3三个。因为要随机消掉一堆,所以r的后继状态总共有三个

2021-03-05 19:29:06 124

原创 P4101 人人尽说江南好

题目链接:P4101 人人尽说江南好算法分析无论怎么操作,最终合并的次数为奇数,则先手胜,否则先手败。先假设一种合并方案,双方尽量合并成mmm,然后再从1开始合并。这样总共的合并次数为:cnt=n/m∗(m−1)+(n%m)?(n%m−1):0cnt = n/m*(m-1)+(n \% m)?(n\% m-1):0cnt=n/m∗(m−1)+(n%m)?(n%m−1):0。我们称此为套路。如果此时cnt为奇数,我们知道先手胜。先手必胜,肯定会按照套路走,如果后手不按照套路出牌呢?讨论下:最大堆石子数

2021-03-04 16:36:12 344 1

原创 常用工具

画图:https://www.processon.com/diagrams代码高亮显示:http://www.planetb.ca/syntax-highlight-word

2021-03-04 12:05:04 108 1

原创 P5652 基础博弈练习题

题目链接:P5652 基础博弈练习题算法分析题目很有思考价值。博弈论的题目大多需要绕来绕去。题意中,如果一方走到了iii,那么另一方只能在区间[i,max(i+m,n)][i, max(i+m,n)][i,max(i+m,n)]之间走。假设序列b长度为1,此时该列为偶数的话,先手必胜;否则,先手必败。如果序列b长度为2,很容易想到,假设最后一列长度为奇数,谁先走到最后一列,谁胜;如果最后一列长度为偶数,谁先走到最后一列,谁败。依次类推,我们需要考虑最后一列的奇偶性。用必胜态和必败态进行描述,指的都是

2021-03-04 11:57:57 153 1

原创 SG函数

阅读本篇,先看这篇,里面介绍了博弈论的几种模型,并引出了SG函数。本篇主要对SG函数的应用做说明。四种基本的博弈模型:1.巴什博弈定义: 一堆nnn个物品,两个人轮流从中取出不多于mmm个,最后取光者胜,不能继续取的人输。结论: 若nmod  (m+1)!=0n\mod (m+1) != 0nmod(m+1)!=0,则先手必胜;反之,先手必输。2.尼姆博弈定义: nnn堆物品,每堆物品的个数任意,两人轮流取,每次取某堆中不少于1个,最后取完者胜。结论: 将每堆物品的数量全部异或起来,若值为0,

2021-03-02 11:10:49 420 1

原创 BSGS与扩展BSGS

线性同余方程bx≡1(mod p)bx\equiv1(mod \,p)bx≡1(modp),可以用exgcd或者费马小定理解出。但对于高次同余方程ax≡b(mod p)a^x\equiv b(mod \,p)ax≡b(modp),需要用BSGS或者扩展BSGS解出。BSGS问题描述:对于整数a,b,p,其中a,p互质,求一个最小的非负整数x,满足ax≡b(mod p)a^x\equiv b(mod \,p)ax≡b(modp)。BSGS是Baby Step,Giant Step的缩写,又叫大小步算法。

2021-02-20 17:29:12 176

原创 休息时间

算法分析:环形问题,先考虑线性。这种一维上的dp,我们一般设状态f[i][j]f[i][j]f[i][j]表示规划了前iii个阶段,睡了jjj个小时,且第i个小时是睡着的,恢复的最大体力值。则很容易写出如下方程:f[i][j]=max{f[j][s]+d}f[i][j] = max\{f[j][s] + d\}f[i][j]=max{f[j][s]+d}j是枚举量,s是枚举量,d是[s+1,i]这段的情况,有可能前半段睡着,后面醒了,或者前面醒了,后面又睡着,等复杂情况。这个状态不太可行。应该增加维度

2021-01-24 22:04:48 139 1

原创 坏掉的机器人

算法分析:有后效性dp。dp方程很好推,但是状态之间有后效性,需要用高斯消元同时求出各个状态。裸的高斯消元时间复杂度为O(m2)O(m^2)O(m2),超时。仔细观察,每行数据只有2到3个非0,因此不需要套模板,直接消掉就可以。原先的矩阵类似如下,x是占位符,非0。z是常数。[xx00000zxxx0000z0xxx000z00xxx00z000xxx0z0000xxxz00000xxz]\begin{bmatrix}x & x & 0 & 0 & 0 &

2021-01-24 20:20:02 29062

原创 高斯消元法

在数学模块,我们将学习矩阵相关知识,主要是矩阵乘法、高斯消元、线性空间。高斯消元也可以与其他知识点结合起来,比如dp。坏掉的机器人这道题目就是dp套高斯消元。高斯消元的思路参考进阶指南。主要目的是将矩阵通过初等行变换最后转化为简化阶梯型矩阵。系数和常数构成n∗(n+1)n*(n+1)n∗(n+1)的增广矩阵。有三种特殊情况:最后有n个主元。那么解唯一。有k个主元,自由元n-k。解无限多。存在0=d0=d0=d这种形式。无解。下面举四个例题。洛谷:P3389 【模板】高斯消元法#inclu

2021-01-21 18:33:25 680

转载 Markdown 中 LaTex 数学公式命令

原文地址如下:https://www.jianshu.com/p/0ea47ae02262

2021-01-17 14:25:08 123

原创 树形dp

题目链接:选课积蓄程度算法分析:这两道题目,选课是经典的树上背包问题,是分组背包的树上模型。积蓄程度是不定根树形dp问题。书上介绍地很详细。这里主要介绍下代码中的注意事项。#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;int n, m, f[310][31

2021-01-17 13:39:14 79

原创 284. 金字塔

算法分析:对于一棵树,其dfs序是固定序列,这个序列和树是对应的。因此,树的不少问题,都可以转化为序列求解。本题基本思路是这样的。f[i][j]f[i][j]f[i][j]表示区间[i,j][i,j][i,j]构成的子树的不同结构数。这个状态只有在满足s[i]=s[j]s[i]=s[j]s[i]=s[j]的时候,才可能有意义,否则为0。枚举断点kkk,f[i][j]=f[i][j]+f[i+1][k−1]∗f[k][j]f[i][j] = f[i][j] + f[i+1][k-1] * f[k][j]

2021-01-15 14:13:19 91

原创 283. 多边形

算法分析:初看起来,就是简单的区间dp,于是很顺利打出来,结果有些点过不了。百思不得其解。下面是初始代码。#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;int n, dotval[110], f[110][110];char edgval[110];int

2021-01-14 19:49:35 80

原创 281. 硬币

多重背包:281. 硬币题目链接:硬币**算法分析:初看起来就是个简单的分组背包,CiC_iCi​不大于1000,二进制拆分最多拆出10个数,这样时间复杂度在10810^8108,勉强。提交后,数据强,超时。以下是标准二进制拆分超时代码。#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using na

2021-01-13 20:02:32 76 1

原创 背包方案数

背包方案数主要有两类问题。货币组成方案。有若干种面值的货币,问在一定范围内,能组成不同面值,有多少种方案。可以是01背包,或者完全背包。最优解的方案数。问题背景是01背包,问最优解的方案数。下面分别用两道例题来说明。数字组合算法分析:01背包的思路。f[i][j]f[i][j]f[i][j]表示规划到了第i个数字,他们的总和为j的方案数。这是恰的定义方式。对于第i个数字,可取可不取。f[i][j]=f[i−1][j]+f[i−1][j−a[i]]f[i][j] = f[i-1][j]

2021-01-13 12:18:46 165

原创 线性dp

dp 进阶指南例题 acwing线性dp271. 杨老师的照相排列线性dp271. 杨老师的照相排列算法分析:k<=5,暗示可以将每一排作为维度。k不满5的,按照0处理。因此,可以用f[a][b][c][d][e]表示第一排到第五排分别安排了a、b、c、d、e个人的方案数。1只能安排在第一排第一列,作为边界:f[1][0][0][0][0] = 1 。学生身高按照高低排序过了。状态转移从第2个人开始。考虑将第2个人放在什么位置。对于第一排,如果没有放满,可以放。对于其余排,如果没有放慢,而且

2020-12-27 17:31:38 120

原创 166. 数独

166. 数独题目链接:166. 数独算法分析:数独,大搜索。#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;int hang[12], lie[12], sd[5][5];struct node{ int x, y;};node res[90];int Map[12][12], tot, t

2020-12-20 17:25:38 85

原创 IDA*

181. 回转游戏题目链接:回转游戏思路:要保证估价函数小于等于未来实际值,只能以最理性状态分析。对于每个状态的中间8个格子,假设出现次数最多的数字为k,其余非k的数字要变成k,最少需要操作8 - k次。未来实际值不会少于这个次数。#include <iostream>#include <cstdio>#include <cstring>using namespace std;int b[8][8], d[25], szmove[1000010];int

2020-12-20 16:47:03 84

noip提高组模拟题9sz

我常用的题,大佬出题,有数据、标程。内容涵盖数论、图论、dp、搜索等,很全面。

2018-11-12

noip提高组模拟题8sz

我常用的题,大佬出题,有数据、标程。内容涵盖数论、图论、dp、搜索等,很全面。

2018-11-12

noip提高组模拟题7sz

我常用的题,大佬出题,有数据、标程。内容涵盖数论、图论、dp、搜索等,很全面。

2018-11-12

noip提高组模拟题5sz

我常用的题,大佬出题,有数据、标程。内容涵盖数论、图论、dp、搜索等,很全面。

2018-11-12

noip提高组模拟题4sz

我常用的题,大佬出题,有数据、标程。内容涵盖数论、图论、dp、搜索等,很全面。

2018-11-12

noip提高组模拟题6sz

我常用的题,大佬出题,有数据、标程。内容涵盖数论、图论、dp、搜索等,很全面。

2018-10-24

noip提高组模拟题3sz

我常用的题,大佬出题,有数据、标程。内容涵盖数论、图论、dp、搜索等,很全面。

2018-10-24

noip提高组模拟题2sz

我常用的题,大佬出题,有数据、标程。内容涵盖数论、图论、dp、搜索等,很全面。

2018-10-24

noip提高组模拟题1sz

我常用的题,大佬出题,有数据、标程。内容涵盖数论、图论、dp、搜索等,很全面。

2018-10-24

noip模拟题2 含数据、题解、标程 sz

非常好的noip提高组模拟题,含数据,标程、题解。出自某著名机构。

2018-10-10

noip 模拟题1 含数据 题解 标程 sz

某著名noi培训机构**学堂模拟题,题目质量很好,有题面、数据、标程、题解。强烈推荐。

2018-10-10

noip讲义 提高组 很实用

某著名oj的noip提高组讲义 内容非常全 对于知识点处理的详略得当

2018-10-10

noip普及组模拟试题

noip模拟题,试题质量很好。因为要换取金币,所以拿出来分享。适合普及组dfs后使用,作为阶段性练习用。

2018-10-02

noip 普及组 试题 含数据

noip 普及组 试题 含数据 普及组使用。文件夹中有pdf文档,是试题,data文件是测试数据。

2018-10-02

flash常用脚本

flash常用脚本,里面有搜集的各种方法文档,适合初学者.

2013-04-14

空空如也

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

TA关注的人

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