09 2018 档案

摘要:显然贪心地有尽量先往容量大的背包里放。设f[i]为i子集物品最小占用背包数,g[i]为该情况下最后一个背包的剩余容量,转移显然。 阅读全文
posted @ 2018-09-30 12:00 Gloid 阅读(187) 评论(0) 推荐(0)
摘要:每次询问所获得的可以看做是两个前缀和的异或。我们只要知道任意前缀和的异或就可以得到答案了。并且显然地,如果知道了a和b的异或及a和c的异或,也就知道了b和c的异或。所以一次询问可以看做是在两点间连边,所要求的东西就是最小生成树了。 阅读全文
posted @ 2018-09-29 15:03 Gloid 阅读(119) 评论(0) 推荐(0)
摘要:对合并过程建树。然后只需要按照时间顺序考虑每个反应就行了,时间顺序根据lca的深度确定。 阅读全文
posted @ 2018-09-29 13:17 Gloid 阅读(191) 评论(0) 推荐(0)
摘要:考虑对于每一个点维护子树内与其连通的点的信息。为了换色需要,记录每个点黑白两种情况下子树内连通块的大小。 查询时,找到深度最浅的同色祖先即可,这可以比较简单的树剖+线段树乱搞一下(似乎就是qtree3),具体的,可以维护一下区间是否全黑/白,线段树上二分。换色会造成一个连通块分裂并产生新连通块,这只 阅读全文
posted @ 2018-09-29 03:15 Gloid 阅读(201) 评论(0) 推荐(0)
摘要:不是很懂为什么数据范围要开的这么诡异,想到正解都不敢写。用类似NOI2014动物园的方法,对每个后缀求出类似next的数组即可。 阅读全文
posted @ 2018-09-28 18:59 Gloid 阅读(190) 评论(0) 推荐(0)
摘要:显然可以转化为一个阶梯状01矩阵每行每列取一个使权值和为k的方案数。直接做不可做,考虑设f[i][j]为前i行权值和至少为j,即在其中固定了j行选1的方案数。设第i行从1~a[i]列都是1且a[i]+1列是0,则f[i][j]=f[i-1][j]+f[i-1][j-1]*(a[i]-j+1)。剩下的 阅读全文
posted @ 2018-09-28 02:33 Gloid 阅读(165) 评论(0) 推荐(0)
摘要:看到数据范围就可以猜到数位dp了。显然对于一个数最后移到的位置应该是其中位数。于是考虑枚举移到的位置,那么设其左边和为l,左右边和为r,该位置数为p,则需要满足l+p>=r且r+p>=l。同时为了防止重复,枚举的应该是最左的能移到的位置,那么还需要满足l<p+r。算的时候枚举p、l、r,统计方案数, 阅读全文
posted @ 2018-09-27 22:54 Gloid 阅读(136) 评论(0) 推荐(0)
摘要:不明白在某谷上是怎么标到紫的。二分答案或者发现答案就是最大逆序差的一半。 阅读全文
posted @ 2018-09-27 12:24 Gloid 阅读(98) 评论(0) 推荐(0)
摘要:显然确定一个点的权值后整棵树权值确定。只要算出根节点的权值就能知道两种改法是否等价。 乘的话显然会炸,取log即可。map似乎会出一些问题,sort即可。 阅读全文
posted @ 2018-09-27 00:42 Gloid 阅读(118) 评论(0) 推荐(0)
摘要:容易发现通配符中间的部分可以任意匹配,会造成的无法匹配的仅仅是前后缀,前缀和后缀可以分别独立处理。如果字符串均有通配符,只需要按前/后缀长度排序然后暴力匹配就可以了。 问题在于存在无通配符的字符串。显然首先这些字符串需要相同。剩下的字符串只要都能与该字符串匹配即可。然后就不会了。想了半天去看题解…… 阅读全文
posted @ 2018-09-26 23:59 Gloid 阅读(157) 评论(0) 推荐(0)
摘要:设f[i]为i在子树内不与充电点连通的概率。则f[i]=(1-pi)·∏(1-qk+qk·f[k])。 然后从父亲更新答案。则f[i]=f[i]·(1-qfa+qfa*f[fa]/(1-qfa+qfa*f[i]))。 比较好想的dp。注意第二个式子可能会除0。 阅读全文
posted @ 2018-09-26 19:51 Gloid 阅读(160) 评论(0) 推荐(0)
摘要:可以发现每次都对后缀+1是不会劣的。考虑dp:设f[i][j]为前i个数一共+1了j次时包含第i个数的LIS长度。则f[i][j]=max(f[i][j-1],f[k][l]+1) (k<i,l<=j,a[i]+j>=a[k]+l)。容易发现这里是二维偏序,相当于查询(j,a[i]+j)左下部分的最 阅读全文
posted @ 2018-09-26 19:31 Gloid 阅读(211) 评论(0) 推荐(0)
摘要:之前听说过一种dp套dp的trick,大致是用另一个dp过程中用到的一些东西作为该dp的状态。这个题比较类似。 考虑求LIS时用到的单调队列。设f[S]为所选取集合为S的方案数,其中在单调队列内的标2不在的标1。转移时考虑选择一个数是否合法,这只需要保证LIS长度不超过k且所给数的相对顺序不变。 注 阅读全文
posted @ 2018-09-26 13:03 Gloid 阅读(392) 评论(0) 推荐(0)
摘要:对每个质因子分开计算再乘起来。使用类似生成函数的做法就很容易统计了。 阅读全文
posted @ 2018-09-25 18:50 Gloid 阅读(152) 评论(0) 推荐(0)
摘要:kruskal重构树本质就是给并查集显式建树来替代可持久化并查集。将边按困难度从小到大排序后建出该树,按dfs序建主席树即可。查询时跳到深度最浅的满足在该重要度下已被合并的点,在子树内查询第k大。 阅读全文
posted @ 2018-09-25 00:17 Gloid 阅读(147) 评论(0) 推荐(0)
摘要:最后翻为0和1本质相同,只考虑一种。显然每个硬币最多翻一次。考虑设xi,j表示i,j位置的硬币是否翻,那么很容易就可以列出异或方程组。变量和方程都有n2个,那么解是唯一的,就不用考虑怎样最小化了。然而暴力高斯消元肯定是不行的。 考虑将所有关于xi,k和xk,j的方程叠加,由于n是偶数,可以得到xi, 阅读全文
posted @ 2018-09-24 22:54 Gloid 阅读(120) 评论(0) 推荐(0)
摘要:如果只有一个人的话很容易想到最大流,正常桥连限流inf双向边,危桥连限流2双向边即可。现在有两个人,容易想到给两起点建超源两汇点建超汇,但这样没法保证两个人各自到达自己要去的目的地。于是再超源连一个人的起点和另一个人的终点跑一遍,两次都满流说明有解。证明脑(bu)补(hui)。 阅读全文
posted @ 2018-09-24 20:05 Gloid 阅读(151) 评论(0) 推荐(0)
摘要:容易发现的一点是如果确定了每一层有哪些点,树的形态就确定了。问题变为划分bfs序。 考虑怎样划分是合法的。同一层的点在bfs序中出现顺序与dfs序中相同。对于dfs序中相邻两点依次设为x和y,y至多在x的下一层。特殊的,根单独作为一层。 这些条件显然是必要的,考虑一种构造方案:对于某个点,如果其在d 阅读全文
posted @ 2018-09-24 17:29 Gloid 阅读(183) 评论(0) 推荐(0)
摘要:给a做一个前缀和,那么现在每次所查询的就是(sn-sk)/(bn+nd-(k+1)d)的最大值。这个式子可以看成是(bn+nd,sn)和((k+1)d,sk)所成直线的斜率。 脑补一条直线不断减小斜率,容易发现可能成为最大值的点一定在下凸壳上。并且凸壳上的点和该点间的斜率变化情况是一个凸函数。于是维 阅读全文
posted @ 2018-09-24 14:30 Gloid 阅读(145) 评论(0) 推荐(0)
摘要:注意到n很小,考虑枚举i。现在要求的是f(n,m)=Σφ(in) (i=1~m)。显然当n没有平方因子时,φ(in)=φ(i)·φ(n/gcd(i,n))·gcd(i,n)。利用φ*1=id又可得φ(i,n)=φ(i)·Σφ(n/d) (d|gcd(i,n))。改为枚举d就可以得到f(n,m)=Σφ 阅读全文
posted @ 2018-09-24 10:41 Gloid 阅读(166) 评论(0) 推荐(0)
摘要:因为不会SAM,考虑SA。将所有串连起来并加分隔符,每次考虑计算以某个位置开始的子串有多少个合法。 对此首先二分答案,找到名次数组上的一个区间,那么只需要统计有多少个所给串在该区间内出现就可以了。这是一个主席树的经典问题,对每个数找到上次出现位置扔进去即可。这样就做到O(nlog2n)了。 可以进一 阅读全文
posted @ 2018-09-23 19:05 Gloid 阅读(264) 评论(0) 推荐(0)
摘要:直接维护选k个子段时的最优解似乎也可以做,然而复杂度是O(nk2logn),显然跑不过。 考虑一种费用流做法。序列里每个点拆成入点和出点,源连入汇连出,入点和出点间连流量1费用ai的边,相邻点出点向入点连流量1费用0的边,整体限流k。 直接跑当然还不如暴力。观察一下这个做法是在干啥:每次选择费用最大 阅读全文
posted @ 2018-09-23 00:30 Gloid 阅读(419) 评论(0) 推荐(0)
摘要:二维的dp非常显然,但这也没有什么优化的余地了。 注意到最后的方案中只有产生贡献的位置是有用的,剩下的部分可以在该范围内任意选取。 所以我们考虑设f[i]为i号位最后产生贡献的答案,则f[i]=max{f[j]+1} (i-j>=a[i]-a[j],a[i]>a[j])。 观察这个限制,即为i-a[ 阅读全文
posted @ 2018-09-22 16:38 Gloid 阅读(219) 评论(0) 推荐(0)
摘要:容易发现这是一个有各种玄妙性质的完全背包计数。 对于每个质数,将其选取个数写成ax+b的形式,其中x=S/pi,0<b<x。那么可以枚举b的部分提供了多少贡献,多重背包计算,a的部分直接组合数即可。多重背包计数可以前缀和优化。 阅读全文
posted @ 2018-09-22 15:22 Gloid 阅读(232) 评论(0) 推荐(0)
摘要:考虑对于每一个x有多少个合法解。得到ax+by=c形式的方程。如果gcd(x,y)|c,则a在0~y-1范围内的解的个数为gcd(x,y)。也就是说现在所要求的是Σ[gcd(x,P)|Q]*gcd(x,P)。 对这个式子套路地枚举gcd,可以得到Σdφ(P/d) (d|gcd(P,Q))。质因子间相 阅读全文
posted @ 2018-09-21 22:21 Gloid 阅读(275) 评论(0) 推荐(0)
摘要:显然当x中没有相邻的1时该式成立,看起来这也是必要的。 于是对于第一问,数位dp即可。第二问写出dp式子后发现就是斐波拉契数列,矩阵快速幂即可。 阅读全文
posted @ 2018-09-21 18:22 Gloid 阅读(200) 评论(0) 推荐(0)
摘要:一通正常的莫比乌斯反演后,我们只需要求出g(n)=Σf(d)*μ(n/d)的前缀和就好了。 考虑怎么求g(n)。当然是打表啊。设n=∏piai,n/d=∏pibi 。显然若存在bi>1则这个d没有贡献。考虑bi为0和1两种情况。如果只看ai最小的质因子的选取情况,会发现大部分情况下其是0还是1,对f 阅读全文
posted @ 2018-09-20 22:27 Gloid 阅读(167) 评论(0) 推荐(0)
摘要:将串反过来就变成查询前缀了。考虑建一棵可持久化trie,查询时二分答案,均摊一下复杂度即为O(mlogn)。 阅读全文
posted @ 2018-09-20 19:56 Gloid 阅读(173) 评论(0) 推荐(0)
摘要:容易发现只要图中有非链部分则无解。剩下就非常简单了。 阅读全文
posted @ 2018-09-20 19:07 Gloid 阅读(115) 评论(0) 推荐(0)
摘要:如果将森林里每棵树都各自看做一个点,那么最后所连成的树应该是一颗菊花,否则将叶子节点父亲改为根不会更劣。 对于每个点所代表的树,其和根节点相连的点应该是到其他点距离最大值最小的点。这个点显然是直径的中点。而距离最大值就可以作为点的权值了。 显然根节点应该是权值最大的。这样连完后讨论一下答案即可。 阅读全文
posted @ 2018-09-20 13:27 Gloid 阅读(109) 评论(0) 推荐(0)
摘要:这个做法非常显然。 当然也可以分块。预处理出块内答案和两块间答案,块外主席树查询。 阅读全文
posted @ 2018-09-19 23:19 Gloid 阅读(123) 评论(0) 推荐(0)
摘要:考虑贪心,每次选价值最大的链。选完之后对于链上点dfs序暴力修改子树。因为每个点最多被选一次,复杂度非常正确。 阅读全文
posted @ 2018-09-19 22:30 Gloid 阅读(163) 评论(0) 推荐(0)
摘要:将两个人各自所在点视为状态,新建一个图。到达某个终点的概率等于其期望次数。那么高斯消元即可。 阅读全文
posted @ 2018-09-19 22:01 Gloid 阅读(175) 评论(0) 推荐(0)
摘要:以传统的维护思路特别不可做。完全想不到的一点是,如果构造一个int内的数列使其中任意三个数都不能构成三角形,项数最多的方案显然是斐波拉契数列,而斐波拉契数列的项数显然是log级的。那么我们求出询问点之间的距离,如果超过项数直接输出,否则暴力判断即可。 开始算距离的时候没把lca*2调了半天,而且明明 阅读全文
posted @ 2018-09-19 20:05 Gloid 阅读(160) 评论(0) 推荐(0)
摘要:考虑奇技淫巧。 首先是k=2。对向量维护一个前缀和,每次将当前向量与前缀和点乘。如果点乘结果不等于i-1&1,说明当前向量至少和之前的某个向量的数量积是2的倍数,暴力找就可以了。当然等于i-1&1也不一定就不存在,这本质上还是个随机算法,于是先random_shuffle一下。 k=3时,注意到12 阅读全文
posted @ 2018-09-19 19:28 Gloid 阅读(133) 评论(0) 推荐(0)
摘要:可以看做一些物品中某些互相排斥求最大价值。如果这是个二分图的话,就很容易用最小割了。 观察其给出的条件间是否有什么联系。如果两个数都是偶数,显然满足条件二;而若都是奇数,则满足条件一,因为式子列出来发现一定不能写成完全平方数。那么这就是个二分图了。 阅读全文
posted @ 2018-09-19 00:32 Gloid 阅读(145) 评论(0) 推荐(0)
摘要:数独立集显然是可以树形dp的,问题在于本质不同。 假设已经给树确立了一个根并且找到了所有等效(注意是等效而不是同构)子树,那么对转移稍加修改使用隔板法就行了。 关键在于找等效子树。首先将树的重心(若有两个则加一个点作为唯一重心)作为根。这样任意极大等效子树(比如某两个等效子树里面的一部分等效,那么里 阅读全文
posted @ 2018-09-18 23:13 Gloid 阅读(215) 评论(0) 推荐(0)
摘要:容易发现如果求出最后的序列,只要算一下LIS就好了。序列用平衡树随便搞一下,这里种一棵splay。 阅读全文
posted @ 2018-09-18 19:28 Gloid 阅读(202) 评论(0) 推荐(0)
摘要:由二项式定理,(m+1)k=ΣC(k,i)*mi。由此可以构造矩阵转移,将mi*ik全部塞进去即可,系数即为组合数*m。复杂度O(m3logn),因为大常数喜闻乐见的T掉了。 #include<iostream> #include<cstdio> #include<cmath> #include<c 阅读全文
posted @ 2018-09-18 13:39 Gloid 阅读(225) 评论(0) 推荐(0)
摘要:设f[i]为在i放置守卫塔时1~i的最小花费。那么显然f[i]=min(f[j]+(i-j)*(i-j-1)/2)+a[i]。 显然这是个斜率优化入门题。将不与i、j同时相关的提出,得f[i]=min(f[j]+j*(j+1)/2-ij)+i*(i-1)/2+a[i]。 套路地,假设j>k且j转移优 阅读全文
posted @ 2018-09-17 23:01 Gloid 阅读(163) 评论(0) 推荐(0)
摘要:最小割树:新建一个图,包含原图的所有点,初始没有边。任取两点跑最小割,给两点连上权值为最小割的边,之后对于两个割集分别做同样的操作。最后会形成一棵树,树上两点间路径的最小值即为两点最小割。证明一点都不会。 那么这个题就很好做了,连树都不用建。 阅读全文
posted @ 2018-09-17 21:57 Gloid 阅读(196) 评论(0) 推荐(0)
摘要:考虑差分序列。每个差分序列的贡献是n-差分序列的和,即枚举首项。将式子拆开即可得到n*mk-1-Σi*cnt(i),cnt(i)为i在所有差分序列中的出现次数之和。显然每一个数出现次数是相同的,所以cnt(i)即等于(k-1)*mk-2。于是就很好算了。 阅读全文
posted @ 2018-09-17 21:11 Gloid 阅读(148) 评论(0) 推荐(0)
摘要:必修五题。 阅读全文
posted @ 2018-09-17 16:13 Gloid 阅读(126) 评论(0) 推荐(0)
摘要:考虑异或最短路应该怎么求。那么这是个WC原题,dfs一遍找到所有有用的环丢进线性基即可,因为每一个环的权值都是可以取到且不对其他部分产生影响的。 现在给了一棵树,不妨就把他看做原图的dfs树。每增加一条边就是增加了一个环。算出权值后,现在问题变为求一个数和任选一段区间里的数的最大异或值。 比较暴力的 阅读全文
posted @ 2018-09-17 12:27 Gloid 阅读(514) 评论(0) 推荐(0)
摘要:A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int 阅读全文
posted @ 2018-09-16 22:39 Gloid 阅读(210) 评论(0) 推荐(0)
摘要:显然1的位置确定了整个矩阵,每一段连续的数即是对该位置的限制。化一下式子可以发现是一段区间或一段区间的补集,最后要求的是他们的交。看起来不太好求,于是转为求补集的并,那么排个序就完了。 阅读全文
posted @ 2018-09-16 18:33 Gloid 阅读(136) 评论(0) 推荐(0)
摘要:11……1(n个)=99……9(n个)/9=(10n-1)/9。 那么显然就是求离散对数了,BSGS即可。 阅读全文
posted @ 2018-09-16 17:12 Gloid 阅读(135) 评论(0) 推荐(0)
摘要:由于n!是m!的倍数,而对于每个与m!互质且小于m!的数x,x+m!、x+2*m!……也与其互质,所以答案即为(n!/m!)*φ(m!)。 φ(m!)=m!*∏(1-1/pi)。其中的pi即为1~m中所有质数。那么这个前缀积就可以预处理了。 当n、m大于p的时候是可能有问题的,数据里没有就懒得讨论了 阅读全文
posted @ 2018-09-16 16:14 Gloid 阅读(128) 评论(0) 推荐(0)
摘要:注意到等级的变化最多有nm次。于是考虑比较暴力的做法,线段树维护每个区间内每个等级角色的最大经验值,区间加时看有没有可以升级的,如果有则暴力向两边递归,否则打上标记。复杂度O(nmlogn)。 似乎有更优的做法。 阅读全文
posted @ 2018-09-15 17:13 Gloid 阅读(165) 评论(0) 推荐(0)
摘要:考虑有序选择各子集,最后除以m!即可。设f[i]为选i个子集的合法方案数。 对f[i]考虑容斥,先只满足所有元素出现次数为偶数。确定前i-1个子集后第i个子集是确定的,那么方案数为A(2n-1,i-1)。 显然不能为空集,于是去掉前i-1个已经满足限制的方案,也即f[i-1]。 然后去掉第i个子集和 阅读全文
posted @ 2018-09-15 00:16 Gloid 阅读(131) 评论(0) 推荐(0)
摘要:显然答案只与a、b、c中各自1的个数及位数有关。a、b只考虑前i位怎么填时,c最多在第i+1位上为1,而第i+1位及之后的a、b怎么填都不会对前i位造成影响。于是设f[n][i][j][k][0/1]表示只考虑前n位,a用i个1,b用j个1,c用k个1,且c的第n+1位为0/1时的最小值。转移时枚举 阅读全文
posted @ 2018-09-14 20:03 Gloid 阅读(136) 评论(0) 推荐(0)
摘要:考虑暴力树剖。那么修改路径和查询子树最小值非常简单。 对于换根当然不能真的给他转一下,我们只记录当前根是哪个。对于查询,如果查询点不在当前根到原根的路径上,显然换根是对答案没有影响的;如果是当前根,答案就是整棵树最小值,否则即是要查询该路径上的后代所在子树外的点的最小值,去掉这段区间就可以了。 阅读全文
posted @ 2018-09-14 13:37 Gloid 阅读(118) 评论(0) 推荐(0)
摘要:令f[i][0/1/2][0/1]表示前i位,不存在满足要求的B串和W串/存在满足要求的B串不存在W串/存在满足要求的B串和W串,第i位填的是B/W的方案数。转移时考虑连续的一段填什么。大讨论一波后瞎优化一波就成线性的了。k=1应该是要特判一下的不过数据里没有那就不管了。 成功的把这么短的题面都看错 阅读全文
posted @ 2018-09-14 02:26 Gloid 阅读(135) 评论(0) 推荐(0)
摘要:由于Bi<=7,考虑状压。 如果考虑前i个位置的话,状态里需要压入前7个人后7个人,显然是跑不动的。 那么改成考虑前i个人。于是设f[i][j][k]表示前i个人都已吃完饭,i+1后面7个人的吃饭状态为j,最后一个吃饭的人是k的答案。转移时考虑下一个吃饭的是谁即可。 a|b-a&b=a^b。当然没什 阅读全文
posted @ 2018-09-13 20:03 Gloid 阅读(134) 评论(0) 推荐(0)
摘要:将图中的环的长度定义为正向边数量-反向边数量,那么答案一定是所有环的环长的共同因子。dfs一下就能找到图中的一些环,并且图中的所有环的环长都可以由这些环长加加减减得到(好像不太会证)。如果有环长为1或2则无解。 没有环的话图就是一个有向树。类似定义链的长度,那么一个连通块内答案就是最长链,也即dfs 阅读全文
posted @ 2018-09-13 00:09 Gloid 阅读(184) 评论(0) 推荐(0)
摘要:考虑树的部分分怎么做。令f[i]为i向子树内走的期望路径长度,转移比较显然。算答案时先把其父亲的答案弄好就可以统计自己的答案了。 环套树也类似。树里直接dp,对环上点暴力考虑环上的每条路径,算完后再在树里统计答案。 说起来不是很难。事实上想清楚了也确实不是很难。 不明白为什么不管啥题我都能把代码写的 阅读全文
posted @ 2018-09-12 19:59 Gloid 阅读(217) 评论(0) 推荐(0)
摘要:动态图的连通性当然是可以用LCT维护的。但这相当的不优美,毕竟这样做没有用到任何该图的性质,LCT自带的大常数也会使其跑得非常慢。 考虑用线段树维护区间左右端四个点之间各自的连通性(仅经过该区间内路径)。查询时考虑几种绕来绕去的情况。 剩下的是大讨论。 阅读全文
posted @ 2018-09-12 13:45 Gloid 阅读(153) 评论(0) 推荐(0)
摘要:暴力枚举路径中权值最小边是哪个,然后求出边权不小于它的边的最小生成树,即可保证该路径上最大值最小。暴力当然可以过,这里使用LCT维护。注意数据中有自环。 阅读全文
posted @ 2018-09-11 14:11 Gloid 阅读(231) 评论(0) 推荐(0)
摘要:容易想到网络流。将每个人拆成0和1两个点。若某人值为0的话则让源连向0,否则让1连向汇,流量为1。相互认识的人之间01各自连边。跑最小割即可。 阅读全文
posted @ 2018-09-11 01:14 Gloid 阅读(204) 评论(0) 推荐(0)
摘要:A:签到 B:大讨论。想清楚的话可以写的更优美一点。 C:大力数位dp。还可以把所有合法数都找出来然后二分找答案。 D:B题难度。双指针移动,若匹配上则ans++。 E:gcd一下求出线段上整点数量再暴力算交点去重即可。没有写,据说很卡精度。 F:可以发现所求的就是存在k>1,k∈N*使开k次方为整 阅读全文
posted @ 2018-09-10 13:34 Gloid 阅读(133) 评论(0) 推荐(0)
摘要:对矩阵进行高斯消元直至消为单位矩阵,并在另一个单位矩阵上对其做同样的操作即可。 模意义下的高斯消元可以直接计算系数来避免整行的辗转相除。 还不知道有什么用。 阅读全文
posted @ 2018-09-09 22:08 Gloid 阅读(298) 评论(0) 推荐(0)
摘要:由数据范围容易想到网络流。由于操作只是对于棋盘上相邻两格,容易想到给其黑白染色。 假设已经知道最后要变成什么数。那么给黑白点之间连边,其流量则表示同时增加的次数,再用源汇给其限流为需要增加的数即可。 考虑最后应该变成什么数。 如果棋盘中黑白格子数量不同,设最后变成的数是x,则x*黑格数量-黑格数字和 阅读全文
posted @ 2018-09-09 20:21 Gloid 阅读(151) 评论(0) 推荐(0)
摘要:首先显然可以把所有能到的点拎出来建个新图,这样第一问也就做好了。 剩下的部分似乎是一个裸的最小树形图。但显然这个东西是没什么学的必要的并且不太能跑过去。 考虑建出来的图有什么性质。可以发现如果没有高度相等的点这就是个DAG。DAG的最小树形图只需要每个点选一条最短入边即可,最优性显然。或者说是将边从 阅读全文
posted @ 2018-09-09 17:27 Gloid 阅读(169) 评论(0) 推荐(0)
摘要:容易发现有了交换相邻字符的操作后,只要字符串所含有的字符种类和数量相同其就是等价的。这样的状态只有n^3级别,将其抽象成点子串变换抽象成边后就是求最长路径了,缩点dp解决。 码量巨大,不是很明白要怎样才能用3k写完。 阅读全文
posted @ 2018-09-09 13:39 Gloid 阅读(218) 评论(0) 推荐(0)
摘要:先考虑B国。容易发现a xor b mod 2=0即二进制末位相同,那么可以据此将所有人分成两部分,每一部分各自是一个完全图。然后再将a or b有奇数个1的边连上,现在需要求的就是这样一个图里的最大团。我们知道最大团=反图最大独立集,这个图的反图显然是一个二分图,那么跑二分图匹配就可以求出这个了。 阅读全文
posted @ 2018-09-08 17:47 Gloid 阅读(141) 评论(0) 推荐(0)
摘要:不妨把求φ抽象成把将每个位置上的一个小球左移一格并分裂的过程,那么即求所有球都被移到1号格子的步数。 显然要达到1必须先到达2。可以发现每次分裂一定会分裂出2号位的球,因为2以外的质数一定是奇数。以及,每次移动至多将一个2号位的球移至1号位。 于是我们只要数出每个位置能将几个球分裂至2号位就可以了。 阅读全文
posted @ 2018-09-08 15:10 Gloid 阅读(151) 评论(0) 推荐(0)
摘要:如果能够把所有区间内第二次出现某颜色的位置标记出来,树状数组查询一下就可以了。 考虑离线。按左端点从小到大排序,不断移动左端点并更新第二次出现的位置。 阅读全文
posted @ 2018-09-08 12:37 Gloid 阅读(117) 评论(0) 推荐(0)
摘要:显然做个前缀和之后变成询问区间内两个数异或最大值。 一种暴力做法是建好可持久化trie后直接枚举其中一个数查询,复杂度O(nmlogv)。 观察到数据范围很微妙。考虑瞎分块。 设f[i][j]为第i个块中的数和第j个数的异或最大值。显然建一棵可持久化trie就可以以O(n√nlogv)的复杂度搞出来 阅读全文
posted @ 2018-09-08 02:12 Gloid 阅读(145) 评论(0) 推荐(0)
摘要:完全想不到的第一步是构造一个矩阵,使得每行构成公比为3的等比数列,每列构成公比为2的等比数列。显然矩阵左上角的数决定了这个矩阵,只要其取遍所有既不被2也不被3整除的数那么所得矩阵的并就是所有的数了,并且显然不会有重复。 现在要满足题目要求只需要使在矩阵中选取的数不相邻。显然这可以用状压dp以4^n* 阅读全文
posted @ 2018-09-07 20:11 Gloid 阅读(164) 评论(0) 推荐(0)
摘要:容易发现x nand x=not x。并且使用这个性质有x and y=not(x nand y)=(x nand y)nand(x nand y)。也就是说nand运算可以作为not和and运算使用。并且显然not和and运算可以表示nand运算,那么两者等价。事实上这就可以表示所有位运算了。 那 阅读全文
posted @ 2018-09-06 22:55 Gloid 阅读(138) 评论(0) 推荐(0)
摘要:组合入门题。高精度入门题。 阅读全文
posted @ 2018-09-06 13:03 Gloid 阅读(171) 评论(0) 推荐(0)
摘要:有(x+y)n!=xy。套路地提出x和y的gcd,设为d,令ad=x,bd=y。则有(a+b)n!=abd。此时d已是和a、b无关的量。由a与b互质,得a+b与ab互质,于是将a+b除过来得n!=abd/(a+b)。d/(a+b)可取的值不受a、b限制,那么只要满足ab|n!(a⊥b)就可以了。 将 阅读全文
posted @ 2018-09-06 12:57 Gloid 阅读(182) 评论(0) 推荐(0)
摘要:考虑使非剪刀石头布情况尽量少。设第i个人赢了xi场,那么以i作为赢家的非剪刀石头布情况就为xi(xi-1)/2种。那么使Σxi(xi-1)/2尽量小即可。 考虑网络流。将比赛建成一排点,人建成一排点,每场未确定比赛向比赛双方连边,确定比赛向赢者连边,这样就是一种合法的比赛方案了。 在此基础上控制代价 阅读全文
posted @ 2018-09-06 01:07 Gloid 阅读(191) 评论(0) 推荐(0)
摘要:考虑暴力dp:f[i][j]表示i个数值域1~j时的答案。考虑使其值域++,则有f[i][j]=f[i][j-1]+f[i-1][j-1]*i*j,边界f[i][i]=i!*i!。 注意到值域很大,考虑能不能在这一维上优化。完全不会证地有f[i][j]是一个关于j的2i次多项式。那么dp出一部分后就 阅读全文
posted @ 2018-09-05 22:34 Gloid 阅读(325) 评论(0) 推荐(0)
摘要:先不考虑只有一个显得有些特殊的天兵。 可以发现超能力的作用实质上是使兵更换职业。每一个兵到达某个位置最少需要更换职业的次数是彼此独立的,因为如果需要某两人互换职业可以使他们各自以当前职业到达需要到的地方,不会造成其中一个次数增加。 于是预处理出每个兵到达每个位置的最少代价。之后二分答案,把每个兵向可 阅读全文
posted @ 2018-09-04 22:21 Gloid 阅读(330) 评论(0) 推荐(0)
摘要:如果对某个点能求出与其相邻的所有点到达出口的最短时间,那么该点的答案就可以在其中取次小值了。 对于dijkstra魔改一下就能做到这个。初始时将所有出口的最短时间设为0并放入堆,记录最短和次短路径,每个点更新后将次短路径入堆。 阅读全文
posted @ 2018-09-04 14:13 Gloid 阅读(207) 评论(0) 推荐(0)
摘要:考虑kruskal的过程:按边权从小到大考虑,如果这条边的两端点当前不连通则将其加入最小生成树。由此可以发现,某条边可以在最小生成树上的充要条件是其两端点无法通过边权均小于它的边连接。 那么现在我们需要删一些边使两点不连通,显然是最小割。对最小和最大分别做一次即可。 阅读全文
posted @ 2018-09-04 01:40 Gloid 阅读(124) 评论(0) 推荐(0)
摘要:考虑对一个串如何分割能取得最大值。那么这是一个经典的线段覆盖问题,显然每次取右端点尽量靠前的串。于是可以把串放在AC自动机上跑,找到一个合法串后就记录并跳到根。 然后考虑dp。设f[i][j]表示前i位走到AC自动机上j节点的概率,枚举下个字符即可转移。同时记录此时期望伤害,找到合法串就统计入答案。 阅读全文
posted @ 2018-09-04 00:09 Gloid 阅读(138) 评论(0) 推荐(0)
摘要:考虑维护f[k][x]表示“最低k位所表示的数不大于x”的数的个数。那么查询时答案就为f[k][2k-1]-f[k][2k-1-1]。 同时记录每个数在集合中出现多少次。这样的话插入、删除已经解决了,只剩下加操作。考虑对每一个k都将加操作带来的影响累计作为偏移量就可以了。 明明不知道在写什么结果1A 阅读全文
posted @ 2018-09-03 20:31 Gloid 阅读(138) 评论(0) 推荐(0)
摘要:与中位数有关的题二分答案是很常用的trick。二分答案之后,将所有大于它的看成1小于它的看成-1,那么只需要判断是否存在满足要求的一段和不小于0。 由于每个位置是1还是-1并不固定,似乎不是很好算。考虑暴力一点的想法:对于每一种答案预处理。这样查询就很好办了,线段树上每个区间维护最大前缀和后缀和及总 阅读全文
posted @ 2018-09-03 16:06 Gloid 阅读(112) 评论(0) 推荐(0)
摘要:将边权平均分到两顶点,按点权从大到小取即可。这样的话如果某人取到两点则获得边权,否则对两人均无影响,并且最后每条边都会处于其中的一种情况。假装证明了正确性。 阅读全文
posted @ 2018-09-03 01:58 Gloid 阅读(114) 评论(0) 推荐(0)
摘要:按价值从大到小考虑每个元素,维护一个线性基,如果向其中加入该元素的编号仍然构成线性基,则将其加入。 不会证明。当做线性基的一个性质吧。 阅读全文
posted @ 2018-09-02 19:06 Gloid 阅读(122) 评论(0) 推荐(0)
摘要:类似于平面最近点对,考虑分治,即分别计算分割线两侧的最小三角形再考虑跨过线的三角形。 复杂度证明也是类似的,对于某一个点,在另一侧可能与其构成最小三角形的点在一个d*d/2的矩形内(两边之和大于第三边),并且这些点所组成的三角形周长均不小于d。然而并不清楚这里至多会有多少个点,vfk曾说上界是16, 阅读全文
posted @ 2018-09-02 18:19 Gloid 阅读(142) 评论(0) 推荐(0)
摘要:显然可以dp。显然可以单调队列优化一下。 阅读全文
posted @ 2018-09-02 13:45 Gloid 阅读(165) 评论(0) 推荐(0)
摘要:一通套路之后得到 求出中间那个函数的前缀和的话就可以整除分块了。 暴力求的话复杂度其实很优秀了,大约在n~nlogn之间。 不过可以线性筛做到严格线性。考虑其最小质因子,如果是平方因子那么只有其有贡献,否则由于多了一个质因子,将函数值取反并加上该质因子贡献。 阅读全文
posted @ 2018-09-02 13:21 Gloid 阅读(149) 评论(0) 推荐(0)
摘要:显然可以状压dp。显然过不了。 考虑暴力模拟退火。每次随机改变一个数所属集合即可。 并不明白要怎么调参。 阅读全文
posted @ 2018-09-02 11:42 Gloid 阅读(177) 评论(0) 推荐(0)
摘要:如果能够知道不大于n的合法数有多少个,显然就可以二分答案了。 考虑怎么求这个。容易想到容斥,即枚举完全平方数。我们知道莫比乌斯函数就是此种容斥系数。筛出来就可以了。 注意二分时会爆int。 阅读全文
posted @ 2018-09-02 01:29 Gloid 阅读(196) 评论(0) 推荐(0)
摘要:大讨论。注意去重。 阅读全文
posted @ 2018-09-01 22:34 Gloid 阅读(201) 评论(0) 推荐(0)
摘要:考虑暴力,那么有f(n)=(f(n-1)*10digit+n)%m。注意到每次转移是类似的,考虑矩阵快速幂。首先对于位数不同的数字分开处理,显然这只有log种。然后就得到了f(n)=a·f(n-1)+b形式的递推式,可以矩阵快速幂。注意这里的b虽然是变化的,但每次变化量相同,给矩阵加一维就好了。 阅读全文
posted @ 2018-09-01 13:52 Gloid 阅读(163) 评论(0) 推荐(0)