牛客多校练习赛
1
goto_1600
我何来寂寞,哪有寂寞可言。
展开
-
点分树、点分治
1原创 2022-10-12 13:54:19 · 271 阅读 · 1 评论 -
小G的GLS图 tarjan割点 虚点
链接 思路: 原来n^2暴力建边取割点肯定可以,就是太慢了,我们思考对于每个不同的质因数建立新的虚点,连向存在质因数的点,这样最多只有nlogn条边,然后想了想对于原图的性质确实是不变的。但是要注意一些细节,质因数只有1个度数的点没必要连,不然例如6 向2 3连边,2和3只有1度,那么6是割点,但其实不是,我们在建边的时候特判一下即可,还有就是质因数显然是割点,我们别把它算进去即可。复杂度nsqrt(1e7)+O(tarjan)nsqrt(1e7)+O(tarjan)nsqrt(1e7)+O(tarjan)原创 2022-05-16 16:45:06 · 190 阅读 · 0 评论 -
斯坦纳树模型 魔物消灭计划
链接 用于求必选点的最小生成树,复杂度指数,思想是dp,dp[i][j]代表以i为根j状态的必选点dp[i][j]代表以i为根j状态的必选点dp[i][j]代表以i为根j状态的必选点。状压处理两个转移,一种是同一个state的转移,dp[x][st]=dp[y][st]+dis(x,y)dp[x][st]=dp[y][st]+dis(x,y)dp[x][st]=dp[y][st]+dis(x,y) 由最短路处理,这个部分2k∗n∗log(n)2^k*n*log(n)2k∗n∗log(n)一种是两个不相交子集原创 2022-05-15 16:25:19 · 473 阅读 · 0 评论 -
NTT模板 神奇的迷宫 NTT加点分治
链接 题意就是求给定一棵树 求∑0n−1Wl∑∑[dist(i,j)==L]∗a[i]∗a[j]\sum_{0}^{n-1} W_l \sum\sum [dist(i,j)==L]*a[i]*a[j]∑0n−1Wl∑∑[dist(i,j)==L]∗a[i]∗a[j] 大小为1e5 思路: 树上路径考虑点分治,顺便复习了一下点分治,就是每次递归选一个重心,总共期望是lognlognlogn层,每一层我们可以用nlognnlognnlogn的复杂度。我们对每一种长度的路径考虑,只要满足i+j==L那么不难想原创 2022-05-10 15:41:34 · 363 阅读 · 2 评论 -
Monotonic Matrix (LGV)
题意: 给定n,m,求如下满足定义,是矩阵并且取值只有0,1,2三种,行递增,列递增的方案数(mod 1e9+7) 思路: 如图,左上为0,中间为1,右下为2,也就是从0,0到n,m的类不相交路径个数,为什么是类不相交呢,因为是非严格不相交,蹭到边上的方案是可以的,刚学完LGV,能不能LGV处理呢,很可惜LGV只能处理不相交的路径个数,那么我们采用扩充点,把0,0映射到1,-1,把n,m映射到n+1,m-1,然后套LGV就行了,为什么呢?可以发现0,0到n,m的路径我们都是可以通过镜像来变成1,-1到n+原创 2021-10-01 17:00:24 · 302 阅读 · 0 评论 -
Kuriyama Mirai and Exclusive Or
link 题意: 给定一个序列,两种操作,一种区间异或上一个常量x,第二种是区间异或上常量x+一个从0开始的等差数列。 思路: 第一种操作很好维护,通过差分数组来维护,就类似于加法的差分数组,第二种呢,严格意义上来说就是对于一个数y ^ (x+i),貌似不是很好维护,那么我们考虑异或的性质,如果i当前小于x的lowbit,那么加号和异或是等价的,可以直接变成y ^ x ^ i ,如果这样的话那么就好操作了,我们考虑一段一段的区间,把当前的l,r分为不超过log的区间,每一段区间都是x的lowbit,那么就和原创 2021-09-02 12:31:26 · 256 阅读 · 0 评论 -
[HDU-6831]
搞我心态的都先四个妈,写篇博客吧。这题是区间dp的问题,题意就是给你无限个1145141919,有t次询问,询问的n小于等于5000,问是否存在这样的前缀使得你操作无限次加、乘和括号,没啥思路,看了大佬的代码,发现是有规律的?我这种菜鸡来打表都不会,那当且仅当前缀长度小于等于13,那就区间dp好了,dp[l][r][val] 代表l到r之间val这个值是不是合法,预处理的时候记得粘连在一起的部分也要算,例如“1145”,那么dp[1][4][1145]=true。 贴上代码OVO: #include<原创 2020-09-19 22:05:16 · 266 阅读 · 0 评论 -
Pty loves string 树上主席树,border,kmp Fail树
link 题意: 给定一个字符串,Q次询问,每次询问一个x,y,代表前后缀拼起来的字符串,询问该字符串在原串中的可重叠匹配次数。 Q<=2e5 n<=2e5 思路: 由于题目给的是[1,x] [n-y+1,n] ,如果匹配的话,那么就是匹配了[l,l+x-1],[r-y+1,r],且l+x==r-y+1,我们前后缀分开考虑,这里仅讨论前缀,对于某个前缀k,考虑在kmp的过程中,它一直通过fail指针暴跳,这里来复习一下fail指针,对于红色指针他他所对应的fail就是黑色指针,那么对于ababa原创 2021-08-19 22:44:47 · 386 阅读 · 0 评论 -
MTT 模板(任意模数)
MTT能处理任意模数的FFT。就比如这题 题意: 求一个数列长度大于等于1的子序列和的乘积,首先考虑N^2 DP DP[i][j]代表考虑前i个数和为j的方案数,很容易处理出方案数,最后答案就是ΠsumDP[sum]\Pi sum^{DP[sum]}ΠsumDP[sum]。 还有另一种解法,考虑生成函数,对于每一个数选或者不选,把TA变成多项式的情形,就是1+xai1+x^{ai}1+xai然后乘起来,最后每个某个数M的答案就是xmx^mxm的系数,考虑幂次太大,我们要欧拉降幂一下,mod=99824435原创 2021-08-13 16:48:28 · 634 阅读 · 0 评论 -
Yazid的新生舞会(线段树)
题意:问所有满足出现次数严格超过一半的数的区间数。原创 2021-08-04 21:11:48 · 271 阅读 · 2 评论 -
Tree Xor(线段树)
link 题意: 给定一颗树和每条边两个相邻节点的异或值,和每个节点的取值范围 Li~Ri,求有多少种取点的合法方案。 思路: 先确定根节点的值,那么所有值都确定了,那么也就是求所有区间异或上各自对应的点值,很可惜,区间异或不具有连续性,也就是说会分裂成好几个区间,那么有个做法就是按照线段树的建树方法来分裂区间,这些区间满足前缀不变,后缀为00000~111111,这样的区间也是具有连续性的,我们可以将每一个区间分裂成最多logn个区间,然后区间排序,求被覆盖n次的点的数量,类似于扫描线的做法。复杂度O(n原创 2021-07-26 23:05:20 · 435 阅读 · 0 评论 -
Pass! (bsgs 推柿子)
题意: 有T组样例,一共n个人传球,从1号开始最后回到1号,给定方案数,求最小的传球次数。(t<=100,n<=1e6,方案数<=998244353) 思路: 考虑推柿子 。 f[i]代表从1号开始传了i次回到1号的方案数, f[i]=(n-2)*f[i-1]+(n-1)*f[i-2],这里考虑两种情况*,第i-1个人如果是1号人员和不是1号人员,如果是一号人员,那么情况就是第i个人选择有(n-1)种,除了1号 。 还有一种如果不是一号,那么第i个人有(n-2)种选法(和左右两边的人都不.原创 2021-07-21 15:25:20 · 291 阅读 · 0 评论 -
Knowledge Test about Match 贪心乱搞 匹配
链接 题意: a数组是0~n-1,让b数组和a来匹配,任意两个数的代价是sqrt(|a[j]-b[j]|),求加起来的最小值 思路: 由于sqrt函数的性质,不能无脑sort,由于n加起来40000,每组最多1000,算下来最多4e7左右吧,然后b的值都在0~n-1里面,那就启发我们,每组里面n^2,可以先枚举差值d然后暴力匹配。 代码: #include<iostream> using namespace std; const int N = 10010; int a[N]; bool st原创 2021-07-19 22:03:45 · 326 阅读 · 0 评论 -
牛客多校签到
可以发现,要让答案答案大,那么c的次数多,也就是分解的次数多,那么将某个n按照因数分解,c的因数的个数次就是答案了。 #include<iostream> using namespace std; typedef long long ll; const int mod=1e9+7; ll qmi(int a,int b) { ll res=1; while(b) { if(b&1) res=res*a%mod; b>>=1; a=(ll)a*a%mod; .原创 2020-07-20 16:29:43 · 250 阅读 · 0 评论