摘要:
cdq分治+单调栈+二分 对y分治,单调栈上部维护递增,下部递减,因为一旦一个点不满足单调性了,就会把前面的点卡掉,所以在单调栈里干掉那些点 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N 阅读全文
摘要:
树状数组+离线 按x排序,y离散化,树状数组查询,跟逆序对一样 #include<bits/stdc++.h> using namespace std; const int N = 500010; int n, m, tot, lim; vector<int> v; int ans[N], aa[N 阅读全文
摘要:
A 出题人不给样例解释。。。具体程序 #include<bits/stdc++.h> using namespace std; int n; char s[100]; int main() { scanf("%d%s", &n, s + 1); int ans = 0, tot = 0; for(i 阅读全文
摘要:
后缀数组+二分 中间加个字符,然后二分判断即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 100010; int n, top, k, tot, m, ans; int a[N], 阅读全文
摘要:
二分+后缀数组 并查集怎么做? 二分长度,然后扫描一遍,如果lcp比值大,那么肯定能满足这个x,因为lcp比x大说明包含长x的lcp #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; con 阅读全文
摘要:
后缀数组+单调栈 看了好长时间,最后看了张神的程序才搞懂 意思就是求所有子串*n*(n+1)/2 n是子串出现次数 事实上,lcp可以看成宽度为1,高度为lcp值的长方形,所有lcp放在一起就是一堆长方形放在一起,然后我们就要求对于每个高度对应的长方形的面积乘上一个值 每个长方形可以用单调栈求,也就 阅读全文
摘要:
后缀数组+st表+单调栈 这道题是差异的加强版 看起来和差异差不多,但是询问的位置是不连续的,那么我们让他们连续就行。 把每个位置赋成rank值,因为lcp[i]表示rank=i和i+1的最长公共前缀,然后st表处理出相邻两个rank的lcp值,然后和差异一样,单调栈处理最左端和最右端的区间,乘起来 阅读全文
摘要:
st表 我还不会st表 f[i][j]表示[i,i+2^j)区间的最值 构造就像lca一样f[i][j]=f[i][j-1] f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]) 表示[i+2^(j-1)) [i+2^(j-1), i+2^j) 然后查询找出一个2的 阅读全文
摘要:
区间dp dp[i][j]存i->j区间的所有取值 然后枚举分割点,枚举两个存的值,分别运算存储。 看见这种不确定分割顺序,两个区间合并的情况,就要用区间dp。 #include<bits/stdc++.h> using namespace std; const int N = 60; int n, 阅读全文
摘要:
dp 没想出来 最先开始想 dp[i][j][k]表示s匹配到i,t匹配到j,当前分了k段的方案数 s[i]==t[j] dp[i][j][k]+=dp[i-1][j-1][k-1] s[i]==t[j]&&s[i-1]==t[j-1] dp[i][j][k]+=dp[i-1][j-1][k] dp 阅读全文