- 博客(123)
- 收藏
- 关注

原创 OI中的一些注意事项
有关二分图最大匹配bool dfs(int u){ for(int i=h[u];i;i=e[i].p){ int v=e[i].v; if(vis[v])continue;//二分图匹配关心的应该是被匹配点的vis vis[v]=1; if((!link[v])||dfs(link[v])){ link[v]=u;return 1; } } return 0;...
2019-12-26 15:01:55
282
1
原创 2024HDU Contest 6 Problem 11
这条边的路径,我们有两种跨越方式:从0走到n-1,或者从n-1走到0。对于从0走到n-1的方式,我们从小往大遍历,记录前缀最大出点价值以及最长总路径值。对于n-1走到0的方式,我们从大往小遍历。前大半部分关于解决点在树上的做法并不是我研究的。Orz SYR and JYG.所以我们只需要分别求出作为入点的前缀最大值和作为出点的后缀最大值即可。中的一个节点(区别在于i号节点本身是入点还是出点)。,怎么计算在环上的每个点所能获得的最长路径。的节点,该路径只可能是从。中的一个节点出发走到。
2024-08-08 12:41:44
883
原创 2-SAT备忘(codeforces 1791H)
例题解法:每一列的三个式子中里至少要有两个为1。可以看成任意两个式子里要有一个为1,所以就是任意两个式子不能为0。一列等价于3条限制。建完图之后直接跑2-SAT就行。2-SAT本质上是将一些01变量间的限制关系以图的形式表现出来。在同一个SCC里则不可行。感性理解一下就是我们选了。然后判定可行解只需要对全图跑SCC,如果。并且在一长串路径后得到我们还得选。,我们会建两个点分别表示。然后我们定义一条限制。
2024-08-04 12:23:15
1176
原创 2023 CCPC Shenzhen M
首先有一个感性的想法是不处理大整数,而是将这些大整数都对质数取模变成普通整数。然而我们只能轻松地计算形如。可以发现其实是从低到高前k位不变,更高位向下平移了k位再相加。注意仅仅这样处理的话会漏掉。即加和出来的结果是确定的。全部对M取模,这样取模后再相加,符合要求的结果就只有。再进一步考虑,我们可以一开始将。的情况,只用在后续处理中加上。不确定的话就不好处理了。现在的问题变成了怎么让。
2024-08-03 10:16:43
1045
原创 2024HDU Contest 5 Problem 5
倍数的点,则这条边的答案至少为d。考虑到对于每条边我们只需要知道最大值,所以如果一条边已经在之前的。中被更新过答案,我们就可以将它合并起来。合并的过程可以通过并查集来实现。每条边只会被合并一次,然后枚举倍数的时间开销也是调和级数,所以总复杂度为。的倍数的点之后,将这些点之间的路径都遍历一遍并合并起来。所以总结下来做法就是枚举出编号为。从大到小枚举gcd的值。
2024-08-03 09:49:10
721
原创 2022 ccpc黑龙江省赛E题
题解好像有一些typo,不过问题不大。本题就是经典莫比乌斯反演套路题关键问题是读入a的时候要把aaa转化成f(a)f(a)f(a)具体的式子以后来补#include<bits/stdc++.h>using namespace std;#define int long longconst int mod=1e9+7;const int maxn=2e5+5,N=2e5;int mu[maxn],p[maxn],cnt,vis[maxn],f[maxn],b[maxn],n,mx;
2022-05-26 00:45:28
531
原创 异或运算(xor)在数学中是什么?
当我们对两个integer(十进制数)做异或运算(xor)时:以 11 异或 19 举例会首先将两个十进制数转化成二进制的:(11)10(11)_{10}(11)10=(1011)2(1011)_{2}(1011)2(19)10(19)_{10}(19)10=(10011)2(10011)_{2}(10011)2然后对相同二进制位进行考虑(不够的位补0):010110101101011100111001110011对于一个二进制位,两数在该位置上的数字相同,结果为0,否则结果为1所
2021-12-27 09:33:23
1321
原创 luogu T192681
题目链接较为简单的思路打表观察a,b,ca,b,ca,b,c三个数的特征,发现可以表示成i,p,qi,p,qi,p,q三个数相乘的形式:a=i∗p,b=i∗q,c=p∗qa=i*p,b=i*q,c=p*qa=i∗p,b=i∗q,c=p∗q。那么gcd(a,b,c)==1gcd(a,b,c)==1gcd(a,b,c)==1就可以转化成(先假设p,q两者互质):i与p∗q互质,即i与p,q分别互质(先假设p,q两者互质):i与p*q互质,即i与p,q分别互质(先假设p,q两者互质):i与p∗q互质,即i
2021-08-24 15:40:57
136
原创 囫囵吞枣地记录fread的简单用法(hdu 7010)
鉴于被某道题折磨了一天的读入,笔者终于决定使用fread(虽然结果从TLE变成了WA)inline char nc(){ static char buf[100005],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000,stdin),p1==p2)?EOF:*p1++;}inline int _read(){ char ch=nc();int sum=0; while(!(ch&g
2021-08-21 15:31:29
160
原创 ABC 214 F
题目地址题目大意有一个长度为n(n<=2∗105)n(n<=2*10^{5})n(n<=2∗105)的字符串,可以选择一些位置(这些位置不能相邻)组成新的子串(不能调换字符的相对位置),问一共可以选出多少种不同的子串,输出答案对1e9+71e9+71e9+7取模思考一般子序列的题都要靠dp解决?设f[i]f[i]f[i]为第iii个位置必须选的合法答案数量。第一种转移比较显然:f[i]=f[i]+f[j],(j==0∣∣j<i−1),其中f[0]=1f[i]=f[i]+
2021-08-20 16:12:05
200
原创 codeforces 1553D
一个与标答不同的想法首先,根据观察可知:如果我们从前往后匹配,当前匹配上了s 的第i个字符,那么下一个能匹配的一定是与当前位置i的奇偶性不同的位置。然后我们就分奇偶建立序列自动机,然后从头开始时枚举是从奇数位置开始还是偶数位置。普遍的坑点()...
2021-07-24 10:58:31
247
原创 枪侠(一道暴力题)
解法由于r−l<=10r-l<=10r−l<=10,所以考虑枚举每一段的长度len,又因为字符集并不大,根据抽屉原理,总共最多有51个段。所以我们枚举len,计算与每个点最早冲突的点的位置,就是把点按mod lenmod~~lenmod len分组。然后枚举起点,看每个起点可以往后扩展到什么位置:用st表维护当前选择的区间中最近的冲突位置,然后看是否可以把下一个段选进来。复杂度O(510∗n)O(510*n)O(510∗n)#inclu..
2020-05-27 16:59:51
183
原创 兔子的战役(最小割)
很久很久之前,树林里住着一群兔子。但是不幸的时,森林里还有一匹狼,这匹狼隔三差五就来骚扰兔子,兔子为了抵抗狼的袭击,也组织了军队来与狼战斗。这一系列战役发生在很久之前了,现在的人们只能通过史书来了解当时的战役。我们假设一共有N只兔子,编号为1-N,史书上记载了K场兔子与狼之间的战役。每场战役,兔子们派出这N只兔子的中的若干只(即一个集合)去与狼战斗,史书上同时也记录了这场战役的结果(兔子胜利或者狼胜利)。但是史书的记录并不可靠,有时会出现矛盾的情况,矛盾的情况有以下两种:1、有一场战役兔子集合S去迎战狼
2020-05-26 15:58:27
304
原创 Pty的字符串(string)
解法SAM:首先用trie树建sam,和一般的sam不同的地方在于转移的位置不再是直接用ed,而是根据该节点在trie树上的祖先。然后就是跑LCP操作,统计答案。统计答案时需要计算每个节点所代表的字符串数量val[i]和从根节点到每个节点的val的前缀和sum,然后就可以了,注意统计前缀和的时候需要另一次dfs#include<bits/stdc++.h>using namespace std;const int maxn=2e6+5;#define int long long.
2020-05-18 19:25:55
237
原创 一道区间dp题
题意你有一个有序的数组,现在要插入一个新的数,相信你一定学过二分查找,也知道最坏情况下需要比较几次才能找到新的数该插入什么位置,但是现在,我们稍微改变下套路,把新的数与数组中的每一个数比较都会有一个特定的代价,代价在1-9之间,求最坏情况下,假设你采用最优的比较策略,你会花费多少费用插入新的数。数据范围有t(t≤10)t(t\le 10)t(t≤10)组数据,数组大小n≤100000n\le 100000n≤100000解法首先考虑一个常规的区间dp:f[l][r]表示查询[l,r]中任意一个数的
2020-05-11 20:37:18
169
原创 codeforces 1083E
luogu链接解法首先可以观察到所有矩形排成了类似楼梯的形状,所以如果对x排序,y也是有序的。先按x从小到大排序然后考虑dp:f[i]表示最后一个矩形选择的是第i个的最大价值f[i]表示最后一个矩形选择的是第i个的最大价值f[i]表示最后一个矩形选择的是第i个的最大价值转移:f[i]=maxj=1i−1(f[i],f[j]+y[i]∗(x[i]−x[j])−a[i])f[i]=max_{...
2020-04-21 20:00:47
5249
原创 codeforces 1338C
luogu链接吐槽:赛后10min就写出来了。。。一开始把打表程序写错了导致规律找错了。。。解法首先打表找规律,发现和4的倍数有关,然后分n%3的值讨论。n mod 3==1n ~~mod~~3==1n mod 3==1:每4的k次方分一段。每一段里的数都是连续的n mod&nb...
2020-04-13 18:03:02
175
原创 AGC030F
luogu链接解法考虑如果A中的两个相邻位置都确定了的话,这两个位置所对应的B的位置不会对B的方案产生影响,直接不管就可以了。如果建立图论模型,可以发现B的每一个数相当于对A中的两个数匹配后,较小的值然后记录每个数是否在A中出现过,然后可以从大到小dp:f[i][j][k]f[i][j][k]f[i][j][k]表示考虑了≥i\ge i≥i的所有位置,其中有jjj个已经在A中出现的还需要...
2020-04-08 16:34:58
234
原创 luogu 4917
题目链接解法首先观察一下,可以发现对于a,b,正方形的边长是lcm(a,b)。那么买的地板的数量是(a∗b)gcd(a,b)2\frac{(a*b)}{gcd(a,b)^2}gcd(a,b)2(a∗b)那么对于一个n的答案就是:ans=∏i=1n∏j=1ni∗jgcd(i,j)2ans=\prod_{i=1}^n \prod_{j=1}^n \frac{i*j}{gcd(i,j)^2}an...
2020-04-07 15:52:25
134
原创 codeforces 605E
luogu链接解法(好像在哪里见过几乎一样的问题?)考虑这种图上的期望一般倒着算,所以可以从终点反推回起点。然后考虑我们更新点到终点的距离的过程,我们每次选出一个目前到终点距离最近的点,用它去更新和它相邻的点的距离,这个是也是最短路的思想。由于没有负权边,所以考虑用迪杰斯特拉转移方程d[u]=∑vd[v]∗p[u][v]∗(1−pr[u]),更新的时候按d从小到大的顺序d[u]=\su...
2020-04-02 22:17:21
150
原创 AGC038F
luogu链接解法首先需要观察出一个性质:对于一个环,环上的点选择的方案应该是一致的。就是说对于P的一个环,对应位置的AiA_iAi要么全是pip_ipi,要么全是iii。对于Q类似有了这个条件,我们考虑将一个环内的点看成同一个点,这样方便决策。然后分类讨论Pi,QiP_i,Q_iPi,Qi的情况:如果Pi==i && Qi==iP_i==i...
2020-04-01 16:39:26
188
原创 codeforces 704B
luogu链接解法高妙的dp:首先调整一下权值:ai=ai+xi,bi=bi−xi,ci=ci+xi,di=di−xia_i=a_i+x_i,b_i=b_i-x_i,c_i=c_i+x_i,d_i=d_i-x_iai=ai+xi,bi=bi−xi,ci=ci+xi,di=di−xi这样就可以:f(i,j)=di+aj  ...
2020-03-30 21:20:10
216
原创 codeforces 671D
luogu链接解法设f[i]表示覆盖了i的子树和i的返祖边的最小代价,那么答案就是∑i∈son[1]f[i]\sum_{i\in son[1]} f[i]∑i∈son[1]f[i],但是f[i]的方案不一定是最终的最优方案,如果某个方案可以向上延伸的更长,即使现在代价比较高,也有可能是最终更优的方案,所以我们需要维护所有有可能成为答案的方案。然后再给当前点选出一个最小的作为f。因为要选最小...
2020-03-28 15:37:18
471
原创 codeforces 585E
luogu链接解法考虑枚举gcd==g,计算每个gcd的贡献:记c[g]表示数列中为g的倍数的数有多少个,然后考虑一个g的贡献就是(n−c[g])∗(2c[g]−1)(n-c[g])*(2^{c[g]}-1)(n−c[g])∗(2c[g]−1),前一个计算的是x,后一个计算的是{S}。但是这样是有计算多余的:举个例子:当g=6g=6g=6的时候,a数列中有2,6,那么会把S={6},x=2S...
2020-03-26 20:47:00
293
原创 AGC029F
题目链接luogu链接题意(来自洛谷翻译)给定 n−1 个点集(全集为 {1,2,…,n}), 从每个集合内选两个点连边, 使得最后形成一棵树.输出方案解法考虑如果我们先钦定了某一个点作为起点,那么剩下的点和集合最终会形成一一对应的关系,即存在一种选择顺序使得每个集合恰好将一个点加入进联通块。这里不妨设第n个点为起点。考虑对剩下的点和集合做二分图匹配,如果不能完美匹配,则无解,否则...
2020-03-25 12:02:56
207
原创 luogu 4081
题目链接解法广义SAM:笔者建广义SAM的做法是一个字符串结束之后直接把指针指回根,似乎并不是非常对的做法。。。回到题目:将广义SAM建出来以后,把每个字符串在SAM上跑,每个经过的节点打上标记,如果某个节点只有一个标记,说明只有一个字符串拥有这个节点代表的子串,这些子串就需要加到该字符串的答案中。#include<bits/stdc++.h>using namespace ...
2020-03-23 16:54:24
128
原创 luogu 5787
题目链接解法线段树分治:首先对于动态加边,并且维护图是否是二分图,可以使用带权并查集,一个点拆成两个,分别表示这个点染黑色还是白色。每次加边维护并查集就可以了。然后对于这个题,就是把每条边出现的时间对应到线段树上的区间,在每个线段树节点上用一个vector维护时间段和该节点有交的边。最后一次dfs处理所有边:进入一个节点后,先把所有边加入并查集,如果不是二分图,那么整个节点一定不是二分图。...
2020-03-21 16:10:51
164
原创 codeforces 573E
题目链接解法首先有一个n^2的dp:f[i][j]表示前i个元素,选了j个时的最大价值:f[i][j]=max(f[i−1][j],f[i−1][j−1]+a[i]∗j)f[i][j]表示前i个元素,选了j个时的最大价值:f[i][j]=max(f[i-1][j],f[i-1][j-1]+a[i]*j)f[i][j]表示前i个元素,选了j个时的最大价值:f[i][j]=max(f[i−1][j...
2020-03-19 17:39:57
204
原创 codeforces 1325F
题目链接题意给一个n个点m条边的无向联通图,要求在图上要么找出一个至少ceil(sqrt(n))个点的环,要么找出一个cail(sqrt(n))个点的独立集数据范围n≤1e5 m≤2e5n\le 1e5~~~~~m\le 2e5n≤1e5 m≤2e5解法(没有证明其正确性,...
2020-03-15 21:12:11
1523
原创 长链剖分初步
长链剖分和重链剖分的区别在于每个点的特殊儿子判断的方式从子树大小变成了最深深度大小。这样的话,我们在维护某些信息的时候可以直接继承其特殊儿子的信息,就能够优化复杂度。优化dp的例题首先这个题有一个n^2的dp f[u][j+1]=∑f[v][j]f[u][j+1]=\sum f[v][j]f[u][j+1]=∑f[v][j]表示第u个节点,深度为j的点的数量。然后考虑用长链剖分优化,对于每...
2020-03-12 20:20:21
200
原创 一道网络流练习题
解法考虑:首先,如果只有3种区域,那么是一定可以有人获胜的。对于一个2*2的小方格,如果4个格子的区域都不相同,那么如果可以将这4个格子的区域先染成0色,然后将其它格子的区域染成1色,然后从这4个格子出发,能够到达4条边界,说明,只用这4种区域,就可以将整张图上下隔离,左右隔离,那么一定是有染色方案可以让整张图不不满足要求的。...
2020-03-12 11:55:51
232
原创 一道建模练习题
数据范围N,M≤500000,保证询问合法,其它输入不超过intN,M\le 500000,保证询问合法,其它输入不超过intN,M≤500000,保证询问合法,其它输入不超过int解法观察b数组,就是a数组的最长上升子序列的dp数组,我们只需要把每个节点向为它提供最长上升子序列的点连边就可以,这个可以通过排序以后二分得到,理由是对于b[i],它连的边一定是在它前面最近的一个b[j]==b...
2020-03-10 22:03:34
276
原创 luogu 1527
题目链接解法整体二分首先有一个显然的对于每组询问都二分答案,然后O(n2)O(n^2)O(n2)查询询问矩阵的做法。在此基础上,本来笔者想要用主席树的在线算法解决问题,但是复杂度是O(qnlog2n)O(qnlog^2n)O(qnlog2n),不能通过,随即考虑整体二分。整体二分的思路是将所有操作放在一起处理,一次性把所有询问的答案处理出来。考虑本题,将矩阵内的每个值当作一次赋值操作,...
2020-03-09 17:30:41
123
原创 树上莫队小结
树上莫队首先是考虑将树上的问题转移成序列上的问题考虑括号序,一个点在dfs进入它和退出去时分别记一次。这样,考虑原树中的一条路径(u,v)可以被在序列中表示成什么样子:设u的括号序更小,那么如果u是LCA(u,v),那么路径可以被表示成(st[u],st[v]),否则路径可以被表示成(ed[u],st[v]),无论怎样表示,我们都只统计出现在序列中出现奇数次的元素的信息。注意这样的话第2种情况我...
2020-03-05 18:50:11
178
原创 一道多项式练习题
orz zrf wjh时间限制 5S空间限制 512MB解法笔者本来想推出dp式子,但是一直解决不了去重的问题,请教dalao后知道了直接用生成函数的做法:首先设环的生成函数为F(x)=∑i∈axiF(x)=\sum_{i\in a} x^iF(x)=∑i∈axi然后直接求F(x)的exp,第1到n项的系数就是答案了。这个时候是无标号的方案数。这个是因为F(x)相当于求只有一个...
2020-03-01 16:13:12
365
原创 noi.ac 767
orz zhf题目链接解法首先把问题方向转化一下,变成考虑每个点的贡献,这样就是考虑每个点左边m个比它大的数的位置,右边m个比它大的数的位置,有了这些数据就可以稍微推一下式子算出这个点一共在多少个区间中产生了贡献。然后首先有一个O(nmlogn)O(nmlogn)O(nmlogn)的做法,就是对于每个数,向左向右二分查找第一个比它大的数,用st表+二分,但是不能的满分,考虑更快的做法。我...
2020-02-26 19:35:03
162
原创 luogu P4233
题目链接题意从有哈密尔顿回路的竞赛图中随机选取一张,图上哈密尔顿回路数的期望是多少,如果没有这样的竞赛图,输出-1,mod 998244353数据给定n,表示竞赛图的点数,需要对从1到n的每个值都计算一次n≤1e5n\le 1e5n≤1e5解法考虑知道n个点的竞赛图中总共有多少条哈密尔顿回路,首先需要一个n个点的环排列,方案数是(n−1)!(n-1)!(n−1)!,然后剩下来的边随便...
2020-02-25 21:48:54
133
原创 一道线段树练习题
题意注意收到的伤害值写的有点问题,实际上是a2+∑j=1k(Ai,j−Cj)2\sqrt{a^2+\sum_{j=1}^k(A_{i,j}-C_j)^2}a2+∑j=1k(Ai,j−Cj)2,没有后面的-a数据范围时限6S解法首先由于题目中的限制“选了第i个敌人就再也不能和1到i-1的敌人作战”,我们可以观察后得出dp:ans[i]=min(ans[u]+∑j=1k(Ai,j...
2020-02-24 17:17:38
155
原创 noi.ac 12
orz zhf题目链接题意有n个病毒,每天每个病毒的体积会变大ai,每天必须且只能消除一个病毒,代价是病毒的体积,每个病毒的初始体积是bi,天数一共有k天,问最小的代价是多少。数据范围n,k,ai≤106,bi≤1011n,k,ai\le 10^{6},bi\le 10^{11}n,k,ai≤106,bi≤1011解法首先有一个比较显然的O(N2)O(N^2)O(N2)dp,设f[i...
2020-02-23 12:38:15
444
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人