【NOIP2011模拟9.20】序列
2016-08-18 23:09
337 查看
【NOIP2011模拟9.20】序列
Time Limits: 1000 ms Memory Limits: 262144 KBDescription
给一个长度为N的序列,请删除尽量少的数,使得新序列中满足第I个数为I条件的数最多。
Input
第一行有一个正整数N。
第二行有N个正整数Xi,表示原序列中第I个数为Xi。
Output
只有一个整数ANS,表示最多能有多少个数满足条件。
Sample Input
5
1 1 2 5 4
Sample Output
3
Hint
对于20%的数据:N<=10;
对于50%的数据:N<=1000;
对于80%的数据:N<=100000;
对于100%的数据:N<=500000。
Tips:删除1得到一个新序列1 2 5 4,1、2、4分别在第1、2、4的位置上。
解题思路
DP
设fi表示前i个数可以满足条件的数的最大个数,明显fi=max(fj+1)其中ai<=i , ai-aj <= i-j , aj < ai ,
明显这是一道有条件求最长不下降子序列问题,那么我们应该如何去消去这几个条件呢?
我们先拿bi存排序后的i原来的位置,为了使aj < ai我们以a为第一关键字从小到大排序
为了使ai-aj<=i-j我们以bi-ai为第二关键字从大到小排序
最后拿bi-ai搞一遍最长不下降子序列,如果bi-ai为负数就不加入序列。
这时你应该知道为何我们以bi-ai为第二关键字从大到小排序,这是为了防止同一个数字不断叠加。
然而最长不下降子序列时二次方级别的,我们该如何处理呢?
这时我们就需要一种叫做单调栈的东西,可在nlogn内求解。
单调栈的运算原理如下:
对于一个栈,栈底为0,我们需要将一个数塞进去,假设这个栈为st,这个数为x,我们要找一个位置i,使st[i]< x且st[i-1]>=x这样我们可以将x覆盖到st[i]这个位置上,那么最长不下降子序列的长度就为这个栈的长度。nlogn解决。
#include<cstring> #include<cstdio> #define max(x,y) ((x)>(y)?(x):(y)) using namespace std; int a[5000001],b[5000001],n,top=0,st[500001]; void q(int,int); void put(int); void swap(int &a,int &b){int c=a;a=b;b=c;} int main() { scanf("%d",&n); st[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=i-a[i]; } q(1,n); for(int i=1;i<=n;i++) { if(b[i]>=0)put(b[i]); } printf("%d",top); } void put(int num) { int h=0,t=top,w; w=0; while(h<=t) { int m=(h+t)>>1; if(st[m]>num) { t=m-1; }else { h=m+1; w=m; } } st[++w]=num; if(top<w)top=w; } void q(int h,int t) { int l=h,r=t,m=a[(h+t)>>1],n=b[(h+t)>>1]; do { while(a[l]<m || (a[l]==m && b[l]>n))l++; while(a[r]>m || (a[r]==m && b[r]<n))r--; if(l<=r) { swap(a[l],a[r]); swap(b[l++],b[r--]); } }while(l<=r); if(h<r)q(h,r);if(l<t)q(l,t); }
相关文章推荐
- {题解}[jzoj2573]【NOIP2011模拟9.20】序列
- 【NOIP2011模拟9.20】素数密度
- 【NOIP2011模拟9.20】素数密度
- 【NOIP2011模拟9.20】统计方案
- jzoj5249 【NOIP2017提高A组模拟8.10】文本编辑器 (序列修改类问题,数据结构)
- 2541. 【NOIP2011模拟9.1】方格取数 (StandardIO)
- 【NOIP2011模拟9.3】作弊的发牌者 (Standard IO)
- jzoj 2546. 【NOIP2011模拟9.3】遥控车
- 2548. 【NOIP2011模拟9.4】最大正方形 (StandardIO)
- NOIP2011模拟9.17 电话时间
- [模拟][NOIP2011] (提高组)D1 T1 铺地毯
- NOIP模拟9.20
- [NOIP 2011]铺地毯 模拟
- 9.20 noip模拟试题
- 【模拟】【NOIP2011提高组Day1】铺地毯
- 【NOIP2011模拟9.1】方格取数 (Standard IO)
- 【NOIP2011模拟9.3】跳舞 (Standard IO)
- jzoj 2553. 【NOIP2011模拟9.7】射命丸文
- jzoj 2570. 【NOIP2011模拟9.17】数字生成游戏
- 2570. 【NOIP2011模拟9.17】数字生成游戏 (StandardIO)