自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Erase Subsequences (字符串+dp)

Erase Subsequences题目传送门:Erase Subsequences思路:看到题目最先想到的就是你可以枚举切割字符串的位置,使其分成两个串。然后接着一个最为朴素的n^3的dp就是,dp[ i ][ j ][ k ]来表示字符串s匹配到第i位,t1字符串匹配到第 j 位,t2 字符串匹配到第k位时是否可行,可行则为1不行则为0。那么这样时间复杂度就来到了n^4方,即使数据很小,这样还是会T的。那么我们就要想办法削减一下dp的复杂度,一个容易想到的优化就是用dp[ i ][ j ]表

2021-09-23 00:25:13 243

转载 CF 1295D. Same GCDs

D. Same GCDs题意:给你两个整数a和m,然后使你计算使gcd(a+x,m) = gcd(a,m)(0<=x<=m,a<m )成立的x的数量。思路:已知a<m,0<=x<=m,根据最大公约数的性质a>=b,gcd( a , b ) = gcd( a-b , b )所以如果a+x>=m那么gcd( a+x , m ) = gcd( a+x-m , m )即a+x可以写成( a + x )mod m我们令 x ′ = ( a + x )

2021-09-04 21:04:31 195

转载 CF1556E Equilibrium

E. Equilibrium转自大佬的博客AC Code#include<bits/stdc++.h>using namespace std;typedef long long LL;const int N=1e5+10;LL a[N],b[N],sum[N],lg[N];LL maxn[N][30],minn[N][30];LL query_maxn(int l,int r){ int len=lg[r-l+1]; return max(maxn[l][l

2021-09-03 16:04:31 288

原创 2021杭电多校第10场

C Pty loves lines比赛的时候发现有很多区间是连续的,于是先打表看看。n=699时的最后两个区间为[ 31098 , 31103 ] , [ 31105 , 243951 ]n=700时的最后两个区间为[ 31145 , 31150 ] , [ 31152 , 244650 ]观察得到31152之后的区间都是连续的,所以我们只要求出31152之前的每个交点数能不能存在即可。另dp[i][j]表示为 i 条直线是否可以组成 j 个交点。用bitset进行优化,时间复杂度为31152 *

2021-08-25 01:33:57 235

原创 D. Ezzat and Grid (线段树维护dp)

D. Ezzat and Grid题目传送门:D. Ezzat and Grid题目大意:就是给你很多行的01串,长度是1e9,每一行都有若干段的连续的1,使得给定的串集合美丽的条件是任意相邻两行的串至少有一个列是同时有1的,问你至少删除多少行使得这些01串是美丽的,并输出删除的方案?思路:比较好想到的就是维护dp[i]表示以第i行为结尾时构成的最大集合,dp[i]可以被第j行更新(第i行和第j行有同列为1),然后取一个max即可。由于每一行的1都是连续的,与是需要执行的是区间加和区间最值查询的操

2021-08-11 17:25:55 403 2

原创 fft在字符串匹配中的应用

残缺的字符串(洛谷P4173)#include<bits/stdc++.h>using namespace std;const int N=1e6+10,M=1<<20;const double PI=acos(-1);string str1,str2;double s1[N],s2[N];struct Complex{ double x,y; Complex operator+ (const Complex &t) const {

2021-07-28 22:09:53 173

原创 fft板子

#include<bits/stdc++.h>using namespace std;const int N=3e5+10;const double PI=acos(-1);int n,m;struct Complex{ double x,y; Complex operator+ (const Complex &t) const { return {x+t.x,y+t.y}; } Complex operator- (

2021-07-28 22:08:01 186

原创 飞马祝福语(线段树维护区间动态规划)

飞马祝福语题目传送门思路:线段树维护区间动态规划。设祝福信为s,FeiMa为x,s的下标从1开始,x的下标从0开始。使用线段树维护区间动态规划。另dp[rt][i][j]表示线段树的rt节点包含的字符子串的范围内,拥有字符串x的第 i 位到第 j 位区间子序列的数量(例如, i=0,j=0表示 rt节点中 F 的数量,i=1,j=1 表示节点中 e 的数量, i=2,j=3表示节点中子序列为 iM 的数量),那么状态转移方程为:AC Code#include<bits/stdc++.

2021-05-31 21:05:11 155

转载 背包+bitset

