Luogu3587[POI2015]POD - hash + 单调队列
Solution
还是去看了题解。 感谢大佬的博客→ 题解传送门
是一道思路比较新的题。
搞一个前缀和, 记录前 $i$ 个位置每种颜色的出现次数, 如果位置 $i$ 是 颜色 $a[i]$ 的最后一个位置, 就把颜色 $a[i]$ 清零。
这样就可以保证两个可以分割的点, 它们的前缀和一定是相同的。
$k$ 种颜色的前缀和不好维护(太大了), 就开到hash里面去, 用hash检验是否相等。
两个分割点 $r, l$ 要尽可能满足 $r-l$ 接近 $n \div 2$, 用单调队列维护
Code
#include<cstdio>
#include<algorithm>
#include<cstring>
#define rd read()
#define ll long long
#define R register
using namespace std; const int N = , base1 = , base2 = , mod1 = 1e9 + , mod2 = 1e9 + ; ll po1[N], po2[N], sum1, sum2;
int last[N], cnt[N], n, k, a[N]; struct node {
int id;
ll s1, s2;
}b[N]; inline int read() {
int X = , p = ; char c = getchar();
for (; c > '' || c < ''; c = getchar())
if (c == '-') p = -;
for (; c >= '' && c <= ''; c = getchar())
X = X * + c - '';
return X * p;
} int cmp(const node &A, const node &B) {
if (A.s1 != B.s1) return A.s1 < B.s1;
if (A.s2 != B.s2) return A.s2 < B.s2;
return A.id < B.id;
} int jud(int x, int y) {
if (b[x].s1 != b[y].s1) return ;
if (b[x].s2 != b[y].s2) return ;
return ;
} void cmin(int &A, int B) {
if (A > B) A = B;
} int Abs(int A) {
return A > ? A : -A;
} int main()
{
n = rd; k = rd;
for (R int i = ; i <= n; ++i)
a[i] = rd;
po1[] = po2[] = ;
for (R int i = ; i <= k; ++i)
po1[i] = po1[i - ] * base1 % mod1,
po2[i] = po2[i - ] * base2 % mod2;
for (R int i = ; i <= n; ++i)
cnt[a[i]]++, last[a[i]] = i;
for (R int i = ; i <= n; ++i) {
(sum1 += po1[a[i]]) %= mod1;
(sum2 += po2[a[i]]) %= mod2;
if (i == last[a[i]])
sum1 = (sum1 - po1[a[i]] * cnt[a[i]] % mod1) % mod1,
sum1 = (sum1 + mod1) % mod1,
sum2 = (sum2 - po2[a[i]] * cnt[a[i]] % mod2) % mod2,
sum2 = (sum2 + mod2) % mod2;
b[i].id = i,
b[i].s1 = sum1,
b[i].s2 = sum2;
}
sort(b + , b + + n, cmp);
ll ans1 = ; int ans2 = n;
int mid = (n + ) >> ;
for (int i = , j = ; i <= n; i = j) {
while (j <= n && jud(i, j)) j++;
ans1 += 1LL * (j - i) * (j - i - ) / ;
for (int l = i, r = i; r < j; ++r) {
while (l < r && b[r].id - b[l].id >= mid) l++;
cmin(ans2, Abs(n - * (b[r].id - b[l].id)));
if (l != i)
cmin(ans2, Abs(n - * (b[r].id - b[l - ].id)));
}
}
printf("%lld %d\n", ans1, ans2);
}
Luogu3587[POI2015]POD - hash + 单调队列的更多相关文章
- [bzoj4385][POI2015]Wilcze doły_单调队列
Wilcze doły bzoj-4385 POI-2015 题目大意:给定一个n个数的序列,可以将连续的长度不超过d的区间内所有数变成0,求最长的一段区间,使得区间和不超过p. 注释:$1\le n ...
- BZOJ4385[POI2015]Wilcze doły——单调队列+双指针
题目描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. 输入 第一行包含三个整数n,p ...
- [POI2015]WIL-Wilcze doły(单调队列)
题意 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. (1<=d<=n< ...
- DP的各种优化(动态规划,决策单调性,斜率优化,带权二分,单调栈,单调队列)
前缀和优化 当DP过程中需要反复从一个求和式转移的话,可以先把它预处理一下.运算一般都要满足可减性. 比较naive就不展开了. 题目 [Todo]洛谷P2513 [HAOI2009]逆序对数列 [D ...
- P3587 [POI2015]POD
题目描述 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相邻.切两刀,把项链断成两条链.要求每种颜色的珠子只能出现在其中一条链中.求方案数量(保证至 ...
- 【单调队列】P1886 滑动窗口
GET 单调队列 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: Th ...
- BestCoder Round #89 B题---Fxx and game(单调队列)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945 问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路: B ...
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
- FZU 1914 单调队列
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...
随机推荐
- PostgreSQL Oracle 兼容性之 - sys_guid()
Oracle 使用sys_guid()用来产生UUID值. 在PostgreSQL中有类似的函数,需要安装uuid-ossp插件. 如果用户不想修改代码,还是需要使用sys_guid()函数的话, ...
- UDP广播包
一,广播地址: 广播地址是专门用于同时向网络中所有工作站进行发送的一个地址.在使用TCP/IP 协议的网络中,主机号为全1的IP地址为广播地址.例如,对于 :192.168.199.0(掩码:255. ...
- Kubernetes Service Account如何生成Token
Service Account是运行pods用到的帐号,默认是default.如果apiserver启动配置--admission-control=ServiceAccount,Service Acc ...
- python之路——14
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 复习 1.迭代器 1.双下方法:不常直接调用,是通过其他语法触发的 2.可迭代的:可迭代协议——含有__it ...
- 知识点:Java 集合框架图
知识点:Java 集合框架图 总结:Java 集合进阶精讲1 总结:Java 集合进阶精讲2-ArrayList Java集合框架图 我们经常使用的Arrayist.LinkedList继承的关系挺复 ...
- [SQL]T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)
T-Sql 递归查询(给定节点查所有父节点.所有子节点的方法) -- 查找所有父节点with tab as( select Type_Id,ParentId,Type_Name from Sys_ ...
- 解决idea创建Maven项目卡在running tmp archetypexxxtmp
打开IDEA settings 然后在VM Options内添加-DarchetypeCatalog=internal 运行参数
- 源码的excel导入导出
获取所有数据,将数据进行有序切割,在进行遍历,将其导出. //设置header header("content-type:text/html;charset=utf-8"); // ...
- SpringMVC Get请求传集合,前端"异步"下载excel 附SpringMVC 后台接受集合
最近项目上管理后台需要自己做一部分js部分,之前都是前端来弄...碰到了下载excel,刚开始使用ajax,搞了好久发现不合适..下载不了,网上说ajax返回类型不支持二进制流.. 因此采用 wind ...
- LevelDB源码分析-TableBuilder生成sstable
TableBuilder生成sstable(include/table_builder.h table/table_builder.cc) LevelDB使用TableBuilder来构建sstabl ...