02 2018 档案
摘要:AC自动机+矩阵乘法 套路$dp$,也就是从$root$开始走n步不经过危险节点 这不就是经典的倍增$floyd$吗,trie图是有向图 AC自动机真是个奇怪的东西,不能识别的子串都属于根节点 #include <cstdio> #include <cstring> #include <algori
阅读全文
摘要:1444: [Jsoi2009]有趣的游戏 Description Input 注意 是0<=P 注意 是0<=P Output Sample Input Sample Output HINT 30%的数据保证, n ≤ 2. 50%的数据保证, n ≤ 5. 100%的数据保证, n , l, m
阅读全文
摘要:$dp$ 凉凉.jpg 看到题就想决策单调性,想了一个多小时也没想出来,排名$200+$,$gg$ 事实上,我们只可能每$c$个或每一个分一段,假设我们分了一段长为$c$,如果添加一个新元素,如果新的比老的大,没影响,如果小,那么亏损,所以不如不加 #include <cstdio> #includ
阅读全文
摘要:点分治 跟路径有关的立马想到了点分治 自然我们需要统计每条路径的答案,根据点分治的过程,考虑每条路径,我们希望当前路径上的点作为最小值 那么我们用树状数组保存之前每个最小值对应的最长长度,跑两遍即可 #include<bits/stdc++.h> using namespace std; const
阅读全文
摘要:dfs 跟上道题很像有木有 同样地,我们暴力枚举约数 根据约数和公式,得出$S=\prod_{i=1}^{n}{(1+p+p^{2}+...+p^{a_{i}})}$ 所以每次我们暴力枚举是哪个约数,次数是多少,然后爆搜 如果剩下的约数和$S-1$是质数,那么说明约数只剩下一个大质数,直接统计答案结
阅读全文
摘要:搜索 这种$n$很大并且跟约数有关的题都是搜索,因为约数每次除一下大概是$log$级的。 这道题我们希望一个数的约数个数尽量大才能成为反质数,所以涉及的因子不会很多 然后爆搜一发,枚举每个因子用不用,用几次,复杂度很低 #include<bits/stdc++.h> using namespace
阅读全文
摘要:莫比乌斯反演 根据约数和个数公式 $ans = \sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{x|i}\sum_{y|j}{[gcd(i, j)==1]}$ 交换枚举顺序 $ans = \sum_{x=1}^{n}\sum_{y=1}^{n}{[\frac{n}{x}][\fr
阅读全文
摘要:单调栈+set+后缀数组 一道奇妙的题 这道题如果对于每个询问$r$是固定的,那么就很简单了,可惜并不是 由于r会变化,那么对于两个子串$[i...r],[j...r]$,他们的大小关系随着r的变化也会变化,使得我们不能直接预处理答案 所以我们把询问离线,把每个询问按照r分类,通过考虑r的变化来完成
阅读全文
摘要:NTT+组合数学 $把每个点分别按度数考虑,由于有标号,可以得出$ $ans=n*2^{(n-1)*(n-2)}*\sum_{i=1}^{n-1}{C(n-1,i)*i^{k}}$ $本质上是求\sum_{i=1}^{n}{C(n,i)*i^{k}}$ $组合数永远是一个比较好化简的东西,问题在于i
阅读全文
摘要:$分块$ $一个很有趣的技巧$ $在树上选sqrt(n)个关键点,每两个关键点之间的距离<=sqrt(n),每个关键点属于一条链$ $预处理出每两个关键点的bitset$ $每次询问就暴力向上爬,合并bitset$ $由于要查询,所以要手写bitset$ #include<bits/stdc++.h
阅读全文
摘要:$贪心$ $按左端点排序。$ $当我们钦定了最右的左端点,那么自然希望右端点尽量靠右$ $考虑之前的区间,那么我们相当于选之前的区间中第k大的右端点$ $堆维护一下就可以了,每次把新的元素放进堆,如果能更新就弹出旧的,否则弹出自己$ #include<cstdio> #include<cstring
阅读全文
摘要:$数论$ $这个题已经忘了怎么做了,也不想知道了,只记得看了3个小时$ $对于有gcd(f_i, f_j) = f_{gcd(i, j)}性质的数列,以下结论适用$ #include<bits/stdc++.h> using namespace std; typedef long long ll;
阅读全文
摘要:$学了一些技巧$ 1.二元组 $例题:bzoj2127 bzoj2132 bzoj3438 bzoj1976$ $对于这样一种题型:$ $i,j如果同属于/不同属于S或T获得收益w(i,j)$ $i属于S获得a[i],属于T获得b[i]$ $bzoj2132是这种问题的裸题$ $有一种独特的建图方法
阅读全文
摘要:线段树+卷积 这个东西直接算不太好,但是合并两段结果却很方便,假设c[i]表示选i个数乘积的和,那么$a[i]=\sum_{j=0}^{i}{b[j]*c[i-j]}$ 线段树维护即可 #include<bits/stdc++.h> using namespace std; const int N
阅读全文
摘要:FFT+数学 先开始觉得枚举c就行了,不过我naive了 事实上c是确定的,通过化简式子可以得出一个二次函数,那么c就可以解出来了。 然后把a翻转,fft一下就行了 难得的良心题 #include<bits/stdc++.h> using namespace std; const int N = 2
阅读全文