题意:给你一个数组,问有多少个区间,满足区间中的数构成一个排列。

思路(大佬代码):我们发现,一个排列一定含有1,所以我们不妨从1开始入手计算构成排列的区间个数。对于每个扫描到的1(假设处于位置i),我们向左右分别延伸,直到遇到1或者到了数组边界,延伸的时候,需要处理下左边到i的最大值和右边到i的最大值。处理之后,我们先处理排列的最大值在左端的情况。我们暴力枚举每一个位置,把它作为区间的左端点(L),现在我们去确认右端点(R),首先,右端点必须大于等于i,因为要包含1。我们先让右端点向左移,因为右端点的mx值不能大于等于左端点的,不然相当于mx值出现了两次。并且R - L + 1必须小于等于mx[L],因为mx[L]是当前排列的最大值,也是排列的长度。之后,因为R - L + 1可能小于mx[L],我们需要增大R,直到长度满足要求,或者下一个数已经在L到R之间出现过了。此时,如果长度满足要求,那么就找到了一个符合要求的排列,答案+1。最大值在右端同理。

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 300010;
int in_LR[maxn];//in_LR == tot :在L,R之间
int a[maxn], mx[maxn];
int main() {
int n, tot = 0, L, R, ans = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= n; i++) {
if(a[i] != 1) continue;
mx[i] = 1;
for (int j = i - 1; a[j] != 1 && j >= 1; j--)
mx[j] = max(mx[j + 1], a[j]);
for (int j = i + 1; j <= n && a[j] != 1; j++)
mx[j] = max(mx[j - 1], a[j]);
//处理最大值在左半边的情况
tot++;
L = i, R = i;
while(in_LR[a[L]] != tot && L >= 1) {
in_LR[a[L]] = tot;//放入R和L之间
L--;
}
for (L++; L <= i; in_LR[a[L++]] = tot - 1) {
while(R > i && (R - L + 1 > mx[L] || mx[R] >= mx[L]))
in_LR[a[R--]] = tot - 1;
while(R < n && R - L + 1 < mx[L]) {
if(in_LR[a[R + 1]] == tot || a[R + 1] >= mx[L]) break;
in_LR[a[++R]] = tot;
}
if(R - L + 1 == mx[L]) ans++;
}
//处理最大值在右半边的情况
tot++;
L = i, R = i;
while(in_LR[a[R]] != tot && R <= n) {
in_LR[a[R]] = tot;//放入R和L之间
R++;
}
for (R--; R > i; in_LR[a[R--]] = tot - 1) {
while(L < i && (R - L + 1 > mx[R] || mx[L] >= mx[R]))
in_LR[a[L++]] = tot - 1;
while(L > 1 && R - L + 1 < mx[R]) {
if(in_LR[a[L - 1]] == tot || a[L - 1] >= mx[R]) break;
in_LR[a[--L]] = tot;
}
if(R - L + 1 == mx[R]) ans++;
}
}
printf("%d\n", ans);
}

  

Codeforces 1175F 尺取法 性质分析的更多相关文章

  1. Codeforces 1156C 尺取法 / 二分

    题意:给你一个数组,问里面最多能匹配出多少对,满足abs(a[i] - a[j]) >= k; 思路:首先肯定要排序. 思路1(尺取法):看了dreamoon的代码明白的.我们可以寻找一个最长的 ...

  2. Codeforces 1167E 尺取法

    题意:给你一个长度为n的数组,以及数组中的数的取值范围1 - m,问有多少个区间[l, r],使得删除了数组中数值为[l, r]的数之后,数组是非递减的. 思路:我们记录一下每一个数出现的最左端和最右 ...

  3. [CodeForces-1225B] TV Subscriptions 【贪心】【尺取法】

    [CodeForces-1225B] TV Subscriptions [贪心][尺取法] 标签: 题解 codeforces题解 尺取法 题目描述 Time limit 2000 ms Memory ...

  4. Codeforces Round #364 (Div.2) C:They Are Everywhere(双指针/尺取法)

    题目链接: http://codeforces.com/contest/701/problem/C 题意: 给出一个长度为n的字符串,要我们找出最小的子字符串包含所有的不同字符. 分析: 1.尺取法, ...

  5. Codeforces Educational Codeforces Round 5 D. Longest k-Good Segment 尺取法

    D. Longest k-Good Segment 题目连接: http://www.codeforces.com/contest/616/problem/D Description The arra ...

  6. Codeforces Round #354 (Div. 2)_Vasya and String(尺取法)

    题目连接:http://codeforces.com/contest/676/problem/C 题意:一串字符串,最多改变k次,求最大的相同子串 题解:很明显直接尺取法 #include<cs ...

  7. codeforces 814 C. An impassioned circulation of affection 【尺取法 or DP】

    //yy:因为这题多组数据,DP预处理存储状态比每次尺取快多了,但是我更喜欢这个尺取的思想. 题目链接:codeforces 814 C. An impassioned circulation of ...

  8. Codeforces 676C Vasya and String(尺取法)

    题目大概说给一个由a和b组成的字符串,最多能改变其中的k个字符,问通过改变能得到的最长连续且相同的字符串是多长. 用尺取法,改变成a和改变成b分别做一次:双指针i和j,j不停++,然后如果遇到需要改变 ...

  9. CodeForces 701C They Are Everywhere 尺取法

    简单的尺取法…… 先找到右边界 然后在已经有了所有字母后减小左边界…… 不断优化最短区间就好了~ #include<stdio.h> #include<string.h> #d ...

随机推荐

  1. 2019-9-2-win10-uwp-隐私声明

    title author date CreateTime categories win10 uwp 隐私声明 lindexi 2019-09-02 12:57:38 +0800 2018-2-13 1 ...

  2. shell位置参数处理举例

  3. linux文件管理--压缩打包

    目录 linux文件管理--压缩打包 1.压缩打包介绍 2.gzip压缩工具 3.zip压缩工具 注意: 4.tar压缩工具 5.tar生产案例实践 linux文件管理--压缩打包 1.压缩打包介绍 ...

  4. 条款16:成对使用 new和delete时要采取相同的形式

    std::string* stringPtr1=new std::string; srd::string* stringPtr2=new std::string[100];   对应地 delete也 ...

  5. javax.net.ssl.SSLKeyException: RSA premaster secret error

    环境jdk1.7, 调用第三方接口时,出现javax.net.ssl.SSLKeyException: RSA premaster secret error错误,解决方案,将jre/lib/ext所有 ...

  6. 1、Fiddler 打断点 bpu

    一.fiddler 设置断点,可修改以下请求 可以修改HTTP请求头信息,如修改cookie,user-agent等 可以修改请求数据,突破表单限制,提交任意数字,如充值最大金额100,可修改为100 ...

  7. FPN在faster_rcnn中实现细节代码说明

    代码参考自:https://github.com/DetectionTeamUCAS/FPN_Tensorflow 主要分析fpn多层金字塔结构的输出如何进行预测. FPN金字塔结构插入在faster ...

  8. linux文件查找工具——locate,find

    一文件查找介绍 文件的查找就是在文件系统上查找符合条件的文件. 文件查找的方式:locate, find非实时查找也就是基于数据库查找的locate,效率特别高. 实时查找:find 二locate ...

  9. 工厂方法配置bean

    1:静态工厂方法配置bean 1):对象 package com.spring.helloworld; public class Car { private String name; private ...

  10. bzoj 3011

    传送门: http://www.lydsy.com/JudgeOnline/problem.php?id=3011 一想到这个第一反应是树形dp,然后10^18 (' '    ) 所以我直接搞了一个 ...