自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法记录005 :动态序列的分块和可持久化分块

实用算法005 :动态序列的分块众所周知,分块一般是将序列没n\sqrt nn​分成一块,总共n\sqrt nn​块的算法。但是这一般只可以处理静态序列。考虑一个问题,但是有的操作可能可以改变序列的样子,比如将一段区间左移多少或向右移动多少,还有区间赋值,然后再维护一个sum,max,min……之类的。一般分块就做不了了(不过可持久化treap可以)不过我们可以用一下这个技巧来分块:我们先将原来的序列每n\sqrt nn​个分一块,然后每次操作的时候可能会包含两个非整块,我们直接将那两个非整块切开

2021-01-08 18:20:43 261

原创 CF 603 E题解

CF 603 E题解又是我做不出来的题。这题我分析到了“对于每一个询问,查询最小的bound,使得将w≤boundw\leq boundw≤bound的边都加入,使得所有联通快都是偶数”这一步,然后就卡住了。可以发现,所有询问的答案不增的,若设无解为∞\infty∞。然而还是不会做。不过我们回忆一下“决策单调性”来优化dp过程的做法。定义work(l,r,L,R)work(l,r,L,R)work(l,r,L,R)表示已知⋂i=lransweri∈[L,R]\bigcap_{i=l}^r ans

2021-01-06 23:20:10 189

原创 实用算法 004: 矩阵树(Matrix Tree)和其扩展

实用算法 004: 矩阵树(Matrix Tree)和其扩展推荐知乎好文矩阵树可以计算一个无向图的生成树个数或有向图的根向生成树和叶向生成树的个数。由于有向图不怎么用到,下面只讨论无向图的情况。注意:无向图可以存在重边,但不能存在自环在下面的内容中默认N是点数,M是边数定义1. 邻接矩阵MMM,其中Mi,jM_{i,j}Mi,j​表示i,ji,ji,j之间的边数。可以发现MMM是一个对称且对角线是000的NNN阶矩阵。定义2. 度数矩阵DDD,其中Di,iD_{i,i}Di,i​表示iii的

2021-01-06 18:53:05 296

原创 实用算法 003:高斯消元算多项式乘法