题目描述题解:(参考于此)这个题是个典型的分组背包。f[i][j] 为前i个数能否构成 j ,考虑第i个数选还是不选。显然 f [ i-1 ][ j-x[i]2]==1的话f[i][j]就是可以的,x[i]的取值范围是 l[i] 到 r[i]。这样的话其实有点浪费——f数组是一个只有01两种值的数组,哪怕表示成bool类型都有点多余,于是我们可以考虑用bitset来优化它。bitset你可以理解为一个长度很长的01数字串(实际上它是用int拼接而成),也可以理解为可以用位运算的bool数组

2021-05-28 15:32:01 301

转载 浅谈ST表

浅谈ST表先来一个小问题 :有N个数,M次询问,每次给定区间[L,R],求区间内的最大值。N<=10,M<=10老师,我会O(N)暴力枚举!再来:N<=10^ 5,M<=10^5老师,我会线段树O(logN)处理每个询问!再来:N<=10^ 5,M<=10^6这时候我们发现,随着M的增大,O(logN)的询问的处理已经不够优秀,我们需要O(1)处理询问的方法。这就引出我们今天的主题——ST表。算法流程:我们现在要O(1)求出区间最大值,

2021-05-26 22:00:14 181

原创 Codeforces Round #722 (Div. 2) A~D

题目传送门:(比较有意思的一场)CF #722A. Eshag Loves Big Arrays思路:最小的数不可能被删除AC Code#include<bits/stdc++.h>using namespace std;int a[105];int main(){ int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n);

2021-05-25 17:30:23 150

原创 Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version)

C2. Skyscrapers (hard version)题目传送门:C2. Skyscrapers (hard version) 题目大意:有n栋楼,每栋楼最高为hi,不允许存在一栋楼两边都有比他更高的楼,要求建成的楼的总高度最大。思路:1.用单调栈。延续C1的想法,我们要找到一个最高点,然后向左向右全部都向低处扩展。这个最高点将序列分成了两个部分,从左到右是非递减序列,从右到左是非递减序列。那么我们利用单调栈的思想,求出每个数向左所影响的区间和向右所影响的区间,分别从左往右和从右往左求一

2021-05-23 22:12:55 154

原创 牛客练习赛83 C.集合操作

C.集合操作(思维,后缀)题目传送门:C.集合操作题目:思路:数据量很大,操作数和每次减去的数<=1e18。那么如果模拟的话肯定妥妥的爆炸。我们比较容易可以想到如果很多个数在同一个p的区块时(这些数中的最大值和最小值的差小于p)那么将这里面的所有数同时减去p时,他们的相对大小是不变的。那么我们就可以先把原来的数排个序,从后往前操作,将后面的数不断并到前面的区块上,当并到不能操作时再退出。剩下的操作再进行暴力模拟,剩下的操作数量必然小于n。所以时间复杂度为nlogn。AC Code#i

2021-05-23 15:52:12 315 3

原创 E. Weights Distributing(图论)

E. Weights Distributing(图论,贪心)题目传送门:E. Weights Distributing题目大意:有n个点,m条路径,每次经过一条路径时都需要一次该路径的花费。有一个花费数组对应着每一条路径,要求给出一个权值分配方案使得从点a->b->c的花费最小为多少。思路:1.假设a->b之后b->c没有经过之前经过的点,那么也就是三点之间经过的路径是一条直线。2.否则b->c经过了之前经过的x,那么也就有了a->x->b->x

2021-05-09 23:52:05 132

原创 D. Constant Palindrome Sum(差分)

D. Constant Palindrome Sum(差分好题)题目传送门:D. Constant Palindrome Sum题目大意:给你一个数组a,你可以将其中的每个元素改为[1,k]的任意数字。但是在修改后每对ai + an-i+1都为常数x。思路:假设我们另a1=ai , a2 = an-i+1首先想到的是。1.当x = a1 + a2时需要修改0个数2.当x>=min(a1,a2)+1且x<=max(a1,a2)+k且x!=a1+a2时需要修改其中的一个数3.其他

2021-05-09 22:41:10 237

原创 Codeforces Round #720 (Div. 2)

题目传送门:codeforces #720(div2)A. Nastia and Nearly Good NumbersAC Code#include<bits/stdc++.h>using namespace std;typedef long long LL;int main(){ int t; scanf("%d",&t); while(t--) { LL a,b; scanf("%lld%lld",&a

2021-05-08 14:43:34 220

