摘要: manacher 先用manacher求出p数组,f[i]表示以i结尾最靠左的回文中心,那么每次用i-f[i-p[i]]更新答案就可以了,感觉十分巧妙...... #include<bits/stdc++.h> using namespace std; const int N = 200010; i 阅读全文
posted @ 2017-09-19 18:02 19992147 阅读(142) 评论(0) 推荐(0) 编辑
摘要: manacher+set 好像这种求回文串形态的都是用manacher,然后求出中心之间奇怪的关系 我们先跑出来manacher,由于只要偶数回文串,我们就只把#位置记录下来,重新保存,然后我们考虑什么情况下区间[x+1,y]*4可以更新答案,x是整个回文串的中心。那么很明显有x+f[x]/2>=y 阅读全文
posted @ 2017-09-19 16:26 19992147 阅读(162) 评论(0) 推荐(0) 编辑
摘要: dp 设dp[i][j]为当前到了第i个位置,一共出现了j个逆序对,然后考虑转移,因为前面只有i-1个数,所以这位只能产生[0,i-1]对逆序对,那么dp[i][j]=sigma(dp[i-1][k]),k∈[i-j+1,j]。 但是这样直接搞是O(n^3)的,那么我们用前缀和优化一下,就是O(n^ 阅读全文
posted @ 2017-09-19 16:20 19992147 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 费用流+线段树 看见这个题我们马上就能想到费用流,设立源汇,分别向每个点连接容量为1费用为0的边,然后相邻的点之间连边,费用为点权,跑费用流就行了,但是很明显这样会超时,那么我们要优化一下,我们观察费用流的过程,发现对于点与点之间的边,每次取一段区间相当于把正向边改为反向边,费用变负,于是我们可以用 阅读全文
posted @ 2017-09-19 08:21 19992147 阅读(248) 评论(0) 推荐(0) 编辑
摘要: dp+spfa优化 最朴素的dp是dp[i][j]表示i->j的最短路,然后把所有pair(i,i)放到队列里跑spfa,但是这样被卡掉了,那么我们要优化一下 问题在于每次我们转移的时候要枚举i和j的邻居,这样会被两个连起来的菊花卡掉,那么我们希望一次只走一步,那么复杂度会大大降低,于是我们设一个状 阅读全文
posted @ 2017-09-19 08:13 19992147 阅读(138) 评论(0) 推荐(0) 编辑