实用算法 003:高斯消元算多项式乘法众所周知ntt/fft是目前已知的时间复杂度最优的多项式乘法算法。那为什么我们还需要知道这个方法呢?考虑这个问题:有nnn个多项式p1,p2,p3...pnp_1,p_2,p_3...p_np1​,p2​,p3​...pn​。和一个目标多项式qqq,初始q=1q=1q=1有qqq次操作:mul imul\ imul i。表示令q=q×piq=q\times p_iq=q×pi​。最后输出qqq的前aaa次项系数。(保证乘法过程中大于a

2021-01-06 18:50:46 236

原创 实用算法 002: SAM 上的根号暴力

实用算法 002: SAM 上的根号暴力题目看到了这个神仙代码:code他对于每一个每一个SAM上的节点都暴力跳上去。这样猛然一看不是非常对,但是仔细分析一波,这是一个非常优美的根号暴力。proof:proof:proof:设当前考虑字符串sis_isi​,每次向上跳可以补充不漏的跳出每一个子串,也就是最多O(∣si∣2)O(|s_i|^2)O(∣si​∣2)次,但是这是非常不满的,因为也不太好构造SAM上每一个节点只对应一个串。但是总共跳的次数肯定也是≤O(N)\leq O(N)≤O(N)的(对

2021-01-06 12:46:20 313

原创 CF 204 E

CF 204 E两个做法。SAM+可持久化线段树合并+dp首先SAM上线段树合并的套路应该是比较常规的了,由于线段树是一个DAG,然后利用线段树上的边来dp。不过我还没写出来SA+单调栈可以发现每次包含的那k个在rank上一定是比较靠近的。/*{####################### Author ## Gary ## 2021 #######################*/#inclu

2021-01-05 11:29:09 143 1

原创 AGC 050 D题解

AGC 050 D题解比赛的时候想到了O(N^6)的做法没敢写这题的数据范围非常迷惑,如果你O(N^6)的做法,请关闭这篇题解,自己尝试写出来,然后就可以AC了4e9的运算量只跑了 780ms,是真的神奇首先这题的dp样子比较显然(一眼dp题)可以先预处理处一个数组pi,j,k,lp_{i,j,k,l}pi,j,k,l​表示当前是第j轮,有i个人玩这个游戏,在这之前已经有k个人胜利了,最后这i个人当中又有l个胜利的概率。这个东西的转移比较简单,随便暴力转移也不会T。然后后面的步骤更加简单,每一

2021-01-03 22:50:46 297

原创 CF 700 E 题解

CF 700 E 题解首先将原字符串构建SAM。然后可以发现每次可行的变化是从SAM的一个节点通过link移动到另一个节点。而且每次都是取那个RightRightRight集合中最大的后缀。可以发现:如果不是最大的可以在前面扩展字符加到最大,然后其它的可以跟着一起扩展。代码,待补。...

2021-01-03 20:31:18 125

原创 AGC 047 C 题解

AGC 047 C 题解一个数论好题可以发现P是一个NTT模数,原根是2。则任何一个<P的数都可以表示成2xmod  p2^x\mod p2xmodp。两个数相乘也就可以表示成2x×2y=2(x+y)mod  (p−1)2^x\times 2^y=2^{(x+y)\mod (p-1)}2x×2y=2(x+y)mod(p−1)直接fft就好了。/*{####################### Author ## Gary ##

2021-01-03 15:50:57 250 3

原创 Good Bye 2020 题解(A-G)

Good Bye 2020 题解(A-G)昨天前6题全靠手速,G题漏写了一行代码最后也没有rush出来。????A枚举底边就ok。B从后往前greedy,如果+1的话可以让答案+1就+1,不然不变。我一开始还卡了半天在想为啥是对的。。。C问题就是要满足:∀i,si≠si−1,si≠si−2\forall i,s_i\neq s_{i-1},s_i\neq s_{i-2}∀i,si​​=si−1​,si​​=si−2​直接记录每一个位置是否修改,然后dp就行了。这玩意我做的时间比E

2021-01-03 10:31:00 204

原创 TC SRM 655 Div1 Level 3 题解

TC SRM 655 Div1 Level 3 题解题目传送门dp+几何首先可以发现凸包是顺时针排列的一些线段构成的。我们可以预处理每一个蓝点是否都在一个线段r[i]→r[j]r[i]\rightarrow r[j]r[i]→r[j],(箭头表示在凸包上的方向)的内测。然后蓝点就没有用了。然后再回想一下凸包的定义:所有点连接起来都是外凸的,且可以框住所有的点。然后我们像构建凸包那样来dp。首先钦定最下面,最靠左的点。然后将其它的极角排序。dpi,jdp_{i,j}dpi,j​表示当前凸包上的线

2021-01-03 10:29:58 129

原创 实用算法 001:用多项式的逆优化dp总结

用多项式的逆优化dp总结考虑一个经典的模型:dpi=∑j=1idpi−j×fjdp_i=\sum_{j=1}^i dp_{i-j}\times f_jdpi​=∑j=1i​dpi−j​×fj​求dpndp_ndpn​ 这种问题表面看上去需要n2n^2n2,但是事实上可以更优。我们建立一个长度无穷大的多项式:F(x)=∑i=0∞fi×xiF(x)=\sum _{i=0}^\infty f_{i}\times x^iF(x)=∑i=0∞​fi​×xi,特殊的:f0=fk+n=0,k∈N∗f_{

2020-12-31 23:43:48 308

原创 [USACO19DEC]Tree Depth P

[USACO19DEC]Tree Depth P题目传送门u是v的祖先的充要条件:u是[u,v][u,v][u,v]中最小的,从小往大加元素,第i个加入的元素贡献为[0,i−1][0,i-1][0,i−1]。然后我们枚举i,和j−i=lenj-i=lenj−i=len。然后就是求这个多项式的第k/k−(∣len∣−1)k/k-(|len|-1)k/k−(∣len∣−1)项:∏t=0z∑i=0txi×∏t=z+1n∑i=0txi\prod_{t=0}^z {\sum _{i=0}^t x^i}\t

2020-12-30 18:34:37 470

原创 CF 666E 题解

CF666E 题解首先可以将所有的串用无关字符连接起来:s[1]+’#’+s[2]+’#’…s[n]然后建一个SAM。在每一个节点上搞一个动态开点线段树。然后从下往上线段树合并。最后像最长公共子串那样跑一边,倍增找到节点就可以了。/*{####################### Author ## Gary ## 2020 #######################*/#include<

2020-12-30 18:13:16 326

原创 loj 6077 「2017 山东一轮集训 Day7」逆序对

loj 6077 「2017 山东一轮集训 Day7」逆序对题目传送门一个经典问题我们一个一个加入元素,第i个贡献的逆序对数量在区间[0,i−1][0,i-1][0,i−1]内问题也就是有多少个排列xxx满足:∑ixi=k ∣ xi∈[0,i−1]\sum _{i}x_i=k\ |\ x_i\in [0,i-1]i∑​xi​=k ∣ xi​∈[0,i−1]可以考虑容斥:如果有j个不满足条件,也就是xi≥ix_i\geq ixi​≥i我们可以将不满足

2020-12-29 19:22:38 230

原创 CF 698 F

这题计算几何,非常毒瘤,思路比较简单,但是会有非常毒瘤的数据卡精度。我写了300行,还特判调整了epsepseps.代码:/*{####################### Author ## Gary ## 2020 #######################*/#include<bits/stdc++.h>#define rb(a,b,c) for(int a=b;a<=c;++

2020-12-24 10:41:34 116

原创 [USACO20FEB]Help Yourself P 题解

[USACO20FEB]Help Yourself P 题解可以维护每一个次方的结果然后用二项式定理计算答案。时间复杂度O(N×K×log⁡2(n)+N×K2)O(N\times K\times \log_2(n)+N\times K^2)O(N×K×log2​(n)+N×K2)。吐槽一下usaco的评测机,本机0.8s0.8s0.8s 但usaco上TLE,洛谷AC。/*{####################### Author ## Gary

2020-12-18 12:58:16 184

原创 JSOI2018 战争 题解

JSOI2018 战争 题解题目传送门假设A部落占领的点集为AAA,B部落的为BBB。则问题转换成,给你一个向量vvv。判断是否∃a∈A,b+v=a,(b∈B)\exists a\in A,b+v=a,(b\in B)∃a∈A,b+v=a,(b∈B)则是否存在a−b=va-b=va−b=v若我们可以处理出a−ba-ba−b的点集CCC。问题就转换成查询一个向量是否在一个凸包内。我们将所有BBB中的点乘上−1-1−1。得到B′B'B′。然后处理出向量AAA和BBB的闵科夫斯基和。关于闵科夫斯基和

2020-12-17 14:44:28 213

原创 CF 818 G Four Melodies 题解

CF 818 G Four Melodies 题解根据题目要求连边,跑最小费用流。一个优化技巧:由于spfa会退化成O(n×m)O(n\times m)O(n×m),所以需要利用dijkstra+势函数来优化。第一次最短路可以dp出来,由于是DAG。/*{####################### Author ## Gary ## 2020 #######################*/#incl

2020-12-17 10:27:46 172

原创 gym 101480 Problem C: Cow Confinement 题解

gym 101480 Problem C: Cow Confinement 题解算法知识:dp+扫描线。从下往上扫描,维护一个线段树就可以了。线段树支持区间清零,区间加和单点查询。Warning:扫描线预处理排序的部分需要注意先后顺序。/*{####################### Author ## Gary ## 2020 #######################*/#include&lt

2020-12-15 23:10:11 194

原创 Uva 1072 Huffman Codes 题解

Uva 1072 Huffman Codes 题解一个需要技巧的爆搜。/*{####################### Author ## Gary ## 2020 #######################*/#include<bits/stdc++.h>#define rb(a,b,c) for(int a=b;a<=c;++a)#define rl(a,b,c) for(i

2020-12-15 20:20:07 246 1

原创 NERC 2015 Hypercube 题解

NERC 2015 Hypercube 题解题目意思非常简单。判定一个三维图形能否拼成一个超立方体。不要问我超立方体长啥样我们回忆一下三维展开怎么做。假设一个正方体展开图像下面这样:.........e.....abcd....f...........则我们钦定正方体的底面为b,则我们在每一个位置放上一个正方体,然后滚动到b。可以发现那些地面恰好构成一个正方体$\Leftrightarrow $底面互不相同。我们可以尝试用一个三元组来表示一个滚动状态:(a,b,c),表示在前后,左右,

2020-12-15 17:02:52 135

原创 ACM ICPC 2017 WF Problem J Son of Pipe Stream 题解

ACM ICPC 2017 WF Problem J Son of Pipe Stream一个神仙网络流题。首先一个直观的想法:可以枚举水的多少,然后让flubber尽量多。然后再慢慢调整当前的策略。假设当前的候选答案为w,fw,fw,f。(表示水和flubber的数量)若,当前在保证一个数不变的情况下可以增大另一个数,则这个一定不是最优解。否则在增加一个数的同时另一个数会减小。可以发现一个数增加的数=另一个数减少的数。所以两个数的总和不变。另一个发现,两个加起来等于maxflowmaxfl

2020-12-13 22:37:45 457

原创 CF Round # 295 (Div. 1)题解

CF Round # 295 (Div. 1)题解CF 521 A. DNA Alignment假设字符串中的A,G,C,TA,G,C,TA,G,C,T个数分别为a,g,c,ta,g,c,ta,g,c,t。你构造出的个数分别为a′,b′,c′,d′a\prime,b\prime,c\prime,d\primea′,b′,c′,d′。则ρ(s,t)=a∗a′+g∗g′...ρ(s,t)=a*a\prime+g*g\prime...ρ(s,t)=a∗a′+g∗g′...,可以发现最优解一定是让max⁡{a

2020-12-13 09:26:44 139

原创 CF 1455 G. Forbidden Value 题解

CF 1455 G. Forbidden Value 题解本来想抢一个一血的,但是晚上状态不佳,没调出来就睡觉了。首先我们可以将这些操作看作一个一个的[if...end][if...end][if...end]样子的block。不妨可以在最外层套一个,if(0)…end.一个比较显然的dp状态:dp[i][j]dp[i][j]dp[i][j]表示你从i-th block里出来是j的最小花费。转移相当简单,对于set操作,只需要记录一个全局增量之后就是O(1)O(1)O(1)的了,if之类的是O(ma

2020-12-03 17:03:06 205

原创 CF 477 D Dreamoon and Binary 题解

CF 477 D Dreamoon and Binary这题比较easy。首先可以发现是dp。可以设dp状态为dp[i][j]dp[i][j]dp[i][j]。表示[i,j]。每一个状态存储两个值: 最小次数,再次基础上的操作次数我们就叫它们fir和sec吧。初始化dp[0][0]={0,0}dp[0][0]=\{0,0\}dp[0][0]={0,0}可以发现一个比较显然的转移:dp[i][j]=merge(mergek<i−1dp[k][i−1],dp[i−len][i−1]∣(si

2020-12-03 16:41:18 134

原创 gym 100958 b

gym 100958 b若我们按照第一个字符将字符串分类,可以发现所有的字符串形如:a…a…b…b…b…..z…z…由于开头是a的一定比开头是b的小,所以这两类就可以分开考虑了,而同一类就只需要比一下后len−1len-1len−1个字符,这样就转换成了几个子问题。我们可以设dp状态为dpi,j,l,rdp_{i,j,l,r}dpi,j,l,r​表示sl,sl+1...sr−1,srs_l,s_{l+1}...s_{r-1},s_rsl​,sl+1​...sr−1​,sr​的第i位都

2020-12-03 13:42:38 101

原创 arc 048 d题解

arc 048 d假设要从sss到ttt,中途在iii的位置出去走到一个特殊点,然后再回来走到t。可以发现从i出去走到的关键点一定是距离i最近的那个关键点。首先处理出所有点到最近的关键点的距离,记为disidis_idisi​。则从i走到最近的那个关键点再走回i需要花费3×disi3\times dis_i3×disi​的时间。然后再分类讨论i的位置:在sss到lca(s,t)lca(s,t)lca(s,t)的路径上。则花费的时间为:2∗depth[s]−2∗depth[i]+depth[

2020-12-03 13:39:39 142 1

原创 arc 043 c题解

arc 043 c若我们另外弄两个数组a′a'a′和b′b'b′,其中a′[i]a'[i]a′[i]表示i在aaa中的位置,b′[i]b'[i]b′[i]表示i在b中的位置。则転倒距離就是有多少对(i,j)(i,j)(i,j)满足(i<j)(i<j)(i<j)且a′[i],a′[j]a'[i],a'[j]a′[i],a′[j]和b′[i]b'[i]b′[i]和b′[j]b'[j]b′[j]的大小关系不一样。这样就可以发现有解的充要条件就是A,BA,BA,B的転倒距離是偶数。首先求転倒

2020-12-03 12:52:21 93

原创 arc 045 d 题解

arc 045 d首先,有解的充要条件是什么?若我们将横坐标一样的merge起来,纵坐标一样的merge起来。有解的必要条件是每一个联通块的大小是偶数。那么怎么证明是充分的呢?我们可以将这些点一层一层的画出来:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MCmuSMrb-1606971023118)(https://ftp.bmp.ovh/imgs/2020/12/fc2f938505930d55.png)]若一行是没有连的点个数是偶数,就直接两两消除。不然就让那

2020-12-03 12:50:37 269

原创 ARC 109 (A-E 题解)

ARC 109 (A-E 题解)A简单分类讨论就好。B首先假设你需要买k个,则肯定使n+2−k,n+2−k+1,n+2−k+2......n+1n+2-k,n+2-k+1,n+2-k+2......n+1n+2−k,n+2−k+1,n+2−k+2......n+1这些。你把前k-1个都不需要切。再判定长度为n+1的能否切成n+2−kn+2-kn+2−k前面的。二分就行了。Cdpi,jdp_{i,j}dpi,j​表示从i开始j轮,剩下来的是什么?转移也很简单。D这题比较毒瘤。正常的做法:

2020-11-30 10:29:34 408

原创 [APIO2014]连珠线 题解

我们设初始的那个点为root。则所有的蓝色链都是形如father−now−sonfather-now-sonfather−now−son。我们设计两个dp状态: dpi,0dp_{i,0}dpi,0​表示i号点不作为蓝色链的中间点,dpi,1dp_{i,1}dpi,1​表示作为中间点。则以下的转移就非常容易了。dpi,0=∑max⁡(dpu,1+w,dpu,0)dp_{i,0}=\sum \max(dp_{u,1}+w,dp_{u,0})dpi,0​=∑max(dpu,1​+w,dpu,0​)dpi,

2020-11-30 09:56:55 135

原创 [APIO2018] New Home 新家 题解

[APIO2018] New Home 新家 题解传送门首先将时间离散化,然后依据时间建一棵线段树。将每一个店开业歇业时间搞到树上。这样问题就转化为:有一个数轴每次加入或删除一个点。每一个点有一个颜色。在任意时间询问某一个点距离某一种颜色的最远距离。到某一个颜色的距离为到这个颜色的点的最小距离。显然可以二分答案。每次询问区间[l,r][l,r][l,r]是否包含了所有颜色的点。对于每一个颜色我们搞一个set。记录每一个点到前面的那个同色的点,也就是前驱,记为pre[i]。这个玩意的充要条件是在区

2020-11-24 13:23:36 209

原创 AtCoder Regular Contest 108 (A-F) 题解

AtCoder Regular Contest 108 (A-F) 题解A枚举P的因子,时间复杂度O(p)O(\sqrt p)O(p​)B从前往后扫,维护一个栈,遇到一个完整的fox,就弹出。时间复杂度O(N)O(N)O(N)C搞一个生成树,根据父亲的颜色决定当前点的颜色。D分类讨论好题,????讨论每一种情况,看看字符串有多少形态?时间复杂度:O(n)O(n)O(n)E我们可以发现若l和r选择的话,则l,r内部的期望点数实际上与区间[l,r]外是无关的。所以用dp[l] [r]表

2020-11-22 22:10:09 197

原创 CERC 2017 gym 101620 Problem I: Intrinsic Interval

重要性质:若区间[l1,r1][l_1,r_1][l1​,r1​]合法,区间[l2,r2][l_2,r_2][l2​,r2​]也合法,其中满足l1<l2<r1<r2l_1<l_2<r_1<r_2l1​<l2​<r1​<r2​。可以轻轻松松证明:[l2,r1][l_2,r_1][l2​,r1​]也合法!也就是说若我们规定两个数L,R,其中对于所有>=R的位置i,求出在最大的xxx满足x<=L且,[x,i]合法。对于每一个i记录这个位置为x[

2020-11-20 23:55:12 126

原创 CF 1425 E. Excitation of Atoms 题解

CF 1425 E. Excitation of Atoms 题解一个FST好题! ????我们先分情况讨论。k=0,这没啥好说的,枚举每一个位置即可。k=1,比较复杂。。k=2,还是比较复杂。。k=3……k很多的时候就非常复杂了,我们可以先摸索摸索策略。由于n没有出边,所以你激活n的时候不会影响到其它的原子。所以我们尽量不直接激活n。假设前n-1个原子中di最小的是j。我们能否只激活j,然后就激活了所有呢?我们可以这样构造:1->2->…->j->j+1

2020-11-20 23:29:27 122

原创 AGC 049 总结+ABCD题解

AGC 049 总结+ABCD题解比赛链接赛况:202 Gary{\color{Yellow} \textrm{Gary} }Gary1800(4)187:231800 (4)\\187:231800(4)187:2340051:51400\\51:5140051:5160048:32600\\48:3260048:32800(4)167:23800 (4)\\167:23800(4)167:23---A - Erasing Vertices这

2020-11-20 11:51:52 547

原创 csacademy Squared Ends 题解(动态凸包/李超树/分治/二进制技巧)

csacademy Squared Ends 题解(动态凸包/李超树/分治/二进制技巧)题目链接首先这是一个比较明显的dp题:dpi,jdp_{i,j}dpi,j​表示前i个分成j段的最优解。dpi,j=min⁡(dpk,j+(ak+1−ai)2)=min⁡(dpk,j+ak+12−2×ak+1×ai)+ai2dp_{i,j}=\min(dp_{k,j}+(a_{k+1}-a_i)^2)=\min (dp_{k,j}+a_{k+1}^2-2\times a_{k+1}\times a_i)+a_i

2020-11-12 11:26:07 160

原创 Polynomials 题解

Polynomials 题解题意:给定 n 个形如$ yi(x) = a_0 + a_1x + a_2x^2 + a_3x^3 $的函数以及 q 个询问。每个询问给定整数 t,你 需要求出使得 yi(t) 最小化的函数 yi。题解:由于李超线段树只可以维护函数间最多只有一个交点的情况,由于这里的三次函数可能会有多个交点,所以这里就没办法直接使用李超树了。我们可以分治来解决,先处理好左半边函数在每一个区间内取得最小值的函数,和右半边函数在每一个区间内取得最小值的函数,可以存在一个vector中,

2020-11-11 23:12:52 640

原创 dp on 凸壳总结&gym 101806 T Touch The Sky 题解

dp on 凸壳总结&gym 101806 T Touch The Sky 题解我也不知道这个玩意究竟叫什么。。。。对于这样的dp问题:dpi,j=min⁡(dpi−1,j,dpi−1,j−1+wi)dp_{i,j}=\min (dp_{i-1,j},dp_{i-1,j-1}+w_i)dpi,j​=min(dpi−1,j​,dpi−1,j−1​+wi​),(for example :Touch The Sky)求任意的dpi,jdp_{i,j}dpi,j​。可以发现dpidp_{i}d

2020-11-10 23:51:28 187

空空如也

空空如也

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

TA关注的人

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