[POI2008]TRO-Triangles
https://www.cnblogs.com/GXZlegend/p/7509699.html
平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000
计算几何。
只需要用到S=|x1y2-x2y1|/2
开始对所有点按照x排序。
枚举第一个点P,求出其他点关于P的坐标。
为了去掉绝对值,按照x1/y1排序。y1等于0要特判。
然后发现是前缀和。
本质类似于O(n^3)的暴力,每个三角形只会被统计一次。
N^2logN
突破口:固定P点。求出其他点关于P点的坐标。
[POI2009]WIE-Hexer
大陆上有n个村庄,m条双向道路,p种怪物,k个铁匠,每个铁匠会居住在一个村庄里,你到了那个村庄后可以让他给你打造剑,每个铁匠打造的剑都可以对付一些特定种类的怪物,每条道路上都可能出现一些特定种类的怪物,每条道路都有一个通过所需要的时间,现在要从1走到n,初始的时候你没有剑,要求在经过一条道路的时候,对于任意一种可能出现在这条道路上的的怪物,你都有已经有至少一把剑可以对付他,求从1走到n的最短时间(打造剑不需要时间)
1≤n≤200,0≤m≤3000,1≤p≤13
状压dp
f[i][S],到i点,打S集合的怪,最短路。
但是转移明显有环。
于是状压最短路处理环。dij搞一下。
[POI2010]ANT-Antisymmetry
对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串。比如00001111和010101就是反对称的,1001就不是。
现在给出一个长度为N的01字符串,求它有多少个子串是反对称的。
有趣的题目。
考虑一个串合法的条件。
翻转之后,S[i]=A[n-i+1],有点类似回文串。
A[n-i+1]=S[n-i+1]^1,那么有:S[i]^S[n-i+1]=1,
就是异或意义下的回文子串个数。
一般回文:S[i]=S[n-i+1],这个回文:S[i]^S[n-i+1]=1,
Manacher计算即可。
注意,只能统计偶数的回文,奇数的回文不存在。
并且,奇数的回文,Manacher的一步:p[i]=min(mx-i,2*id-i)不适用。
存在:
//因为会有这种例子(先忽略#(反正是一样的))
//0100 1 1101 中间这个1的p[i]=4,当搜到010011 1 01这个1时
//它所对应的01 0 011101这个0的p[i]=2,但显然上面那个1的p[i]!=2
//所以此处要加2,不能计算奇数长度的情况
其实,就是因为奇数的话对称一下可能会重合id位置。但是id^id=0,所以就错了。
所以,如果后面这个1取到的话,如果成为了最大的id,那么本身其实没有对称性。依赖它进行对称,就错了。
只能每次i+=2
显然不会影响答案。并且不会影响复杂度。
[POI2006]OKR-Periods of Words
求一个串的所有前缀的最长周期(可以覆盖出去)。
最小周期我们会求。i-nxt[i]
由于所有的周期都是最小周期的倍数,所以倍增一下+hash找到最长的即可。nlogn
太暴力了。
所有的i-nxt[nxt[nxt...[i]]]]]]都是周期。
只要不断跳nxt找到最小的j即可。
ans+=i-j
然后就令fail[i]=j,以后到i就一步跳到最小的。类似记忆化。就可以O(n)了。
也启示我们如何把最长的前缀等于后缀长度转化成最短的前缀等于后缀长度。