原创 Educational Codeforces Round 108 (Rated for Div. 2)

A. Red and Blue Beans题目传送门:A. Red and Blue BeansAC Code#include<bits/stdc++.h>using namespace std;int main(){ int t; scanf("%d",&t); while(t--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(a

2021-04-30 14:15:22 103

原创 D. Cut and Stick(莫队维护区间众数)

D. Cut and Stick题目传送门:D. Cut and Stick题目大意:给你一个a序列,询问q次,每次问区间[l,r]最少可以分为几个子序列,使得子序列中每个数的出现次数小于等于x/2(向上取整,x为子序列长度)思路区间的离线查询首先想到莫队,看到题目的限制就会想到我们需要求得区间的众数。我们用cnt[]数组记录每个数出现的次数,在进行莫队add操作时:众数的维护很简单,只要与加入的数出现的次数取大即可;在进行莫队del操作时:原来是众数的数可能变成不是众数,于是我们可以再开一个数

2021-04-22 22:59:22 627

转载 强连通分量

强连通分量什么是强连通图?如果一个有向图中,存在一条回路,所有的结点至少被经过一次,这样的图为强连通图。什么是强连通分量?在强连通图的基础上加入一些点和路径,使得当前的图不再强连通,称原来的强连通的部分为强连通分量。求强连通分量有何作用?在进行对其他图论问题求解前,利用强连通分量的知识可以把图中强连通的点缩为一个点,减少接下来其他图论操作的计算。在某些特定的环境下,求强连通分量变相地得出了图中的环以及环的长度。利用Tarjan算法求强连通分量Tarjan算法的基本思路首先考虑强连通分

2021-04-10 21:04:48 183

转载 主席树详解

主席树详解要想学主席树,首先要搞懂可持久化线段树,因为主席树运用了它的思想。主席树的模板题是:静态查询区间第k小那么主席树的做法就是, 先把全部数字离散化,然后每一个前缀建一棵权值线段树,显然,如果直接建,那么空间上是不允许的,但是我们发现,每两个相邻的前缀中,只有一个数的差别,所以,他们的公共部分是很多的,所以我们就可以用可持久化线段树了!首先,要明确一下,主席树上每个结点的值的定义(我们设这个节点的管理范围为l~r,并且现在已经将这个数列离散化了):表示在当前前缀中,有多少个数的值在l ~ r中

2021-04-10 17:07:31 280 1

原创 Codeforces Round #709 (Div. 2)D. Playlist

D. Playlist题目大意:有编号1~n的n首歌循环播放,每首歌都有一个自己的类型 a i 。当现在这首歌和上一首歌的类型的gcd=1时,他就会怒删当前这首歌,然后从后面那手歌重新开始听(也就是说不会删连续两首歌),要你求删除的歌的数量和删除的顺序。思路:队列维护链表。初始时,先循环一遍数组,把相邻两首歌的类型互质的加入到队列中。然后开始去队首元素,如果队首的两首歌 i 和 nxt[i] 都没有被删,则删去nxt[i] ,并将nxt[i]置为nxt[nxt[i]],如果两者仍然互质的话,则加入队

2021-03-24 23:01:18 296

原创 String(线段树)

线段树求最长的相等字符串前缀题目:StringAC Code#include<bits/stdc++.h>using namespace std;const int N=1e5+10;char str1[N],str2[N];int a[N];struct node{ int l,r,lazy; int d[30];}tr[N*4];void pushup(int k){ for(int i=0;i<26;i++) tr[k]

2021-03-22 22:46:08 162

转载 Educational Codeforces Round 106 D.The Number of Pairs

D. The Number of Pairs题目传送门:D. The Number of Pairs题目大意:给你三 个数c,d,x,要你找到有多少对数满足 c * lcm(a,b) - d * gcd(a,b) = x思路:转自大佬的博客AC Code#include<bits/stdc++.h>using namespace std;typedef long long LL;const int N=2e7+10;int primes[N],ans[N],cnt;i

2021-03-20 23:33:28 115

转载 中国剩余定理模板(互质与非互质)

互质#include<bits/stdc++.h>using namespace std;int exgcd(int a,int b,int &x,int &y){ if(b==0) { x=1,y=0; return a; } int d=exgcd(b,a%b,y,x); y-=a/b*x; return d;}int Chinese_Remainder(int mod[],int p

2021-03-19 16:11:44 161

