Codeforces 1175F(哈希后暴力)
2024-09-01 20:56:12
要点
- 官解使用的哈希,给每个数一个二维键值,这样每个排列就有唯一的键值,再预求一下所给数列的前缀键值,暴力寻找有多少个答案即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <random>
#include <ctime>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
const int maxn = 3e5 + 5;
int n, a[maxn], ans;
pll hsh[maxn], jc[maxn], sum[maxn];
mt19937 rnd(time(NULL));
pll operator ^ (pll a, pll b) {
return {a.first ^ b.first, a.second ^ b.second};
}
int calc(int pos) {
int res = 0, len = 0;
for (int r = pos + 1; r <= n && a[r] != 1; r++) {
len = max(len, a[r]);
if (r - len >= pos) break;//肯定是重复的
if (r - len >= 0 && (sum[r] ^ sum[r - len]) == jc[len])
res++;
}
return res;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= n; i++) {//为每个数i弄一个键值
hsh[i].first = rnd();
hsh[i].second = rnd();
jc[i] = hsh[i];
jc[i] = jc[i] ^ jc[i - 1];//排列1~i的键值
}
for (int it = 0; it < 2; it++) {//第一轮算最大值在右边
for (int i = 1; i <= n; i++) {
sum[i] = hsh[a[i]];
sum[i] = sum[i] ^ sum[i - 1];//数列的前缀
}
for (int i = 1; i <= n; i++)
if (a[i] == 1)
ans += calc(i) + (it == 0);
reverse(a + 1, a + 1 + n);//下一轮算最大值在左边的
}
return !printf("%d\n", ans);
}
最新文章
- spring context上下文(应用上下文webApplicationContext)(转载)
- PL/SQL Transaction Control
- Zabbix3.0 自动邮件报障
- OC基础--OC中类的声明与定义
- 转!!常用的4种动态网页技术—CGI、ASP、JSP、PHP
- SpringMVC + MyBatis 环境搭建(转)
- Java SAX DefaultHandler
- Spring + mybatis整合方案总结 结合实例应用
- UIViewContentMode 图文解说
- POJ3621 Sightseeing Cows(最优比率环)
- 硬杠后端(后端坑系列)——Django前期工作
- Shell工具| 流程控制
- vim使用跳转列表 jumps 来跟踪 (历史位置的)导航
- U3D学习11——nav导航和动画
- 数学:二次剩余与n次剩余
- python之mechanize模拟浏览器
- Request爬取网站(seo.chinaz.com)百度权重的查询结果
- 解决kylin查询报错:org.apache.kylin.rest.exception.InternalErrorException
- Mysql内置功能《四》存储过程
- Lucene6.6添加索引数据时字符个数超限,字符数不能超过BYTE_BLOCK_SIZE=32766