传送门

参考资料:

  [1]:https://blog.csdn.net/weixin_43262291/article/details/90271693

题意:

  给你一个包含 n 个数的序列 a,并且 max{ai} ≤ x;

  定义一个操作 f(L,R) 将序列 a 中  L ≤ ai ≤ R 的数删除;

  问有多少对满足条件的 (L,R) 使得执行完 f(L,R) 操作后的序列非递减;

题解:

  [1]博文看了一晚上,终于理解了;

  枚举左区间 i,找到符合条件的最小的右区间 ki,f(1,k1),f(2,k2),....,f(x,kx);

  如果执行完 f(1,k1) 后序列非递减,那么执行完 f(1,k1+1),f(1,k1+2),....,f(1,x) 后同样会使得序列非递减;

  f(i,ki)同理,那么最终答案就是 (x-k1+1)+(x-k2+1)+......+(x-kx+1);

  如何高效的求解k1,k2,....,kx呢?

  首先看看相关变量解释:

int n,x;///max{a[i]} <= x
int a[maxn];
int l[maxn];///l[i]:数字i第一次出现的位置
int r[maxn];///r[i]:数字i最后一次出现的位置
int L[maxn];///L[i]:数字[i,n]最先出现的位置
int R[maxn];///R[i]:数字[1,i]最后出现的位置

  预处理出l,r,L,R数组:

 mem(l,INF);
mem(r,);
for(int i=;i <= n;++i)
{
l[a[i]]=min(i,l[a[i]]);
r[a[i]]=i;
}
mem(L,INF);
mem(R,);
for(int i=x;i >= ;--i)
L[i]=min(L[i+],l[i]);
for(int i=;i <= x;++i)
R[i]=max(R[i-],r[i]);

  明确一点,k1 ≤ k2 ≤ ...... ≤ kx

  那么,首先求出 k1,然后,递推出 ki

  如何求解k1呢?

  上述查找可转化为找最小的 k1 使得 [k1+1,x] 组成的序列非递减;

int k=x;///如果[k,x]非递减,那么k-1找下一个位置
for(;k > && r[k] <= L[k+];--k);

  如何根据 k1 递推出 ki 呢?

for(int i=;i <= x && R[i-] <= l[i-];++i)
for(;k < i || R[i-] > L[k+];++k);///找到第一个使得R[i-1]>=L[k+1]的k

AC代码:

 #include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define INF 0x3f3f3f3f
const int maxn=1e6+; int n,x;///max{a[i]} <= x
int a[maxn];
int l[maxn];///l[i]:数字i第一次出现的位置
int r[maxn];///r[i]:数字i最后一次出现的位置
int L[maxn];///L[i]:数字[i,n]最先出现的位置
int R[maxn];///R[i]:数字[1,i]最后出现的位置 ll Solve()
{
mem(l,INF);
mem(r,);
for(int i=;i <= n;++i)
{
l[a[i]]=min(i,l[a[i]]);
r[a[i]]=i;
}
mem(L,INF);
mem(R,);
for(int i=x;i >= ;--i)
L[i]=min(L[i+],l[i]);
for(int i=;i <= x;++i)
R[i]=max(R[i-],r[i]); int k=x;///如果[k,x]非递减,那么k-1找下一个位置
for(;k > && r[k] <= L[k+];--k); ll ans=x-k+; ///要确保[1,i-1]非递减
///且已知[k+1,x]非递减
for(int i=;i <= x && R[i-] <= l[i-];++i)
{
for(;k < i || R[i-] > L[k+];++k);///找到第一个使得R[i-1]>=L[k+1]的k ans += x-k+;
}
return ans;
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
scanf("%d%d",&n,&x);
for(int i=;i <= n;++i)
scanf("%d",a+i); printf("%lld\n",Solve());
return ;
}

