要点

  • 官解使用的哈希,给每个数一个二维键值,这样每个排列就有唯一的键值,再预求一下所给数列的前缀键值,暴力寻找有多少个答案即可。
#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);
}

最新文章

  1. spring context上下文(应用上下文webApplicationContext)(转载)
  2. PL/SQL Transaction Control
  3. Zabbix3.0 自动邮件报障
  4. OC基础--OC中类的声明与定义
  5. 转!!常用的4种动态网页技术—CGI、ASP、JSP、PHP
  6. SpringMVC + MyBatis 环境搭建(转)
  7. Java SAX DefaultHandler
  8. Spring + mybatis整合方案总结 结合实例应用
  9. UIViewContentMode 图文解说
  10. POJ3621 Sightseeing Cows(最优比率环)
  11. 硬杠后端(后端坑系列)——Django前期工作
  12. Shell工具| 流程控制
  13. vim使用跳转列表 jumps 来跟踪 (历史位置的)导航
  14. U3D学习11——nav导航和动画
  15. 数学:二次剩余与n次剩余
  16. python之mechanize模拟浏览器
  17. Request爬取网站(seo.chinaz.com)百度权重的查询结果
  18. 解决kylin查询报错:org.apache.kylin.rest.exception.InternalErrorException
  19. Mysql内置功能《四》存储过程
  20. Lucene6.6添加索引数据时字符个数超限,字符数不能超过BYTE_BLOCK_SIZE=32766

热门文章

  1. animate旋转动画练习,css3形变练习
  2. 阿里大于短信服务_异常_01_InvalidTimeStamp.Expired
  3. tf.stack和tf.unstack
  4. 集训Day6
  5. MFS安装配置使用
  6. JavaScript高级程序设计学习笔记第二十章--JSON
  7. python的logging模块详细使用demo
  8. day1 java基础回顾-Junit单元测试
  9. 使用Axis2方式发布webService的三种方式
  10. DropDownlist数据SelectedIndexChanged触发问题解决