[bzoj4553][Tjoi2016&Heoi2016]序列 cdq分治

来源:互联网 发布:智能电视直播软件2017 编辑:程序博客网 时间:2024/06/07 13:27

4553: [Tjoi2016&Heoi2016]序列

Time Limit: 20 Sec  Memory Limit: 128 MB
[Submit][Status][Discuss]

Description

 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他。玩具上有一个数列,数列中某些项的值

可能会变化,但同一个时刻最多只有一个值发生变化。现在佳媛姐姐已经研究出了所有变化的可能性,她想请教你
,能否选出一个子序列,使得在任意一种变化中,这个子序列都是不降的?请你告诉她这个子序列的最长长度即可
。注意:每种变化最多只有一个值发生变化。在样例输入1中,所有的变化是:
1 2 3
2 2 3
1 3 3
1 1 31 2 4
选择子序列为原序列,即在任意一种变化中均为不降子序列在样例输入2中,所有的变化是:3 3 33 2 3选择子序列
为第一个元素和第三个元素,或者第二个元素和第三个元素,均可满足要求

Input

 输入的第一行有两个正整数n, m,分别表示序列的长度和变化的个数。接下来一行有n个数,表示这个数列原始的

状态。接下来m行,每行有2个数x, y,表示数列的第x项可以变化成y这个值。1 <= x <= n。所有数字均为正整数
,且小于等于100,000

Output

 一个整数

Sample Input

3 4
1 2 3
1 2
2 3
2 1
3 4

Sample Output

3

HINT

没做过cdq,身为cdqz的学生
见NPC的题解http://blog.csdn.net/largecub233/article/details/70314089
缩行成惯了,要改
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int N = 100000 + 5;struct data{int a,mx,mn,id;}a[N],c[N];int m,n,f[N],ft[N],ans;bool cmp1( data a, data b ){ return a.mx < b.mx; }bool cmp2( data a, data b ){ return a.a < b.a; }int gatre( int i ){ int res = 0; for( ; i; i -= i & (-i) ) res = max(ft[i],res); return res; }void update( int i, int x ){ for( ; i <= N; i += i&(-i) ) ft[i] = max(ft[i],x); }void cle( int i ){ for( ; i <= N; i += i&(-i) ) ft[i] = 0; }void cdq( int l, int r ){if( l == r ){ ans = max(f[l],ans); return; }int mid = (l+r)>>1; cdq(l,mid);for( int i = l; i <= r; i++ ) c[i] = a[i];std::sort(c+l,c+mid+1,cmp1);std::sort(c+mid+1,c+r+1,cmp2);int ll = l-1;for( int i = mid+1; i <= r; i++ ){while( ll < mid && c[ll+1].mx <= c[i].a ){ ll++; update(c[ll].a,f[c[ll].id]);}f[c[i].id] = max(f[c[i].id],gatre(c[i].mn)+1);}for( int i = l; i <= mid; i++ ) cle(c[i].a);cdq(mid+1,r);}int main(){scanf("%d%d", &n, &m);for( int i = 1; i <= n; i++ ) scanf("%d", &a[i].a), a[i].mx = a[i].mn = a[i].a, a[i].id = i;for( int i = 1, x, y; i <= m; i++ ){scanf("%d%d", &x, &y);a[x].mx = max(a[x].mx,y); a[x].mn = min(a[x].mn,y);}f[1] = 1; cdq(1,n);printf("%d", ans);return 0;}

原创粉丝点击