- 博客(361)
- 资源 (1)
- 收藏
- 关注

原创 有关我在初赛中所遇到的问题
T1:重新排列 1234 使得每一个数字都不在原来的位置上,一共有__种排法解析:错排公式的运用n个不同物品,重新排列使得物品不在其原来的位置上。第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;第二步,放编号为k的元素,这时有两种情况:把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;第k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;综上得到D(n) = (n-1) [D(n-
2021-09-11 08:38:35
746

原创 网络流dinic算法
是什么是网络流在一个有向图上选择一个源点,一个汇点,每一条边上都有一个流量上限(以下称为容量),即经过这条边的流量不能超过这个上界,同时,除源点和汇点外,所有点的入流和出流都相等,而源点只有流出的流,汇点只有汇入的流。这样的图叫做网络流。一些定义源点:只有流出去的点汇点:只有流进来的点流量:一条边上流过的流量容量:一条边上可供流过的最大流量残量:一条边上的容量-流量网络流最大流定义网络流的最大流算法就是指的一个流量的方案使得网络中流量最大。网络流最大流求解网络流的所有算法都是基于一种
2021-07-28 17:54:57
909
1

原创 C++ STL--stack/queue 的使用方法
stackstack 模板类的定义在头文件中。stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型为deque。定义stack 对象的示例代码如下:stack s1;stack s2;stack 的基本操作有:入栈,如例:s.push(x);出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。访问栈顶,如例:s.top()判断栈空,如例:s.empty(),当栈空时,返回true。访问栈中的
2021-05-05 08:30:21
166

原创 数论基础
质数质数这东西让我联想到了原子,一样不可拆分,所以我们说质数具有原子性。我们设π(x)\pi(x)π(x)为不大于x的质数个数,可得π(x)=O(xln(x))\pi(x)=O(\frac x{\ln(x)})π(x)=O(ln(x)x)唯一分解定理任何一个N(N>1)能被质数分解,且只有一种分解方式,即N=p1c1×p2c2×……×pmcm(N>1)N=p_1^{c_1}\times p_2^{c_2}\times……\times p_m^{c_m}(N>1)N=p1c1
2021-03-25 20:54:07
1429
7

原创 KMP算法
例题一:子串查找思路:这里我简单讲一讲KMP算法:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)其实KMP算法就是在BF(暴力算法)上的一个优化,以避免文本串当前匹配指针回溯的情况来提高时间效率。实现过程:在学习KMP算法前,需要理解一个KMP中的避免回溯的方法,NEXT数组。首先摆出两个概念:前缀:指的是字符串的子串中从原串最前面开始的子串,如abcdef的前缀有
2021-03-22 21:36:21
362
3

原创 浅谈线段树
线段树在一类问题中,我们需要经常处理可以映射在一个坐标轴上的一些固定线段,例如说映射在OX轴上的线段。由于线段是可以互相覆盖的,有时需要动态地取线段的并,例如取得并区间的总长度,或者并区间的个数等等。一个线段是对应于一个区间的,因此线段树也可以叫做区间树。线段树的构造思想线段树是一棵二叉树,树中的每一个结点表示了一个区间[a,b]。每一个叶子节点表示了一个单位区间。对于每一个非叶结点所表示的结点[a,b],其左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2,b]。
2020-10-25 16:52:31
875

转载 数据结构——树
数据结构——树树其实就是不包含回路的连通无向图。树的特性:1)一棵树中的任意两个结点有且仅有唯一的一条路径连通;2)一棵树如果有nn个结点,则它一定有n−1n−1条边;3)在一棵树中加一条边将会构成一个回路。树这种数据结构的用途:例如:家族的族谱图、公司的组织结构图、书的目录等。1. 二叉树二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子。二叉树用范围最广。一颗多叉...
2020-08-10 21:15:35
2098

原创 vector
vector:1.1 vector 说明vector是向量类型,可以容纳许多类型的数据,因此也被称为容器(可以理解为动态数组,是封装好了的类)进行vector操作前应添加头文件#include 1.2 vector初始化:方式1.//定义具有10个整型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定vector<int>a(10)...
2020-04-24 22:27:11
292
1

