CF1175F The Number of Subpermutations
时间:2021-08-10
本文章向大家介绍CF1175F The Number of Subpermutations,主要包括CF1175F The Number of Subpermutations使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Solution
考虑在什么条件下子区间 \([l,r]\) 是 \(1 到 r - l + 1\) 的排列,
-
\([l,r]\) 中没有重复的数字
-
\([l,r]\) 中最大值为 \(r - l + 1\)
于是可以分治,每次考虑在 \([l,r]\) 中且经过 \(mid\) 的子区间,其中 \(mid\) 是 \([l,r]\) 中最大值的位置,那么这些区间的最大值就是 \(a_{mid}\) 了,接下来考虑第一个条件。
可以记录下每个数上一次出现的位置 \(pre\),然后只需要判断区间中最大的 \(pre\) 是否大于区间左端点。
其实可以判断 \(pre\) 的前缀最大值,因为在左端点前的 \(pre\) 一定是小与左端点的。
注意在枚举区间的时候要判断 \(mid\) 左右哪边小,枚举小的那边作为区间的一端,因为区间长度一定是 \(a_{mid}\),所以另一端就确定了,不然可能会被卡成 \(O(n^2)\)。
Code
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 3e5 + 5;
int n, a[N];
int pre[N], lst[N];
int st[N][20], f[N];
int ans;
void ST()
{
for(int i = 1; i <= n; i++)
st[i][0] = i;
int lg = log2(n);
for(int j = 1; j <= lg; j++)
for(int i = 1; i + (1 << j) - 1 <= n; i++)
st[i][j] = a[st[i][j - 1]] >= a[st[i + (1 << (j - 1))][j - 1]] ? st[i][j - 1] : st[i + (1 << (j - 1))][j - 1];
}
int qry(int l, int r)
{
int lg = log2(r - l + 1);
return a[st[l][lg]] >= a[st[r - (1 << lg) + 1][lg]] ? st[l][lg] : st[r - (1 << lg) + 1][lg];
}
void solve(int l, int r)
{
if(l > r) return;
if(l == r)
{
if(a[l] == 1) ans++;
return;
}
int mid = qry(l, r);
if(mid - l + 1 <= r - mid)
{
for(int i = l ; i <= mid; i++)
{
int j = i + a[mid] - 1;
if(j >= mid && j <= r && f[j] < i) ans++;
}
}
else
{
for(int j = mid; j <= r; j++)
{
int i = j - a[mid] + 1;
if(i <= mid && i >= l && f[j] < i) ans++;
}
}
solve(l, mid - 1);
solve(mid + 1, r);
return;
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]), pre[i] = lst[a[i]], lst[a[i]] = i;
ST();
for(int i = 1; i <= n; i++)
f[i] = max(f[i - 1], pre[i]);
solve(1, n);
printf("%d\n", ans);
return 0;
}
原文地址:https://www.cnblogs.com/Acestar/p/15122979.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [javascript] elementui和vue下复制粘贴上传图片
- SQL Server通过创建临时表遍历更新数据
- 对于 JavaScript 中循环之间的技术差异概述
- 初识 webpack 原理——自定义插件
- 高性能解决线程饥饿的利器 StampedLock
- 前端应该知道的web调试工具——whistle
- 最强大的 CSS 布局 —— Grid 布局
- SAP Spartacus ProductConnector和ProductService实现
- Sorted Adjacent Differences(CodeForces - 1339B)【思维+贪心】
- Redis 发布订阅,小功能大用处,真没那么废材!
- R语言实现生物序列的降维比对
- Tomcat NIO(9)-IO线程-Overall流程和关键类
- 有限元平面四边形等差单元python编程
- 动图演示:手撸堆栈的两种实现方法!
- [Go] 实战项目在线客服GO-FLY -在gin框架使用IP识别库转换IP为城市