转载 扩展欧几里得算法与中国剩余定理

在《孙子算经》中有这样一个问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?这个问题说的是,有一件物品,我们不知道它的数量。但是,如果三个三个数,最后会剩下两个;如果五个五个数,最后会剩下三个;如果七个七个数,最后会剩下两个。问这个东西的数量是多少?实际上,这个问题在现在我们可以将其转化为一个同余方程组:中国剩余定理告诉了我们像这样的同余方程组的解。这个定理又称为孙子定理,通常被简写成CRT这篇文章将会从欧几里得算法开始讲起,之后过渡到扩展欧几里得算法解线性方程,最后介绍中国

2021-03-19 15:46:06 613 1

转载 Tarjan求割点与桥

割点与桥的概念割点:简单的说就是,删掉这个点和这个点有关的边,图就不是连通图,分裂成了多个不连接的子图。桥:删掉这条边后,图就不再是连通图,分裂成为多个不连通的子图。求割点算法思想:首先选定一个根节点,从根节点开始遍历整个图(使用dfs)对于根节点:如果有2棵即以上的子树,就是割点(因为如果去掉这个点,这两棵子树就不能互相到达)对于非根节点如果节点U的所有孩子节点可以不通过父节点U而访问到U的祖先节点,那么说明:即使去掉节点U也不影响图的连通性,U不是割点。如果节点U至少存在一个孩

2021-03-16 00:08:52 247

原创 二项式反演的应用

众所周知,二项式反演可以表示成是一个及其对称的式子,常用的表达式是网上有很多很好的证明,比如这个博客,感觉容斥的证明比较形象,这里就不多赘述了。恰好和至多的转换如果要求blabla恰好有k个blabla的时候,有时候会很难算,而求至多有k个blabla的时候会很好算设 fi表示恰好的方案数, g i 表示至多的方案数,则有根据二项式反演有恰好和至少的转换同样有时候至少k个blabla的要更好求设 f i 表示恰好的方案数,g i表示至少的方案数,则有根据二项式反演有...

2021-03-14 10:33:38 256

原创 Codeforces Round #707 (Div. 2)

比赛传送门:Codeforces Round #707 (Div. 2)A. Alexey and Train思路:按题意模拟即可AC Code#include<bits/stdc++.h>using namespace std;int a[105],b[105],t[105];int main(){ int d; scanf("%d",&d); while(d--) { int n; scanf("%d",&n); for(int i=1

2021-03-13 21:54:37 1301 5

转载 求K短路(A*+dijkstra)模板

#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define ll long long const int maxn=1e6+5;int n,m,s,t,k,r,cnt,p1,p2,head1[maxn],head2[maxn],vis[maxn];ll d[maxn];struct node{ int to,w,next;}e1[maxn],e2[maxn];struct qnode

2021-03-09 21:38:07 134

转载 multiset用法

