传送门

参考资料:

  [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. json格式示例

    案例一: {key:value,key:value} class Person{ String firstname = "张"; String lastname = "三 ...

  2. qt获取本机用户名

    //获取用户名 QString getUserName() { #if 1 QStringList envVariables; envVariables << "USERNAME ...

  3. 客户端connect返回错误显示No route to host

    务器程序运行起来后,客户端connect返回错误显示No route to host,但是两台机子能ping通 是firewall的问题, services iptables stop应该就ok了

  4. 【JZOJ4899】【NOIP2016提高A组集训第17场11.16】雪之国度

    题目描述 雪之国度有N座城市,依次编号为1到N,又有M条道路连接了其中的城市,每一条道路都连接了不同的2个城市,任何两座不同的城市之间可能不止一条道路.雪之女王赋予了每一座城市不同的能量,其中第i座城 ...

  5. MAC+VS Code+C/C++调试配置

    目录 VS Code C/C++ 环境配置 添加工作区文件夹 Say Hello world 关于三个配置文件--Debug 原地址 VS Code C/C++ 环境配置 添加工作区文件夹 虽然代码能 ...

  6. 基于GD库的php验证码类(支持中英文字体、背景、干扰点线、扭曲…….)

    转自:http://www.blhere.com/1168.html 12345678910111213141516171819202122232425262728293031323334353637 ...

  7. 杨柳目-杨柳科-Info-新闻:注意了!杨絮解决有办法了

    ylbtech-杨柳目-杨柳科-Info-新闻:注意了!杨絮解决有办法了  1.返回顶部 1. 注意了!杨絮解决有办法了 2018-05-03 14:18 昨天中午经过一个理发店,门口蹲了个染黄发.系 ...

  8. 【IOS】异常捕获 拒绝闪退 让应用从容的崩溃 UncaughtExceptionHandler

    尽管大家都不愿意看到程序崩溃,但可能崩溃是每一个应用必须面对的现实.既然崩溃已经发生.无法阻挡了.那我们就让它崩也崩得淡定点吧. IOS SDK中提供了一个现成的函数 NSSetUncaughtExc ...

  9. iOS:学习runtime的理解和心得

    http://www.cocoachina.com/ios/20150901/13173.html 作者:兴宇是谁 授权本站转载. Runtime是想要做好iOS开发,或者说是真正的深刻的掌握OC这门 ...

  10. Linux的 crontab定时任务小记

    编辑任务 crontab -e 查看任务 crontab -l 任务配置基本格式:*   * * * * command分(0-59) 时(0-23) 天(1-31) 月(1-12) 周(0-6,0代 ...