BZOJ 3235: [Ahoi2013]好方的蛇 标签(空格分隔): OI-BZOJ OI-DP OI-容斥原理 Time Limit: 10 Sec Memory Limit: 64 MB Description 有一天,可爱的蛇心花怒放,把自己变成了一个正方形!但是她改变的时候 被induce了导致改变出了些问题.... 按照预设,她应该变成一个N*N的全黑正方形,但是这个正方形出现了一些白的格子...现在她的身体不幸出了些小反应,定义一个subsnake是一个至少有两格的全黑矩形. 现在…
3235: [Ahoi2013]好方的蛇 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 187  Solved: 95 Description 有一天,可爱的蛇心花怒放,把自己变成了一个正方形!但是她改变的时候被induce了导致改变出了些问题.... 按照预设,她应该变成一个N*N的全黑正方形,但是这个正方形出现了一些白的格子...现在她的身体不幸出了些小反应,定义一个subsnake是一个至少有两格的全黑矩形.  现在蛇想让你帮忙求一下一共有多…
3235: [Ahoi2013]好方的蛇 链接 分析: 可以求出以每个点为顶点的满足条件的矩形有多少个,单调栈求.设为sum. 然后对这个数组进行二维前缀和,可以求出每个矩阵内,以右下角.左下角为端点的矩形有多少个,分别设为f,g. 然后可以枚举一个点(x,y),计算有多少个矩形的左上角是这个点,然后分别计算x上面的矩形,和y左面的矩形,与它不相交.此时一个每个矩形都和它左上角右上角的矩形计算了两次,减去即可. 调来调去,最后发现模数多写了个0... 代码: #include<cstdio>…
BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 前面那个len的和=(n-1)*n*(n+1)/2.只需要考虑后面的贡献. 求出height数组,然后问题转化为求所有区间的最小值之和. 设f[i]为所有右端点为i的区间的最小值之和. 每次找到i左边第一个height小于等于i的位置j,显然左端点在j之前那部分的答…
题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么我们可以用这个 Height 数组求出所有后缀之间 LCP 的和. 我们用 f[i] 表示字典序第 i 的后缀与字典序在 i 之后的所有后缀的 LCP 的和. 我们知道,两个后缀的 LCP 为 Height 数组中这两个后缀之间的最小值. 我们从最后向前推 i ,用一个单调栈维护后面的 Height…
题目链接 BZOJ3235 题解 求出每个点为顶点,分别求出左上,左下,右上,右下的矩形的个数\(g[i][j]\) 并预处理出\(f[i][j]\)表示点\((i,j)\)到四个角的矩形内合法矩形个数 就可以容斥计数啦 枚举顶点\((i,j)\),乘上另一侧矩形个数,如图: 但是会算重,对于这样的情况 减去即可 求\(g[i][j]\)数组,枚举每一行,使用单调栈即可 复杂度\(O(n^2)\) #include<algorithm> #include<iostream> #in…
1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 631  Solved: 445[Submit][Status][Discuss] Description Farmer John's N (1 <= N <= 50,000) cows are standing in a very straight row and mooing. Each cow has a unique height…
题目链接 给定两个字符串,求它们有多少个相同子串.相同串的位置不同算多个. POJ3145简化版. 后缀自动机做法见这儿,又快又好写(一下就看出差距了..) //13712kb 4076ms #include <cstdio> #include <cstring> #include <algorithm> const int N=4e5+5; int n,rk[N],sa[N],sa2[N],tm[N],ht[N],bel[N],sk[N],val[N]; char s…
题目链接 可以看出我们是要维护一个下凸壳. 先对斜率从小到大排序.斜率最大.最小的直线是一定会保留的,因为这是凸壳最边上的两段. 维护一个单调栈,栈中为当前可见直线(按照斜率排序). 当加入一条直线l时,可以发现 如果l与栈顶直线l'的交点p在 l'入栈前与栈顶直线 的交点p'的左侧,那么l会覆盖l'(直接用与第一条直线的交点好像也可以?).弹出l'加入l. 如果p在p'右侧,则保留栈顶直线,并将l入栈:如果重合,那么后加入的直线应该会覆盖l',弹出l'加入l. 在斜率符号改变时结果也是一样的.…
题目链接 BZOJ3238 题解 简单题 经典后缀数组 + 单调栈套路,求所有后缀\(lcp\) #include<iostream> #include<cstdio> #include<cmath> #include<map> #include<cstring> #include<algorithm> #define LL long long int #define Redge(u) for (int k = h[u],to; k;…