C++语言中,multiset是 < set > 库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,并且序列中可以存在重复的数简单的运用int main(){ //freopen("../in.txt","r",stdin); int x; scanf("%d",&x); multiset<int> h; while (x!=0) // 插入数

2021-03-09 20:01:59 368

原创 Educational Codeforces Round 105 (Rated for Div. 2)

A. ABC String题目大意:实质上就是括号匹配,只不过‘A’,‘B’,'C’三个字母,每个字母都只能带表一种括号。思路:在任何时刻右括号不能比左括号多,最后要刚好匹配即可。AC Code#include<bits/stdc++.h>using namespace std;int main(){ int t; cin>>t; while(t--) { map<char,int>mapp; mapp.clear();

2021-03-03 01:39:03 2385 5

转载 矩阵哈希

矩阵哈希解决的问题:给出一个大矩阵,再给出若干个小矩阵,问大矩阵中是否存在小矩阵。代码模板:#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;const int seed1=131,seed2=13331,maxn=1e5+10,mod=1e9+7;int n,m,t,x,y;char a[1004][1004];ull p1[max

2021-02-28 17:04:57 418 1

原创 哈希表创建的模板

创建哈希表#include<bits/stdc++.h>using namespace std;typedef long long LL;const LL maxn=1e7+10,mod=1e6+7;struct Hash{ int e,next,w;}edge[maxn];int head[maxn],cnt=0;void Init(){ memset(head,-1,sizeof(head)); cnt=0;}void Insert(LL x)

2021-02-28 15:54:14 109

原创 2021牛客寒假集训营4

武辰延的字符串思路:比赛的时候一直想着要用到kmp,其实并不需要。题目要我们求的其实就是t i+j = s i+s j。那么只要枚举s和t的所有相同前缀,然后二分查找 t - si ,找到能匹配上s的前缀 sj 的最大长度,计入答案即可。具体算法就是哈希和二分:哈希能够快速O(1)判断两个子串是否匹配二分是因为我们在找到某个前缀匹配时,前缀的前缀也一定匹配,所以可以二分找到最长前缀,因为比它长的前缀都不匹配,比它短的所有前缀都匹配,这就满足二分使用前提的单调性。AC Code#i

2021-02-20 21:42:10 163

转载 莫队算法初探

普通莫队莫队算法一般分为两类,一是莫队维护区间答案,而是维护区间内的数据结构。当然也有树上莫队,带修改莫队,二维莫队等等。这篇文章主要介绍的是普通莫队算法。我们考虑一个问题,给定一个序列,m次询问,每次询问区间[l,r]有多少种不同的颜色。n,m<100000先考虑暴利,对每次询问遍历一遍[l,r],这样是O(nm)的。换种方式暴利,定义ql和qr,表示区间[ql,qr]内有多少种颜色,再定义cnt数组,cnti表示第i种颜色在区间[ql,qr]中出现了多少次。我们一个一个询问处理,对于询问

2021-02-18 22:09:09 191

原创 文艺平衡树算法

一、文艺平衡树解决什么问题您需要写一种数据结构,来维护一个有序序列。其中需要提供以下操作:翻转一个区间,例如原有序列是5 4 3 2 1,翻转区间是[2,4],结果为5 2 3 4 1二、文艺平衡树与普通平衡树a[5]={ 5 , 4 , 3 , 1 , 2 }那么存入文艺平衡树之后,再中序遍历的结果应该还是:{ 5 ,4 ,3,1,2}。即下标从小到大,而不是里面的值从小到大!这是与普通平衡树的最大的不同!文艺平衡树经过rotate旋转之后,它的中序遍历是不变的(即,下标从小到大)。但是让这颗树的

2021-02-17 16:30:42 2602 4

原创 Luogu P3871中位数 (splay求中位数)

AC Code#include<bits/stdc++.h>using namespace std;const int N=2e5+10;struct splay_tree{ int ff,cnt,ch[2],val,size;}tr[N];int root,tot;void update(int x){ tr[x].size=tr[tr[x].ch[0]].size+tr[tr[x].ch[1]].size+tr[x].cnt;}void rotate(.

2021-02-16 20:30:29 184

原创 Luogu P1503 鬼子进村(平衡树+栈)

思路:前面两个操作自然想到可以用栈模拟,然后可以把摧毁了的房子加到平衡树中。操作三的话只要找到前驱和后继即可,last-pre-1即为答案。AC Code#include<bits/stdc++.h>using namespace std;const int N=5e4+10;struct splay_tree{ int ff,ch[2],val,size;}tr[N];int root,tot;void update(int x){ tr[x].size.

2021-02-16 19:55:27 156

原创 Educational Codeforces Round 104 (Rated for Div. 2)

A. Arena题目传送门:A. Arena题目大意:有n个人,每个人都有战斗力,当两个人打起来时,战斗力高的人赢并且战斗力加1,当战斗力达到100500时,则成为英雄。问能有多少人能成为英雄。思路:显而易见,除了战斗值最低的人之外,其他的所有人都有可能成为英雄。AC Code#include<bits/stdc++.h>using namespace std;int a[105];int main(){ int t; scanf("%d",&t)

2021-02-16 16:31:06 1314 2

原创 C. Orac and LCM(数学)

思路:gcd( lcm(a1,a2) , lcm(a1,a3) ,lcm(a1,a4) ……lcm(a1,an) )因为都有一个公共因子a1所以gcd1=lcm( a1, gcd(a2,a3,a4……an) )同理 gcd2也是这样的最终答案是gcd(gcd1,gcd2……gcdn)所以我们只要求一个后缀gcd即可重要性质:gcd(lcm(a1,a2),lcm(a1,a3),lcm(a1,a4),…,lcm(a1,an))=lcm(a1,gcd(a2,a3,a4,…,an)AC Code.

2021-02-15 16:11:16 335

空空如也

空空如也

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

TA关注的人

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