[BZOJ4553][TJOI2016HEOI2016]序列(CDQ分治)
4553: [Tjoi2016&Heoi2016]序列
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 1202 Solved: 554
[Submit][Status][Discuss]Description
佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他。玩具上有一个数列,数列中某些项的值
可能会变化,但同一个时刻最多只有一个值发生变化。现在佳媛姐姐已经研究出了所有变化的可能性,她想请教你,能否选出一个子序列,使得在任意一种变化中,这个子序列都是不降的?请你告诉她这个子序列的最长长度即可。注意:每种变化最多只有一个值发生变化。在样例输入1中,所有的变化是:1 2 32 2 31 3 31 1 31 2 4选择子序列为原序列,即在任意一种变化中均为不降子序列在样例输入2中,所有的变化是:3 3 33 2 3选择子序列为第一个元素和第三个元素,或者第二个元素和第三个元素,均可满足要求Input
输入的第一行有两个正整数n, m,分别表示序列的长度和变化的个数。接下来一行有n个数,表示这个数列原始的
状态。接下来m行,每行有2个数x, y,表示数列的第x项可以变化成y这个值。1 <= x <= n。所有数字均为正整数,且小于等于100,000Output
输出一个整数,表示对应的答案
Sample Input
3 4
1 2 3
1 2
2 3
2 1
3 4Sample Output
3HINT
Source
用$mn_i$和$mx_i$表示$a_i$可能改变的最小/最大值,有$$j<i \& a_j \leq mn_i \& mx_j \leq a_i$$可以看出是三维偏序,CDQ分治解决。
1 #include<cstdio> 2 #include<algorithm> 3 #define rep(i,l,r) for (int i=l; i<=r; i++) 4 using namespace std; 5 6 const int N=100100; 7 int n,m,x,y,ans,c[N],f[N]; 8 struct P{ int a,mn,mx,x,y,id; }q[N],p[N]; 9 10 bool cmp(P a,P b){ return (a.x==b.x)?(a.y==b.y)?a.id<b.id:a.y<b.y:a.x<b.x; } 11 12 void add(int x,int k){ for (; x<=100000; x+=x&-x) c[x]=k?max(c[x],k):0; } 13 int que(int x){ int res=0; for (; x; x-=x&-x) res=max(res,c[x]); return res; } 14 15 void solve(int l,int r){ 16 if (l==r){ f[l]=max(f[l],1); return; } 17 int mid=(l+r)>>1; solve(l,mid); 18 rep(i,l,r) 19 if (q[i].id<=mid) p[i].x=q[i].a,p[i].y=q[i].mx,p[i].id=q[i].id; 20 else p[i].x=q[i].mn,p[i].y=q[i].a,p[i].id=q[i].id; 21 sort(p+l,p+r+1,cmp); 22 rep(i,l,r) if (p[i].id<=mid) add(p[i].y,f[p[i].id]); else f[p[i].id]=max(f[p[i].id],que(p[i].y)+1); 23 rep(i,l,r) if (p[i].id<=mid) add(p[i].y,0); 24 solve(mid+1,r); 25 } 26 27 int main(){ 28 freopen("bzoj4553.in","r",stdin); 29 freopen("bzoj4553.out","w",stdout); 30 scanf("%d%d",&n,&m); 31 rep(i,1,n) scanf("%d",&q[i].a),q[i].mn=q[i].mx=q[i].a,q[i].id=i; 32 rep(i,1,m) scanf("%d%d",&x,&y),q[x].mn=min(q[x].mn,y),q[x].mx=max(q[x].mx,y); 33 solve(1,n); 34 rep(i,1,n) ans=max(ans,f[i]); 35 printf("%d\n",ans); 36 return 0; 37 }
转载于:https://www.cnblogs.com/HocRiser/p/8579553.html
[BZOJ4553][TJOI2016HEOI2016]序列(CDQ分治)相关推荐
- bzoj4553 [Tjoi2016Heoi2016]序列 树状数组(区间最大值)+cqd
[Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1006 Solved: 464 [Submit ...
- P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...
- [学习笔记]CDQ分治
分治,考虑前一半对后一半的影响. (和一般分治不太相同的思想是,一般分治不分谁对谁的影响,跨mid的都要统计.(全局变量统计) 而CDQ貌似要落脚到前一半对后一半的影响上,也就是贡献在后一半统计,由前 ...
- 【教程】简易CDQ分治教程学习笔记
前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦! CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...
- 【BZOJ3745】Norma(CDQ分治)
[BZOJ3745]Norma(CDQ分治) 题面 BZOJ 洛谷 题解 这种问题直接做不好做,显然需要一定的优化.考虑\(CDQ\)分治. 现在唯一需要考虑的就是跨越当前中间节点的所有区间如何计算答 ...
- BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)
BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...
- 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治
[BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...
- BZOJ 4553: [Tjoi2016Heoi2016]序列
#Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了 ...
- 二维LIS(CDQ分治)
题目描述 给定一个长度为N的序列S,S的每个元素pi是一个二元组(xi,yi),定义pi<pj当且仅当xi<xj并且yi<yj,求S的最长上升子序列长度 输入格式 第一行一个N,表示 ...
最新文章
- (C#)利用反射动态调用类成员[转载]
- STL之vetor 排序
- 【linux】sed -e 's/-//g'
- 使用MyEclipse开发中的编码设置
- 数据分析Power BI数据建模教程(三)——如何优化数据模型
- 互联网运营数据分析(3): 留存分析
- shell循环读文件 Linux脚本读文件
- 小白看完都学会了!Jetpack-MVVM-高频提问和解答,面试建议
- oracle临时表空间组
- 数据库之SQL更新语句中update set from用法
- aac +sbr +ps
- 新房和二手房的优缺点
- CentOs网络管理:ifconfig家族,iproute家族及配置文件
- JAVA 8 lambda 表达式实现按某个属性值查找对象集合中符合条件的对象
- 产品通过WHQL认证后的好处
- su - oracle和su oracle 的区别
- 常用的几种时间系统GMT、UTC等以及使用Python代码GPS时间转UTC时间
- 步进控制薄图modbus通讯1200PLC通讯威纶通
- 从测计----深度与宽度之深度1
- Android 下获取 ICCID、电话号码 的两种方式