[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
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;}
阅读全文
0 0
- [BZOJ4553][Tjoi2016&Heoi2016]序列 CDQ分治
- [bzoj4553][Tjoi2016&Heoi2016]序列 cdq分治
- 【bzoj4553】【TJOI2016&HEOI2016】【序列】【cdq分治+树状数组】
- cdq分治——bzoj4553: [Tjoi2016&Heoi2016]序列
- CDQ分治——BZOJ4553 [Tjoi2016&Heoi2016]序列
- BZOJ4553 [Tjoi2016&Heoi2016]序列
- bzoj4553【TJOI2016&HEOI2016】序列
- BZOJ4553: [Tjoi2016&Heoi2016]序列
- 【bzoj4553】[Tjoi2016&Heoi2016]序列
- Bzoj4553: Tjoi2016&Heoi2016-序列
- bzoj 4553: [Tjoi2016&Heoi2016]序列 cdq分治+树状数组
- 【bzoj4553】【Tjoi2016】【Heoi2016】【序列】【树套树】【线段树套线段树】
- bzoj 4553: [Tjoi2016&Heoi2016]序列 (CDQ分治+DP+树状数组)
- [bzoj4553][TJOI&HEOI2016]序列
- [Tjoi2016&Heoi2016]序列
- 【TJOI2016&&HEOI2016】序列
- 4553: [Tjoi2016&Heoi2016]序列
- 4553: [Tjoi2016&Heoi2016]序列
- Combination Sum IV
- Linux socket浅谈
- SQLyong 和 MySQL中文乱码解决办法
- C++从零实现BP神经网络
- MySQL高级查询---连接查询实例
- [bzoj4553][Tjoi2016&Heoi2016]序列 cdq分治
- java 基础知识2 --数组
- Glide加载图片的简单实用
- TREAP示例代码(排序)
- 遗传算法(一)
- AD转换控制直流电机转速
- javax.mail.AuthenticationFailedException
- 傅盛认知三部曲后记:到底什么是认知?
- 已有一个名为“frmadd”的组件。组件的名称必须是唯一的,而且名称必须不区分大小