原创 Trie
1.Trie的概念:Trie又称字典树,前缀树(事实上前缀树这个名字就很好的解释了Trie的储存方式)来一张图理解一下Trie的储存方式:(图片来自百度百科)通过这张图,我们可以看出Trie的特点:Trie没有根节点,也就是无根树。除根节点外,每一个节点的会储存一个字母或单词!从根节点到每个单词节点的路径上的所有字母连接而成的字符串就是该节点对应的字符串每个非叶子结点一般都会被多...
2020-03-15 16:26:27
630
1
原创 51nod 1632 B君的连通【概率与期望】
题面题目大意给出n个点的一棵树,删掉一边有50%的概率,问剩下连通块的个数期望为多少。思路:对于每一条边,我们删与不删跟其他的边没有关系,也就是可以独立开了。考虑删掉一边的期望,每删一次就会多出一个连通块,所以期望就是0.5总期望就是0.5(n-1)+1【因为不管你删不删边,都会一个连通块】因为答案还要乘上一个2n−12^{n-1}2n−1,所以答案就是(n−1)2n−2(n-1)2^{n-2}(n−1)2n−2#include <cstdio>#include <ios
2022-05-04 11:55:25
379
原创 51nod 1639 绑鞋带【概率与期望】
题面题目大意:给出n个鞋带,现在重复n次以下操作:随机抽出两个鞋带头,把它们绑在一起。可以想象,这n次之后將不再有单独的鞋带头,n条鞋带系成了一些环。那么有多大概率刚好所有这些鞋带只形成了一个环?思路:显然我们总共有2n个绳头设已近打了i个节,那么还剩下2n-2i个绳头。但是对于当前的绳头我们不能和自己绑在一起,所以还剩2n-2i-1。考虑满足题目条件的绳头,因为有且仅有一个环,所以我们肯定不能跟当前绳子绑在一起的绳头打结。否则最后会多出一个环。如图所示:#include <cs
2022-05-04 08:58:39
246
原创 51nod-2102或减与【位运算】【异或】
51nod-2102或减与思路:对于两个数的同一位相等,那么位或和位与运算答案都是一,那么做减法答案为0;对于两个数的同一位不相等,那么位或的答案为1和位与运算答案为0,那么做减法答案为1;终上所述,最后答案就是将a xor b#include <cstdio>#include <iostream>#define ll long longusing namespace std;ll a, b;int main(){ scanf("%lld%lld",
2022-02-19 09:00:27
493
原创 51nod-3216授勋【位运算】【lowbit】
51nod-3216授勋思路:由于勋章都是有2的次幂组成的数,所以每一个数不断减掉他的lowbit的次数,最后就是答案。#include <cstdio>#include <iostream>#define lowbit(x) x & (-x)using namespace std;int n, a, ans;int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++) {
2022-02-19 08:50:00
409
原创 51nod-2106 一个奇数次【位运算】
思路:根据a xor a=0(出现偶数次等于零),我们就将所有的数全部xor,最后剩下的就是答案。(题目规定只有一个出现奇数次的数)。#include <cstdio>#include <iostream>using namespace std;int n, a, ans;int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d", &a); a..
2022-02-19 08:36:40
545
原创 UOJ 关羽下象棋 [分类讨论]
思路:第一个子任务里,车和卒是同一行的,显然车只要直接把卒吃掉即可。根据算法一的思路,如果卒和车在同一行或者同一列,我们直接输出 1。好了下面我们讨论 x1≠x2, y1≠y2 的情况。诶,我们接着来看第四个子任务!为什么直接跳到了第四个呢,因为我们需要想想一般情况下这个题的答案到底是多少。想要分类讨论,就要先想想答案最大是多少。而在第四个子任务里,卒和车都在棋盘靠中心的位置,所以我们至少可以不用考虑棋盘边界对答案的影响。卒和车都是左右对称的,所以我们不妨设 y1<y2,即车在卒右边。如...
2022-02-04 21:29:05
914
原创 luogu T210845 Cthugha
Cthugha思路:把 R 看作 −1,B 看作 1,做前缀和。如果前缀和数组中 sl=srs_l=s_rsl=sr ,说明 [l+1,r][l+1,r][l+1,r] 这一段区间是「stoorz 能全连的」。开一个数组记录一下每一个数字出现的最早下标即可。时间复杂度 O(∣s∣)O(|s|)O(∣s∣)。#include <cstdio>#include <iostream>#include <string>#include <cstr
2021-11-18 20:00:33
262
原创 luogu P1265 公路修建【最小生成树】【思维】
公路修建 link思路:如图,对于任意一点A,因为它申请修建AB道路,因此离A最近的点一定是B同理,B申请修建BC道路,因此C一定比A离B更近(即C在圆B内,不包含边界)同时,C申请修建CA道路,即A离C比A离B更近满足题意的话,ABC只能组成正三角形,因此排除最短边有三种情况因为题目有:一个实数,四舍五入保留两位小数,表示公路总长。(保证有唯一解)。所以限制二是没有的!本题另外一个问题在于空间的限制上, 5000 * 5000的空间大小会MLE那么我们发现题目给的是坐标,所以
2021-10-26 20:45:13
332
原创 luogu P2939 [USACO09FEB]Revamping Trails G 【分层图最短路】
[USACO09FEB]Revamping Trails G link思路:分层图最短路模板题,具体思路看我上一篇博客->link#include <cstdio>#include <iostream>#include <queue>#include <cstring>using namespace std;const int N = 5e5 + 10;struct node {int to, val, next;} e[N
2021-10-26 20:30:57
164
原创 luoguP4568 [JLOI2011]飞行路线【分成图最短路】
[JLOI2011]飞行路线 link题目大意:这里引入一个新知识—分成图最短路;分层图最短路是指在可以进行分层图的图上解决最短路问题。一般模型是:在图上,有k次机会可以直接通过一条边,问起点与终点之间的最短路径。那我们考虑建图,我们将图分成0~k层这里就是将图分成k层,每次从第i-1层到第i层相当于是走了一条免费的飞行路线。然后如果从第i层回到第i-1层就是一个“后悔”的过程。因此建图方法就是每层之间正常连边,层与层之间上到下边权为0,下到上正常边权。这样直接跑Dijkstra
2021-10-26 20:24:59
223
原创 luogu P3946 ことりのおやつ(小鸟的点心)【最短路】【时间撮】
ことりのおやつ(小鸟的点心)link思路:SPFA先把时间预处理一下,定义一个时间撮last为最早封路的时间,只需在spfa更换路径的时候再加个判断,很容易想到。有一个坑的地方,在到终点的时候不用考虑雪的深度,特判一下就好。#include <bits/stdc++.h>#define inf 1e9 using namespace std;const int N = 5e5 + 10;struct node { int to, next, v;} e[2 * N
2021-10-20 20:34:53
270
原创 AtCoder Beginner Contest 221 (2021.10.2) C-Select Mul
题目大意:一个整数N考虑把n中的数字置换成两个正整数,问通过最佳分离得到的两个结果整数的最大可能乘积是多少思路:最多有9!×8=2903040分离方式(忽略两个分离整数的顺序时的分离方式),足够小。因此,我们可以对所有可能的分离方式使用暴力。在C++中实现时,有一个有用的函数称为next_permutation置换,它包含在标准库中。#include<bits/stdc++.h>using namespace std;int ans;string N;int ma.
2021-10-02 22:20:53
549
原创 AtCoder Beginner Contest 221 (2021.10.2) B-typo
题目大意:给出两个字符串A,B,问B串是否能通过最多一次操作变成A.定义一次操作为:交换相邻两个字符。思路:首先我们求出有多少位与A串不同,记作cnt。如果cnt==0,显然A,B两个串相同,Yes如果cnt>2,说明无论怎么操作,A,B两个串都至少会有一位不相同如果cnt==2,考虑找到第一位与A串不相同的字符,分别与前后交换,判断是否能变成A即可。(对于一次操作一定是相邻的,那只用判断就可以了,如果不行,显然两个不同字符的位置不相邻,无法操作)。#include <cs.
2021-10-02 22:15:05
307
原创 AtCoder Beginner Contest 221 (2021.10.2) A-Seismic magnitude scales
题目大意:给出A,B两个数,分别表示32A,32B32^A, 32^B32A,32B,问前者是后者的多少倍。#include <cstdio>#include <iostream>using namespace std;typedef long long ll;ll a, b, c, ans;ll ksm(ll a, ll n){ if (n == 0) return 1; else if (n % 2 == 1) return ksm(a.
2021-10-02 22:03:55
272
原创 CSP/NOIP 入门级模拟赛 Day3 D. 质数统计【线性筛质数】【欧拉筛】【埃氏筛】
思路:线性筛质数#include <cstdio>#include <iostream>#define max 1000000using namespace std;bool prime[max+1];int sum[max+1], tmp, a, b;int main(){ prime[0]=prime[1]=1; sum[1]=0; for(i=2;i<=max;i++) { if(!prime[i]) { for(j=i..
2021-09-20 20:46:26
190
原创 CSP/NOIP 入门级模拟赛 Day3 C. 做题时间 【线性DP】
思路:#include <cstdio>#include <iostream>#include <cstring>using namespace std;const int N = 2e2 + 10;int n, a[N], b[N], sum, f[N][40010], ans;int main(){ //freopen("cs.in", "r", stdin); //freopen("cs.out", "w", stdout); ..
2021-09-20 20:44:01
153
原创 CSP/NOIP 入门级模拟赛 Day3 B. 任务分配 【二分】
思路:我们考虑二分出对于每个人最多可以多少页(mid)令left=0,right= ∑i=1nai\sum_{i=1}^{n}a_i∑i=1naiCheck函数据题意所写。inline int check(int mid) { int many = 1, total = 0;//many为最少要几个人维护,total为当前维护总页数 for (int i = 1; i <= n; ++i) { if (total + a[i] <= mid)//若当前还可以维护a[..
2021-09-20 20:41:29
190
原创 CSP/NOIP 入门级模拟赛 Day3 A. 纸条编码 【模拟】
思路:模拟。无限输入字符,然后用最后26个字符代表A~Z所代表的字符。直接输出即可#include <cstdio>#include <iostream>#include <cstring>#define ll long longusing namespace std;const int N = 1e4 + 10;char a[N], s[N], kg; int len;int main(){ freopen("decode.in",..
2021-09-20 20:37:43
178
原创 luogu P4296 [AHOI2007] 密码箱 [数论] [推柿子]
P4296 [AHOI2007] 密码箱 link题目大意:给定 nnn,求出所有正整数 xxx,满足小于 nnn,且 x2≡1(mod n)x^2\equiv1\left(mod\;n\right)x2≡1(modn) 将满足的 xxx 按从小到大的顺序依次换行输出思路:x2=kn+1x^2=kn+1x2=kn+1移项发现是个平方差即(x+1)(x−1)=kn(x+1)(x-1)=kn(x+1)(x−1)=kn考 虑 拆 解 k,nk,nk,n①(x+1)=k1∗n1(x+1)=k
2021-08-25 16:30:53
162
原创 2021-8-24校网比赛C题 [递推][矩阵快速幂]
思路:一开始比赛的时候学长忘记将取模数加上去了,人均放弃打高精。距离比赛结束还有半个小时,学长才想起来加上模数,直接光速切题。此题我们考虑用地推来做。设f[i][0/1/2]现在到第i位,已经前面(紧连着)连续出现了0/1/2个A的答案。f[i][0] = f[i-1][1]+f[i-1][0]+f[i-1][2]f[i][1] = f[i-1][0]f[i][2] = f[i-1][1]我们稍微对柿子错一下位置,则 f[i][0]=>f[i-1][0] , f[i][1]=f[
2021-08-25 16:25:42
104
原创 2021-08-12校网比赛B题 luoguP3535 [贪心][并查集]
思路:考虑一下如果一个点在环上,显然删掉关键点连着的边不会亏,所以肯定存在一种方案只删去连接关键点的边。所以我们可以优先连接所有的非关键点的边,然后剩下的跑一个类似最小生成树的就好了。#include <cstdio>#include <iostream>#define N 1000010using namespace std;int n, m, k, i, ans;int f[N], x[N << 1], y[N << 1];inl.
2021-08-24 07:35:16
162
原创 2021-08-14校网比赛A题
思路:对于一个不取模的答案是不是可以转换成11111…k那11111…是不是(10n−1)/9(10^n-1)/9(10n−1)/9那我们考虑乘法逆元将原式转换一下,毕竟除法没有取模的运算嘛!就是求出9的逆元再根据(AB)%p=(A%p*B%p)%p就可以了。最后将原式再乘上一个k记得取模。#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#def..
2021-08-23 22:12:41
123
原创 nowcoder 牛客练习赛87 B:k小数查询 [思维]
k小数查询 link题目大意:有nnn个数,每次操作使两个数删掉,留下它们两个的和,问进过kkk次操作后的最小中位数。思路:对于初中数学中位数的定义:对于一个序列长度为奇数时,中位数为序列升序排序后的第(n+1)/2(n + 1) / 2(n+1)/2对于一个序列长度为偶数时,中位数为序列升序排序后的第(a[(n+1)/2]+a[n/2])/2(a[(n + 1) / 2]+a[n / 2])/ 2(a[(n+1)/2]+a[n/2])/2那我们缩小中位数的大小,那一定是要将序列中小的数
2021-08-23 22:01:20
215
原创 nowcoder 牛客练习赛87 A:中位数 [思维]
中位数 link题目大意:有nnn个数,每次操作使两个数删掉,留下它们两个的和,问进过kkk次操作后的最小中位数。思路:对于初中数学中位数的定义:对于一个序列长度为奇数时,中位数为序列升序排序后的第(n+1)/2(n + 1) / 2(n+1)/2对于一个序列长度为偶数时,中位数为序列升序排序后的第(a[(n+1)/2]+a[n/2])/2(a[(n + 1) / 2]+a[n / 2])/ 2(a[(n+1)/2]+a[n/2])/2那我们缩小中位数的大小,那一定是要将序列中小的数尽可
2021-08-23 21:58:50
293
原创 LOJ #6277. 数列分块入门1 [分块][区间加值,单点查询]
#6277. 数列分块入门 1 link考虑将n个数分成blo块分别处理。分块的思想:“整块打标机,小块暴力处理。” by Viktley\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\
2021-08-23 19:37:44
127
原创 2021-08-12校网比赛B题
#include<iostream>#include<cstdio>#include<algorithm>#define sco 10010using namespace std;#define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,1<<15,stdin),S==T))?EOF:*S++)char buffer[1<<15],*S=buffer,*T=buff..
2021-08-15 22:04:01
145
0819动态规划之状态压缩.pptx
2020-08-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人