- 博客(54)
- 资源 (2)
- 收藏
- 关注
原创 关于《C++中的随机数生成器指南》
Don't use rand(): a guide to random number generators in C++
2022-10-21 19:38:41
470
翻译 不要使用rand():C++中的随机数生成器指南
Don't use rand(): a guide to random number generators in C++不要使用rand():C++中的随机数生成器指南
2022-10-21 16:25:16
1878
原创 CF1490F Equalize the Array
CF1490F Equalize the Array 洛谷:普及/提高− Codeforces:1500
2022-08-03 15:32:50
167
原创 CF1574B Combinatorics Homework
CF1574B Combinatorics Homework 洛谷:暂无评定 Codeforces:1100
2022-08-02 16:50:35
217
原创 CF1556B Take Your Places!
CF1556B Take Your Places! 洛谷:普及− Codeforces:1300
2022-08-01 11:07:57
190
原创 CF784D Touchy-Feely Palindromes
这在 CF 上是 April Fools Contest 题目,所以我怀疑 1900 的题目难度也是 fool (
2022-07-30 16:29:33
203
原创 封装矩阵结构体
struct matrix{ int n,m; int a[MAXN][MAXN]; matrix(int x,int y) { n=x; m=y; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=0; } int *operator[](int i) { return a[i]; } void init() { for(int i=1;i<=n;i++) a[i][i]=
2022-03-06 11:34:55
378
1
原创 关于CSP2021
今年(2021年),CCF发布了 NOI Linux 2.0 以及 关于NOI系列活动中编程语言使用限制的补充说明 ,将NOI系列比赛的标准进行了改动。
2021-10-21 11:42:10
2015
6
原创 常见时间复杂度
一、基础算法快速排序 O(nlogn)O(n\log n)O(nlogn)归并排序 O(nlogn)O(n\log n)O(nlogn)桶排序 O(n)O(n)O(n)二分 O(logn)O(\log n)O(logn)(一般情况下)倍增 O(logn)O(\log n)O(logn)DFS\text{DFS}DFS算法 一般为指数级二、字符串算法KMP\text{KMP}KMP O(m+n)O(m+n)O(m+n)Trie\text{Trie}Trie树 插入O(lens),查询
2021-10-18 18:38:41
148
原创 模拟退火详解
写在前面你有没有写不出正解而被迫写rand的经历?你有没有提交rand数十次却每次都在二三十分上下浮动?你有没有在提交一份rand代码之前净身更衣焚香?如果是,那么,这款模拟退火正适合你!本店开业活动为期一周,模拟退火买一送一,货到付款,逾期不候!(((模拟退火模拟退火究竟是什么呢?退火是一种金属热处理工艺,指的是将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度冷却。目的是降低硬度,改善切削加工性;降低残余应力,稳定尺寸,减少变形与裂纹倾向;细化晶粒,调整组织,消除组织缺陷。准确的说
2021-10-14 09:31:27
1462
2
原创 动态开点线段树
前置芝士线段树引入在普通的线段树中,我们一般要开 4N4N4N 的数组以避免越界。然而,在一些题目中,空间限制并不允许我们这样做。这个时候,就需要使用动态开点线段树。动态开点线段树我们来观察一下普通线段树的左儿子和右儿子的表示方法:左儿子:p<<1右儿子:p<<1|1这样,虽然我们可以直接算出左右儿子,比较方便,但是,这样也浪费了大量的空间。在学习二叉树的时候,二叉树还有哪种存储方法呢?链式储存法,即对一个节点建立左右儿子指针,指向它的左右儿子。这样,建立新节点时
2021-10-09 16:51:07
3818
3
原创 扩展欧几里得算法(exgcd)
前置知识数论基本概念裴蜀定理在学习exgcd之前,我们需要先学习一下裴蜀定理。裴蜀定理有两条:对于任意的整数 a,ba,ba,b,存在一组整数 x,yx,yx,y,使得 ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)若 a,ba,ba,b 是整数,那么对于任意的整数 x,yx,yx,y,都有 gcd(a,b)∣ax+bygcd(a,b)|ax+bygcd(a,b)∣ax+by第一条比第二条难证,我们先来证明第一条,下面是证明过程,我尽量讲的通俗易懂:
2021-10-04 19:33:22
1265
原创 对拍技巧详解
前置知识随机数引入假设你现在正站在某大型比赛的赛场上,面对着屏幕前的世纪难题大汗淋漓,对正解毫无思路,这时你应该怎么办呢?在这样的情况下,你应该写出一个暴力代码,尝试骗得一部分分数。然而,不甘于平凡的你怎能只获得可怜的20pts20pts20pts呢?你要拿100pts100pts100pts,你要AK,你要勇敢的对€€£说:“拿来吧你”你绞尽脑汁,想到了一个“疑似正解”,这时你要怎么确定它是否是正解呢?为了你的宏图伟业,你就要学习这样一种东西:对拍对拍对拍是干什么用的呢?你写了一
2021-09-17 21:44:10
1650
原创 洛谷 CF1556A 【A Variety of Operations】
题意你有两个数 aaa 和 bbb,初始值均为 000,你可以任选一个整数 kkk,进行以下三种操作中的一种:将 aaa 和 bbb 都加 kkk;将 aaa 加 kkk,将 bbb 减 kkk;将 bbb 加 kkk,将 aaa 减 kkk;对于给定的 ccc 和 ddd,求最少的操作数使得 a=c,b=da=c,b=da=c,b=d,若无法得到,则输出 −1-1−1。分析我们先假设能够使得 a=c,b=da=c,b=da=c,b=d,如果最后一步是操作2或操作3,那么倒数第二步完成后
2021-09-08 09:15:44
177
原创 洛谷 CF1260A 【Heating】
题意我们可以将原题转化为这样一个较为形象的问题:你可以任选 cic_ici 个数,使得它们的和为 sumisum_isumi,求一种方案使得所选的数的平方和最小。分析我们用一些简单的初中数学知识进行推导:设两个数a,b∈(0,+∞)a,b\in(0,+∞)a,b∈(0,+∞)∵(a+b)2=a2+b2+2ab,a>0,b>0∵(a+b)^2=a^2+b^2+2ab,a>0,b>0∵(a+b)2=a2+b2+2ab,a>0,b>0∴a2+b2<(a+
2021-09-08 09:15:02
140
原创 洛谷 CF1551B1 【Wonderful Coloring - 1】
题意将一个字符串的每个字符染色,满足以下条件:每个点或被染成红色,或被染成红色,亦或不被染色同色的任两个字母不相同染成红色的字母数量等于染成绿色的字母数量分析我们来看一下第二条和第三条。这表示了什么?表示对于每种字母,最多填一个红色,一个绿色。也就是说,当这个字母的数量不少于 222 时,它对答案的贡献为 111。如下:最多填一个红色和一个绿色:而对于只有一个的字母,每一个字母填红色,就要有一个字母填绿色。也就是说,设所有个数为 111 的字母的数量为 tottot
2021-09-08 09:14:18
176
原创 洛谷 P7754 【[COCI2012-2013#3] SAHOVNICA
题意概括画出 r×cr \times cr×c 的X、.相间的棋盘,棋盘的每个格子由大小为 a×ba \times ba×b 的,只有X和.中的一种字符的字符矩阵构成。算法分析这个题其实也不是很好想,容易糊涂。我们可以发现,对于每一行,有下列两种情况:连续 bbb 个X,然后连续 bbb 个.,然后再连续 bbb 个X,然后……连续 bbb 个.,然后连续 bbb 个X,然后再连续 bbb 个.,然后……也就是说,我们可以 if 两种情况:先X后. 以及 先.后X。那又应该怎样讨
2021-09-08 09:10:43
237
原创 洛谷 CF1531A 【Зингер | color】
题意你有一个物品,初始时它的颜色是 blue 且状态为未上锁。接下来依次有 nnn 次操作,每次操作由一个字符串给出。若这个字符串是 lock:将它的状态改成上锁。若这个字符串是 unlock:将它的状态改成未上锁。若这个字符串不是 lock 或 unlock:若它的状态为未上锁,则将它的颜色改成这个字符串。你需要输出物品最终的颜色。0≤n≤1000 \leq n \leq 1000≤n≤100。分析我们只需一个bool类型的变量来表示当前是否上锁,初始化为 000 表示未上锁用一个字符串来记
2021-09-08 09:10:01
146
原创 洛谷 CF1466B 【Last minute enhancements】
我们可以对xix_ixi做加111的操作,我们思考一下操作和不操作的效果:若xi=xi−1x_i=x_{i-1}xi=xi−1,则对xix_ixi加111可以使它们不相等,使得答案增加,而不操作则不会影响答案,因此操作优于不操作;若xi≠xi−1x_i\ne x_{i-1}xi=xi−1,则加111可能会减小或不影响答案,而不操作一定不影响答案,因此不操作优于操作;所以我们得出了这样的算法:若xi=xi−1x_i=x_{i-1}xi=xi−1,xix_ixi加1
2021-09-08 09:08:43
146
原创 洛谷 P7540 【[COCI2009-2010#1] DOMINO】
题目传送门这篇题解主要面向初学者。大佬再见求和符号∑\sum∑∑i=0n\sum_{i=0}^n∑i=0n表示所有0≤i≤n(i∈N)0≤i≤n(i\in N)0≤i≤n(i∈N)的iii的和。例如:∑i=15\sum_{i=1}^5∑i=15意为1+2+3+4+51+2+3+4+51+2+3+4+5。求所有满足 $0 \le x\le y $ 的非负整数对 (x,y)(x,y)(x,y) 中,∑x+∑y\sum{x} + \sum{y}∑x+∑y 是多少意为所有满足 $0 \le x\
2021-09-08 09:07:49
269
原创 洛谷 P7227 【[COCI2015-2016#3] ESEJ】
按照惯例这里需要一个传送门挨个分析题意:这篇文章至少 aaa 个词,最多 bbb 个词。——限定了范围,直接造bbb个比较方便。每个单词至少 111 个字母,最多 151515 个字母。——显然一个正常的人都不会用151515个字母的。文章至少包含 b2\dfrac{b}{2}2b 个不同的单词。——还是全部都不同来的容易。分(hu)析(che)完毕。众所周知,从111到bbb的自然数是绝对不会有重复的。那为什么不用数来代替字母呢?将 000 到 999 的数与 aa
2021-09-08 09:02:05
320
原创 洛谷 P7258 【[COCI2009-2010#3] SLATKISI】
题目传送门题目里对输入的描述似乎不太精确:Mirko最小的钞票上的零数Mirko 最小的钞票上的零数Mirko最小的钞票上的零数指的是101010的指数(即10310^3103,10410^4104,10510^5105上面的333,444,555)。题意分析通过对题意的分析,我们可以将题意简化成:将数字ccc四舍五入精确到kkk位顿时高大上的橙题就变成了小学数学题(这可能就是此题没有算法标签的原因之一)考虑问题众所周知C++C++C++的整型除法自带向下取整,所以不需要写复杂的四舍五入函
2021-09-08 08:59:06
204
原创 洛谷 P7259 【[COCI2009-2010#3] SORT】
题目传送门思考看到题目第一感觉是桶排,然而看到1≤C≤1091≤C≤10^91≤C≤109嗯······就很NICE1≤N≤1031≤N≤10^31≤N≤103然后就想到了map(不知道的可以看这里)尝试使用mapmapmap进行排序然而无果对于这道题来说,mapmapmap能做而普通数组不能做的就是存下数字的次数和出现位置。而如果将其中一个存到mapmapmap里,另一个存到普通数组里,然后将两者挂钩,就能通过对数组的排序来实现整体的排序。代码(具体做法见注释)#include&
2021-09-07 16:30:25
221
原创 洛谷 P6867 【[COCI2019-2020#5] Politicari】
直接模拟模拟代码#include<iostream>#include<cstdio>#define ll unsigned long long//不开long long 见祖宗using namespace std;ll k;int n,a[510][510];int u,v,t;int main(){ cin>>n>>k; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c
2021-09-07 16:28:09
345
原创 洛谷 P7174 【[COCI2014-2015#4]CESTA】
思路根据小学数学教科书我们知道303030的倍数必定是101010的倍数,也是333的倍数;101010的倍数最后一位必定是000,333的倍数各位之和也是333的倍数。然后再来看数据范围:对于 100100100% 的数据,nnn 的位数不超过 10510^5105 。显然这题要用字符串了。那么怎样使结果最大呢?排序。排序之后各位之和不变,所以依然是333的倍数,而排序之后000一定在最后,所以依然是101010的倍数。所以排序之后的数也是303030的倍数。代码#include
2021-09-07 16:24:46
291
原创 洛谷 P7199 【[COCI2019-2020#1] Trol】
一、直接模拟看到题第一想法就是直接模拟,毕竟只是一道红题。模拟代码:#include<iostream>#include<cstdio>#define ll unsigned long longusing namespace std;int q;ll l,r;ll ans;ll f(ll n){ int r; int a=0; while(n/10!=0) { a=0; while(n!=0) { r=n%10; a+=r;
2021-09-07 16:23:03
430
原创 平面向量快速入门
概念什么是向量?这就是向量。从图上可以看出,向量是一条带箭头的线,准确来说,向量是一条有向线段。那么向量有什么样的意义呢?在数学中,它可以简化运算,将复杂的几何问题转化为简单的向量运算。那它又有怎样的实际意义呢?它可以表示物理中的矢量,可以表示位移、速度、力等物理量,同时可以以向量运算代替物理量运算,达到简化的目的。性质向量既然是一条有向线段,决定向量的因素有哪些呢?向量的方向向量的长度注意,没有向量的位置!也就是说,向量与它的位置无关!图中,红色的向量与蓝色的向量完全相等
2021-09-06 15:42:06
860
1
原创 平衡树详解(Splay)
引入先看例题:(洛谷 P3369 【模板】普通平衡树)您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1.插入 xxx 数2.删除 xxx 数(若有多个相同的数,因只删除一个)3.查询 xxx 数的排名(排名定义为比当前数小的数的个数 +1+1+1 )4.查询排名为 xxx 的数5.求 xxx 的前驱(前驱定义为小于 xxx,且最大的数)6.求 xxx 的后继(后继定义为大于 xxx,且最小的数)显然可以使用BST(二叉搜索树)完成,它的时间复杂度是 O(logn)O(log
2021-08-29 21:30:00
11508
10
原创 线段树详解
引入例题:(P3372 【模板】线段树 1)已知一个数列,你需要进行下面两种操作:1.将某区间每一个数加上 kkk。2.求出某区间每一个数的和。我们可以使用树状数组来解决这道题,然而这次我们要回归正解了!我们要使用线段树!线段树线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界
2021-08-28 19:11:36
948
原创 单源最短路径算法
Dijkstra可以用优先队列优化到O(mlogn)O(mlogn)O(mlogn)的时间复杂度。注意!Dijkstra算法只能处理正边权!负边权要用SPFA!代码(优先队列优化):#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;struct st{ int to; int dis; int nxt;}edg
2021-08-14 21:07:47
124
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人