E - Max Min (atcoder.jp)

我们有一个长度为N的数列A=(A1,A2,...,AN)和整数X和Y.求满足以下所有条件的整数对(L,R)的数目。
-1<L<R≤N
. AL,AL+1,......的最大值为X,最小值为Y。,AR的最大值是X,最小值是Y。
约束条件
. 1<N<2×105-1≤A≤2×105.1<Y<X≤2x105
.输入的所有数值都是整数。
lnput
输入是由标准输入给出的,格式如下。
NX Y
A Ag ... AN

Inputcopy Outputcopy
4 3 1
1 2 3 1
4

4 pairs satisfy the conditions: (L,R)=(1,3),(1,4),(2,4),(3,4)

Sample 2

Inputcopy Outputcopy
5 2 1
1 3 2 4 1
0

No pair (L,R) satisfies the condition.

Sample 3

Inputcopy Outputcopy
5 1 1
1 1 1 1 1
15

It may hold that X=Y

Sample 4

Inputcopy Outputcopy
10 8 1
2 7 1 8 2 8 1 8 2 8
36

题解:

我们通过观察可以发现如果数大于x或小于y

那么这个数无论如何也无法成为合法区间的一部分

那我们就可以把剩下的数分割为一段段区间

然后利用尺取法来找到每一段区间里符合条件的个数

#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<cmath>
using namespace std;
#define int long long
int a[200050];
vector<int> p[200050];
void solve()
{int n,x,y;cin >> n >> x >> y;for(int i = 1;i <= n;i++){cin >> a[i];}int idx = 1;for(int i = 1; i <= n;i++){if(a[i] > x|| a[i] < y){if(p[idx].size()!=0)idx++;}else{p[idx].push_back(a[i]);}}int ans = 0;for(int k = 1;k <= idx;k++){map<int,int> f;for(int i = 0,j = 0; i < p[k].size();i++){while((!f[x]||!f[y])&&j < p[k].size()){f[p[k][j]]++;j++;}if(f[x]&&f[y]){ans = ans + (int)p[k].size() - j + 1;}f[p[k][i]]--;}}cout<<ans<<"\n";}
signed main()
{
//  ios::sync_with_stdio(false);
//  cin.tie(0);
//  cout.tie(0);int t = 1;
//  cin >> t;while(t--){solve();}
}
//0 0 0 1 0 0 0 2

E - Max Min(尺取(线性时间找包含两个数的区间有多少))相关推荐

  1. leetcode 1: 找出两个数相加等于给定数 two sum

    问题描述 对于一个给定的数组,找出2个数,它们满足2个数的和等于一个特定的数,返回这两个数的索引.(从1开始) Given an array of integers, find two numbers ...

  2. 不用任何比较判断找出两个数中较大的数

    题目: 给定两个32位整数a和b,返回a和b中较大的 要求: 不能做任何比较 第一种方法.得到a-b的值的符号,就可以知道是返回a还是返回b. public int flip(int n){retur ...

  3. c语言找两个数中的最大值,不用任何比较判断找出两个数中的最大值

    题目: 给定两个32位整数a和b,返回a和b中较大的一个,要求不能使用比较判断 思路一 : 判断a-b的符号,sign(int n) 函数实现 n为正数返回1,n为负数返回0.return a*scA ...

  4. 一个整数数组,每个数字都出现K次,只有一个数字出现M次,找出这个数字(线性时间)

    原题链接https://leetcode.com/problems/single-number-ii/description/ 这类题都是形如给定一个整型数组,数组中每一个数字都出现了K次,只有一个数 ...

  5. 在数据库中, 不用max()/min()找出一个列中最大/最小值的记录

    不用max()/min()找出c1列中最大/最小值的记录 // 找出c1列中,c1是最小值的那条记录,不能用min() select * from t1 where c1 <= all(sele ...

  6. 【2019牛客暑期多校训练营(第三场)- F】Planting Trees(单调队列,尺取)

    题干: 链接:https://ac.nowcoder.com/acm/contest/883/F 来源:牛客网 The semester is finally over and the summer ...

  7. [单调栈/差分/尺取/单调队列]Exercise Week5 A最大矩形+B魔法猫+C平衡字符串+D滑动窗口

    目录 A.[单调栈]最大矩形 题意 样例 思路 总结 代码 B.[差分]TT's Magic Cat 题意 样例 思路 总结 代码 C.[尺取]平衡字符串 题意 样例 思路 总结 代码 D.[单调队列 ...

  8. leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间

    题目 解析 思路一 暴力解法 思路二 指针+最大长度 思路3 由中间至两边找回数 思路4 Manacher's algorithm 线性时间 参考文档 题目 链接 给定一个字符串 s,找到 s 中最长 ...

  9. 【尺取或dp】codeforces C. An impassioned circulation of affection

    http://codeforces.com/contest/814/problem/C [题意] 给定一个长度为n的字符串s,一共有q个查询,每个查询给出一个数字m和一个字符ch,你的操作是可以改变字 ...

最新文章

  1. 从KDD 2018最佳论文看Airbnb实时搜索排序中的Embedding技巧
  2. PHP fgets按行读取字符串和explode分割字符串为数组
  3. PostgreSQL学习手册(二) 模式(Schema)
  4. 支付宝生活号异步通知地址_异步生活。
  5. 深入理解异步Web服务器 Tornado
  6. 日本用活体肌肉构建机械臂,人类与机器融合取得新突破
  7. Java中获取文件大小的正确方法
  8. Tpos时间定位表达式
  9. Github更优雅的使用:Chrome插件推荐
  10. 两幅图的RGB+Depth点云拼接
  11. red5流媒体服务器网站,[RED5]red5流媒体服务器(开源免费)的安装方法
  12. powerdesigner 显示窗口小工具栏
  13. 配置paraview 服务器
  14. kernel input device
  15. [DataAnalysis]基于统计假设检验的机器学习模型性能评估——泛化误差率的统计检验
  16. R语言使用oneway.test函数执行单因素方差分析(One-Way ANOVA)、如果组间具有相同的方差则设置var.equal参数为TRUE获取更加宽松的检验
  17. 用计算机专业术语祝福,学习计算机知识必须懂得50个专业术语
  18. Louvain聚类算法
  19. HTML标签结构1.2(媒体标签:图片标签、音频标签、视频标签)
  20. 【OTDR曲线工具箱】03 创建sor文件

热门文章

  1. 网络数据的背后——网络日志的分析指标
  2. 前端鸡汤奉上-好好解解腻
  3. ORA-02264:name already userd by an existing constraint(创建数据库表主键时,约束被占用问题)
  4. Windows内存映射文件打造极速复制(速度已和ExtremeCopy商业软件相当)
  5. Vue开发Web阅读器(一)
  6. shell调用api store查询手机号码归属地
  7. HSV与HSI颜色空间的区别以及和RGB之间的转换
  8. Life is hard!
  9. 使用tdd构建golang Web 应用(4)
  10. 大学毕业论文写作技巧干货(毕业论文写作中的Word实用技巧)