自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数论入门篇

算数基本定理:一个数可被唯一地表示成若干个素数的乘积。x=p1cnt1∗p2cnt2∗p3cnt3∗⋯∗pncntnx=p^{cnt_1}_1*p^{cnt_2}_2*p^{cnt_3}_3*\cdots*p^{cnt_n}_nx=p1cnt1​​∗p2cnt2​​∗p3cnt3​​∗⋯∗pncntn​​cnticnt_icnti​表示x分解后的乘积表达式中有cnticnt_icnti​个pip_ipi​.定理的一些基本应用1.求出x的因子个数factorCnt=(cnt1+1)∗(cnt2+1

2020-07-06 21:22:30 440 1

原创 D. George and Interesting Graph[二分图匹配+拆点+枚举]

1.枚举每个点作为中心点,去掉中心点和所有和中心点相连接的点,并统计数量.2.这样处理完了中心点相关的边后,其余的点出入度均为1,把每个点拆成入点和出点跑二分图匹配即可.传送门#include<bits/stdc++.h>using namespace std;#define ll long long#define MAXN 1020#define fore(n) for(int i=1;i<=n;i++)ll n,m;vector<int>g[MAXN];

2020-07-31 22:32:03 200

原创 E. XOR and Favorite Number(莫队算法+异或前缀和)

传送门1.处理出异或前缀和数组a[i]^=a[i-1];2.对于区间[L,R]的异或和,即为a[R]^a[L-1]3.如果x ^ y=k,那么x=k ^ y对于一个区间[L,R],我们维护[L-1,R]的异或前缀和.当加入新元素时a[x],如果在我们维护的前缀和里存在a[x]^k,那么就会对答案产生贡献.##注意这个题左端点是L-1,这是关键!###include<bits/stdc++.h>using namespace std;#define ll long long#d

2020-07-31 19:54:27 229

原创 E. XOR on Segment(线段树+XOR)

按每一个二进制位拆成20棵线段树即可.所以对于每颗线段树iii,我们关心的都只有一位,即二进制第iii位上是否有1.线段树节点上维护一个cnt,表明这个线段内在该位上1的个数.lazy标记维护0或1,向下传递时1表明会改变子线段的cnt,即cnt=len-cnt.传送门#include<bits/stdc++.h>using namespace std;#define ll long long#define MAXN 100002#define fore(n) for(int

2020-07-31 16:16:36 346

原创 二分图匹配

模板1.如何找到二分图的最大匹配匈牙利算法时间复杂度(L*(R+M))L为左部点数,R为右部点数,M为边数。核心思想巧妙利用递归去寻找增广路径。对每个左部点X进行处理,看能不能在右部找到匹配点。如果该右部点已经使用过,那么对和它匹配的那个左部点Y进行搜索,看能不能找到一个替换,如果找到则表明可以让X抢占Y之前的匹配点.AC代码:#include<bits/stdc++.h>using namespace std;#define ll long long#define M

2020-07-30 20:46:26 477

原创 CF888-G. Xor-MST-(分治+01字典树,最小异或生成树)

在01字典树上建点。然后考虑怎么使得生成树最小。从高位开始,按当前为1/0将所有数划分为两个集合(两者都不为空的情况下)。这两个集合是分散的,所以我们需要一条边连接它们。暴力枚举选取。但是这样会遇到一个问题,即如何维护一段连续的区间,使得这个区间中的所有元素都在这个集合内。我们只要对a数组排序,然后依次插入字典树即可。所以我们对于树上的每个节点,记录对应的数组区间序号。L数组和R数组表明当前节点对应数组的最小序号和最大序号。分治暴搜即可。#include<bits/stdc++.h

2020-07-28 23:35:10 166

原创 牛客多校第五场-K-Bag(思维+实现)

传送门只要维护一个切割点数组cut[i],表明从1~i的切割是有效的,且可与后半部分拼接。维护好cut后只要从后往前再扫一遍即可。#include<bits/stdc++.h>using namespace std;#define ll long long#define MAXN 2005005int n,k;int a[MAXN];int cut[MAXN];unordered_map<int,int>mp;int main(){ int t;

2020-07-27 23:57:58 112

原创 杭电多校第一场Leading Robots(数形结合思想)

机器人传送门嗯…第一次完全靠自己写了一波斜率维护。。。原理不是很难,但是第一次写还是有点憨批。首先你要处理出一个点集,这些点满足这样的条件:任意两点得ppp不相同,并且取每个位置得最大aaa.只有这些点才有可能对答案产生贡献。然后还有一个注意点:就是如果对于一个位置p,如果有最大值a,那么这点显然产生不了贡献,但还是要做为运算过程中的一个点。根据等式ait2/2+pi=ajt2/2+pja_it^2/2+p_i=a_jt^2/2+p_jai​t2/2+pi​=aj​t2/2+pj​任意两点之间

2020-07-27 10:43:18 135

原创 关于DP的几种优化

单调队列优化通常转移条件满足:dp[i]=max(dp[j]+a[j])(j<i)dp[i]=max(dp[j]+a[j])(j<i)dp[i]=max(dp[j]+a[j])(j<i)即转移条件只跟前面的某一项有关,且满足取最值条件。斜率优化通常转移条件满足:dp[i]=max(dp[j]+a[i]∗a[j])(j<i)dp[i]=max(dp[j]+a[i]*a[j])(j<i)dp[i]=max(dp[j]+a[i]∗a[j])(j<i)即存在某一项即有

2020-07-27 00:10:10 509

原创 Codeforces Round #658 (Div. 1)B. Unmerge(DP)

观察后思考得出:对于一个数aia_iai​,它后面那些连续的小于aia_iai​得aja_jaj​(j>i)(j>i)(j>i),一定是和aia_iai​在同一个集合中。因此找到LISLISLIS最长上升自序列,根据子序列中每个元素划分成若干个小部分,就变成了01背包问题。#include<bits/stdc++.h>using namespace std;#define MAXN 4105#define ll long longint n;int a[MAXN]

2020-07-23 16:20:30 123

原创 EOJ月赛2020.7-E. 因数串(构造)

传送门比赛时候想到按质因子个数分层,优先往层数多的状态转移,赛后发现不行。赛后问了下wwg,他是构造写的。首先因数个数为∏i=1n(1+ki)\prod_{i=1}^{n}{(1+k_i)}∏i=1n​(1+ki​)其实可以从最后一个因子使用的次数来考虑,先增后减,如此循环(这样可以使得每次转移符合条件)然后再考虑倒数第二位,第三位。。。然后因为要让最大值出现在最后面,要按照每种质因子的个数分奇偶排序,使得最后一次一定是递增的。AC代码#include <bits/stdc++.h&g

2020-07-18 22:01:19 174

原创 数形结合-下凸折线求最大平均值

传送门这块的内容参考了国家集训队2004周源的论文。数形结合将题目中要求的求最大平均值,转为iii和其对应的前缀和作为图中的坐标点(i,sum[i])(i,sum[i])(i,sum[i])avg(i,j)=k(i,j)=sum[i]−sum[j]i−javg(i,j)=k(i,j)= \frac{sum[i]-sum[j]}{i-j}avg(i,j)=k(i,j)=i−jsum[i]−sum[j]​下凸折线#include <bits/stdc++.h>using namespa

2020-07-16 22:31:13 193

原创 牛客多校2020第二场F Fake Maxpooling(互质数对筛矩阵)

关于矩阵初始值我们可以用互质数对进行筛选,复杂度大致为N*M.初始完值后,用二维单调队列维护矩阵最大值即可。代码如下#include <bits/stdc++.h>using namespace std;#define MAXN 5050#define ll long longint n,m,k;int a[MAXN][MAXN];int mx[MAXN][MAXN];#define fore(l,r) for(int i=(l);i<=r;i++)int main(

2020-07-15 17:23:45 144

原创 数论分块

除法分块对于k/i的结果,当k不变时,我们可以发现是随i呈连续变化的.即我们可以将k/i值一样的部分一起处理,求出左右端点即可。另t=n/lt=n/lt=n/l,则r=n/tr=n/tr=n/t。ttt表示当前l对应的n/in/in/i值。rrr表示满足n/in/in/i=ttt的最大整数,再变大,只能让t变小则不符合。模板题链接...

2020-07-15 00:42:54 125

原创 clion常用工具(持续更新)

1.对比两份代码的差异(源于看着一份AC代码和一份80%正确的代码半天的教训)右键clion界面点击Compare with clipboard

2020-07-13 23:14:33 2063 1

原创 单调队列

首先你可以看下这道题,单调队列就是用来解决这道题的。模板题可以看到:你要在O(n)时间内求出每个连续区间的最值。我们知道我们总希望可以利用前一个连续区间的答案,但它有时效性(越过了他的作用范围就不能再使用),这样问题该如何解决呢?其实我们可以维护一个双端队列:队列的一端,一般用队尾,表示最值(可能已经失效,失效就弹出来即可)队列中所有元素都是有序排列的,只要队尾仍具有时效性,他就是最值。那么失去了时效性该怎么办呢?我们又该如何维护这个队列使得队列中所有元素按大小有序排列呢?这是我们需要思

2020-07-13 19:22:11 126

原创 牛客多校第一场I1 or 2(网络流)

传送门源点sss为111,汇点ttt为2∗n+22*n+22∗n+2一个点xix_ixi​拆成xi1,xi2x_{i1},x_{i2}xi1​,xi2​,xi1和1相连,xi2和2∗n+2相连x_{i1}和1相连,x_{i2}和2*n+2相连xi1​和1相连,xi2​和2∗n+2相连.对于边(i,j)(i,j)(i,j),连接xi1x_{i1}xi1​和xj2x_{j2}xj2​,xj1x_{j1}xj1​和xi2x_{i2}xi2​.#include <cstdio>#include

2020-07-12 19:20:48 264

原创 关于2-SAT

关于2-SAT有两种模板第一种用到了tarjan缩点第二种则是dfs(可以实现字典序最小)关于什么是2-SAT,先不介绍,看下这道模板题。模板题链接可以看到,我们需要找到一个合理的选择,使得所有被选择的都不会发生冲突。下面以id+m代表第id号家庭的丈夫,id+w代表第id号家庭的妻子。如1m代表一号家庭的丈夫。如果1m和2w有矛盾,那么:1.如果我们要选择1m,就不能选用2w反过来说如果我们选择1m,就必须选用2m(因为一个家庭必须选择一人)2.同样如果选择了2w,那么必须选用1w基

2020-07-11 00:05:48 130

原创 [典藏题记003]Codeforces Round #601 (Div. 2)E2. Send Boxes to Alice (Hard Version)⭐⭐⭐⭐

首先考虑可能的k值。k首先不能为1,且是素数。如果∑i=1na[i]\sum_{i=1}^{n}{a[i]}∑i=1n​a[i]为素数,显然只能堆积到一个点上,只能为一堆。sumsumsum的范围为1e12,枚举每个质因数即可,做法是质因数分解。所以枚举sum的所有质因数即可。再来看下怎么求:记录下a数组的前缀和。对于位置i位置i位置i,如果sumi∤ksum_i\nmid ksumi​∤k,只能把sumi%ksum_i\%ksumi​%k个糖果往后推,或着从后面拿k−sumi%kk-sum_

2020-07-09 19:38:58 113

原创 ACM中一些实用函数

memset关于复杂度:快于for,但是依然接近于O(n)O(n)O(n),在数据组数多时慎用,以免超时。memset(a,127,sizeof(a));将a数组每一字节除最高位以外全赋上1,即01111111,用来获得一个极大的初值。memset(a,-1,sizeof(a));将a数组中所有元素都设置为-1memset(a,0,sizeof(a));将a数组中所有元素都设置为0max_elementReturns an iterator pointing to the element

2020-07-09 00:10:36 265

原创 图论-关于最短距离的各种情况

单源最短路:即求出图中一个点到另一个点的距离推荐算法:dijkstra堆优化限制条件: 图中不存在权值为负数的边原因:负边权会破坏基于每次选择最近点的贪心策略,即一个已经松弛完毕的点有可能又会被之后的其他点松弛,造成错误。#include <bits/stdc++.h>using namespace std;#define ll long long#define maxn 100005vector<pair<int,int> >edge[maxn];t

2020-07-08 23:47:27 1239

原创 [典藏题记002]Codeforces Round #638 (Div. 2)E. Phoenix and Berries(DP)

传送门由题意可得:有两种水果A和B,对于体积为c的篮子,我们要使得装满的篮子个数尽可能多。对于同一种水果,可以放在一起。但对于两种不同的水果,要放在同一个篮子的条件是在同一行.对于A和B水果混合而成的篮子,下文称之为混合篮。1.对于每一行,A+B的水果混合最多装一篮,如果混合两篮以上其实是无意义的,因为如果混合到两个篮子以上表明在混合水果的篮子里有一种水果的个数至少为k,完全没必要参与混合。2.对于当前行,知道从第一行开始到当前行所有剩余的A水果数量RemainARemain_ARemainA

2020-07-08 22:59:35 131

原创 Codeforces Round #629 (Div. 3)E. Tree Queries(树)

题意就是m次询问,问你每次询问的k个点能否都在从根节点到一个点的路径距离1或者就在路径上。我们发现对于一个节点,如果存在两个以上孙子节点,显然输出NO,那怎么判断何时输出YES呢?显然只要不存在这样两个孙子结点即可,也就是说对于任意节点只可能有多个儿子节点就输出YES,那么判断所有节点的父节点是不是都在一条路径上即可。因为路径可能很长,要用倍增法预处理求出每个点的祖先节点。#include<bits/stdc++.h>using namespace std;int n,m;#defin

2020-07-08 00:30:32 148

原创 关于C语言一些容易忽略的点

1.关于自动类型转换的问题运行后可以发现AB两处cnt的输出不同。此处的sqrt返回值为double,AB两处一处用了强制类型转换,一处用了自动类型转换。输出结果:可以发现A处值不一样,double 和 long long 运算,double优先级高,所以都转换为double类型,最后double类型作为返回值又赋给了long long变量,此过程发生了降级。关于自动类型转换的规则如下:同一句语句或表达式如果使用了多种类型的变量和常量(类型混用),C 会自动把它们转换成同一种类型。以下是自动类

2020-07-07 14:38:45 173

原创 Codeforces Round #554 (Div. 2)C. Neko does Maths(gcd)

传送门这题用到了一个性质就是gcd(a,b)=gcd(a-b,b)对于a>=b。lcm(a+k,b+k)=(a+k)∗(b+k)/gcd(a+k,b+k)lcm(a+k,b+k)=(a+k)*(b+k)/gcd(a+k,b+k)lcm(a+k,b+k)=(a+k)∗(b+k)/gcd(a+k,b+k)根据前面的性质可以得到:gcd(a+k,b+k)=gcd(a−b,b+k)gcd(a+k,b+k)=gcd(a-b,b+k)gcd(a+k,b+k)=gcd(a−b,b+k)显然我们希望gcd(

2020-07-07 00:10:30 138 1

原创 Aladdin and the Flying Carpet(算数基本定理+埃式筛法)

这里用到了质因数分解求因子个数。预处理用埃式筛法打了个素数表。对于小于b的因子暴力跑,没想到别的方法。#include<bits/stdc++.h>using namespace std;int n,m;#define MAXN 1005000#define ll long longll a[MAXN];ll p[MAXN];int check[MAXN];int pcnt=0;void isprime(){ for(ll i=2;i<=1000000;i

2020-07-06 22:25:26 139

原创 Codeforces Global Round 9E. Inversion SwapSort(构造+分解问题)⭐⭐⭐⭐

传送门首先你可以把所有a[i]离散化,得到相应的值(如果a中有x-1个不同的元素比这个ai小,离散值就为x)这题的构造方法即为:从最后一个位置开始,依次往前解决所有的逆序对。我们先考虑所有ai都不相同的简单清苦:显然最后一个位置的值在经过调整后必须为最大的离散值n,如果它当前值为x,那么显然这个位置有n−xn-xn−x个逆序对。我们只需要把最后一个位置和它所有逆序对对应的另一个位置上的所有元素重新排列,使得最后一个位置上的值为n(逆序对对应的其他位置上一定有n),其他位置上的值依然符合原来的大小关系

2020-07-06 12:07:55 166

原创 Codeforces Global Round 9 D. Replace by MEX(构造)⭐⭐⭐

传送门又是构造瞎搞题,太难啦。是这样的,首先考虑一个点:就是每次的mex是可以算出来的,然后这时候你可以任选你可以任选一个点把值设置为mex,如果你之后不再动这个点,那么再也不会出现这个mex的值了。那是不是就比较清晰了。我们不妨构造一个a[i]=i−1a[i]=i-1a[i]=i−1的序列。每次如果mex的值为n,就任选一个值不符合的待更新的位置,设成n,那么下次的mex肯定不为n,因为mex不会出现a中目前已有的值。这样最多经过不超过2*n次替换就可以构造出序列了~#include<

2020-07-05 19:41:15 129

原创 Codeforces Global Round 9C. Element Extermination(思维)⭐⭐⭐

%%%%%%%%%传送门考虑第一个点a1a_1a1​,显然要找到一个aj>a1aj>a1aj>a1,否则不成立。依次找到后面的每个满足条件的j,用这些aja_jaj​去消除掉他前面的小于a1a_1a1​的元素,这样剩下的都是大于a1的元素了。就可全部去掉了。显然最后一个元素ana_nan​要大于a1,满足这个条件即可。#include<bits/stdc++.h>using namespace std;int n,m;#define MAXN 4000000#de

2020-07-05 14:59:33 124

原创 Codeforces Round #586 (Div. 1 + Div. 2)D. Alex and Julian(数的基)

传送门题意就是给你n个数,然后和一个有无限个点组成的图,如果图中abs(i−j)abs(i-j)abs(i−j)在这n个数中,则可以建立这条边。要求最小删去多少个给定的数,使得该图是二分图。二分图有一个最基本的性质就是不存在奇数环。考虑如果存在环,从一个点x开始再回到x,如果边数不为奇数,那么现有的数都要满足一个性质:即二进制上的最低位(最小的那位)要相同,如此可保证不存在奇数环。遍历一遍找出每个数的最低位,然后找到计数最多的那一个二进制位,不对应-该二进制位-的都删去即可。#include&

2020-07-04 22:31:40 111

原创 Forethought Future Cup - Elimination RoundE. Hot is Cold(标签覆盖转换)

这题其实就是标签覆盖的问题,我目前只会线段树上进行标签覆盖,后续学到再进行补充。#include<bits/stdc++.h>using namespace std;#define ll long long#define MAXN 200005int n,q;#define ls (root*2)#define rs (root*2+1)#define tmid ((tree[root].l+tree[root].r)/2)ll a[MAXN];struct tree{

2020-07-04 00:34:21 142

原创 [典藏题记001]D. Frog Jumping(数论+图论+思维+暴力)

题目传送门写这题脑细胞快死完了,看了大佬的题解又研究了半天。简单讲一下我的做法:这题可以小范围暴力,大范围找出规律。设h(i)为要到达点i的最小x设h(i)为要到达点i的最小x设h(i)为要到达点i的最小x。那么ans=ans=ans=∑i=0n(n−h(i)+1)(如果点i可以到达)\sum\limits_{i=0}^{n}{(n-h(i)+1)}(如果点i可以到达)i=0∑n​(n−h(i)+1)(如果点i可以到达)然后有一个性质就是:如果点i可达,那么一定满足:i∣gcd(a,b)i|g

2020-07-03 21:04:52 288

原创 Codeforces Round #654 (Div. 2)E. Asterism(思维)⭐⭐⭐⭐

这道题让你求方案数f(x)f(x)f(x)不能被p整除的x.又是一道思维盲点题:这道题的答案是一个连续的区间。首先最小满足条件的x=l很好求,最大的满足条件的也求出的话,答案就出来了。证明:首先将a从小到大排序,可以发现对于回合i,有(x+i−1)(x+i-1)(x+i−1)个candy,该回合可以使得f(x)乘上(cnt−i+1),cnt为a中小于等于candyi的元素个数(cnt-i+1),cnt为a中小于等于candy_i的元素个数(cnt−i+1),cnt为a中小于等于candyi​的元素个数

2020-07-02 11:02:08 179

原创 Dasha Code Championship - SPb Finals Round(C. Kamil and Making a Stream)(树上gcd的传递)

最关键的性质是一个节点的值往下传递,最多只会改变log1e12log1e12log1e12次,约等于40.这表明向下搜索的过程中,传递到每个节点的不同值的个数不会超过40。#include<bits/stdc++.h>using namespace std;#define fore(i, l, r) for(int i = int(l); i < int(r); i++)#define MAXN 100005#define ll long longint n;ll a[

2020-07-01 17:23:44 155

原创 Educational Codeforces Round 84 (Rated for Div. 2)D. Infinite Path(循环节+图论)

传送门

2020-07-01 12:28:00 140

空空如也

空空如也

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

TA关注的人

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