Educational Codeforces Round 65 (Rated for Div. 2) E. Range Deleting(思维+coding)的更多相关文章

  1. Educational Codeforces Round 65 (Rated for Div. 2)题解

    Educational Codeforces Round 65 (Rated for Div. 2)题解 题目链接 A. Telephone Number 水题,代码如下: Code #include ...

  2. Educational Codeforces Round 65 (Rated for Div. 2) D. Bicolored RBS

    链接:https://codeforces.com/contest/1167/problem/D 题意: A string is called bracket sequence if it does ...

  3. Educational Codeforces Round 65 (Rated for Div. 2) C. News Distribution

    链接:https://codeforces.com/contest/1167/problem/C 题意: In some social network, there are nn users comm ...

  4. Educational Codeforces Round 65 (Rated for Div. 2) B. Lost Numbers

    链接:https://codeforces.com/contest/1167/problem/B 题意: This is an interactive problem. Remember to flu ...

  5. Educational Codeforces Round 65 (Rated for Div. 2) A. Telephone Number

    链接:https://codeforces.com/contest/1167/problem/A 题意: A telephone number is a sequence of exactly 11  ...

  6. Educational Codeforces Round 65 (Rated for Div. 2)B. Lost Numbers(交互)

    This is an interactive problem. Remember to flush your output while communicating with the testing p ...

  7. [ Educational Codeforces Round 65 (Rated for Div. 2)][二分]

    https://codeforc.es/contest/1167/problem/E E. Range Deleting time limit per test 2 seconds memory li ...

  8. Educational Codeforces Round 65 (Rated for Div. 2)

    A:签到. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000010 ...

  9. Educational Codeforces Round 65 (Rated for Div. 2)(ACD)B是交互题,不怎么会

    A. Telephone Number A telephone number is a sequence of exactly 11 digits, where the first digit is  ...

随机推荐

  1. Python3.7.4入门-6/7错误和异常/类

    6 错误和异常 while True: try: x = int(input("Please enter a number: ")) break except ValueError ...

  2. git命令入门

    http://www.cocoachina.com/ios/20160629/16855.html 译者序:这是一篇给像我这样的新手或者是熟悉图形工具的老鸟看的.仅作为快速入门的教程. git 现在的 ...

  3. 学习es6

    #第一节 初始化项目 npm init -y 安装babel-cli npm install -g babel-cli npm install --save-dev babel-preset-es20 ...

  4. NOIP模拟 17.8.15

    NOIP模拟17.8.15 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...

  5. Hello World 之Spring Boot 调用图数据库Neo4j

    明日歌 [清]钱鹤滩 明日复明日,明日何其多! 我生待明日,万事成蹉跎 1. 图数据库Neo4j之爱的初体验 ----与君初相识,犹似故人归 在如今大数据(big data)横行的时代,传统的关系型数 ...

  6. MongoDB负载信息一目了然 阿里云HDM重磅发布MongoDB监控和诊断功能

    混合云数据库管理(HDM)的统一监控.告警.诊断功能新增了对MongoDB的支持. 通过直观的方式将MongoDB多个维度的负载信息统一整合,不仅可以清晰的查看实时负载信息,也可以方便的确认历史负载情 ...

  7. C# 获取上传文件的文件名和后缀名

    //获得要上传的文件 HttpPostedFile file = Request.Files[]; //获得到文件名 string fileName = System.IO.Path.GetFileN ...

  8. NEFU 118 n!后面有多少个0【数论】

    http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=118 求n!后面有多少个0(1<=n<=1000000000) ...

  9. Oracle使用——PLSQL查询表结构并导出EXCEL

    背景 有一次需要查询Oracle数据库中的所有表接口并且导出excel,方法记录如下 使用 使用PLSQL工具查询表结构,SQL语句如下 SELECT B.TABLE_NAME AS '表名', C. ...

  10. 应用node-webkit(NWJS)把BS架构的网址封装成桌面应用

    一.目的 给WEB应用的用户提供一款同一的浏览器,访问固定网址,封装一些常用插件(如flash插件等) 二.步骤 1.下载node-webkit,官方网址https://nwjs.io/ 2.解压下载 ...