【BZOJ4553】【TJOI2016】【HEOI2016】序列
cdq和整体二分之间的关系好迷啊
原题:
佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他。玩具上有一个数列,数列中某些项的值
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
struct dcd{int x,y,z,id;}a[];
int n,m,b[];
int id[],mx[],mn[];
int f[];
dcd q[];
int ans[];
int e[],lbt[];
void gtlbt(){ for(int i=;i<=n;++i) lbt[i]=i&-i;}
//void mdf(int x,int y){ while(x<=n) e[x]+=y,x+=lbt[x];}
//int qr(int x){ int bwl=0; while(x) bwl+=e[x],x-=lbt[x]; return bwl;}
void mdf(int x,int y){ while(x<=n) e[x]=max(e[x],y),x+=lbt[x];}
void dlt(int x){ while(x<=n) e[x]=,x+=lbt[x];}
int qr(int x){ int bwl=; while(x) bwl=max(bwl,e[x]),x-=lbt[x]; return bwl;}
/*void bnr(int l,int r){
if(l==r) return ;
int md=(l+r)>>1;
*for(int i=l;i<=r;++i){
if(a[i].y>=md) ans[a[i].id]+=qr(a[i].x);
if(a[i].x<=md) mdf(a[i].z,1);
}*
//cout<<md<<endl;
memset(e,0,sizeof(e));
for(int i=l;i<=r;++i){
//cout<<l<<" "<<r<<" "<<a[i].y<<" "<<a[i].x<<" "<<a[i].z<<endl;
if(a[i].y>=md) f[a[i].id]=max(f[a[i].id],qr(a[i].x)+1);
if(a[i].x<=md) mdf(a[i].z,f[a[i].id]);
}
//for(int i=l;i<=r;++i)if(a[i].x<=md) mdf(a[i].z,-1);
int t1=l,t2=md+1;
for(int i=l;i<=r;++i) q[(a[i].y<=md?t1:t2)++]=a[i];
for(int i=l;i<=r;++i) q[i]=q[i];
bnr(l,md),bnr(md+1,r);
}*/
bool cmp1(dcd x,dcd y){ return x.x<y.x;}
bool cmp2(dcd x,dcd y){ return x.y<y.y;}
bool cmp3(dcd x,dcd y){ return x.id<y.id;}
void cdq(int l,int r){
if(l==r) return ;
int md=(l+r)>>;
cdq(l,md);
sort(a+l,a+md+,cmp1),sort(a+md+,a+r+,cmp2);
//memset(e,0,sizeof(e));
int j=md+;
for(int i=l;i<=md;++i){
while(j<=r && a[j].y<a[i].x) ans[a[j].id]=max(ans[a[j].id],qr(a[j].x)+),++j;
mdf(a[i].z,ans[a[i].id]);
}
while(j<=r) ans[a[j].id]=max(ans[a[j].id],qr(a[j].x)+),++j;
for(int i=l;i<=md;++i) dlt(a[i].z);
sort(a+md+,a+r+,cmp3);
cdq(md+,r);
}
int main(){
//freopen("ddd.in","r",stdin);
//freopen("heoi2016_seq.in","r",stdin);
//freopen("heoi2016_seq.out","w",stdout);
memset(f,,sizeof(f));
cin>>n>>m;
gtlbt();
for(int i=;i<=n;++i) mx[i]=mn[i]=b[i]=rd();
int l,r;
while(m--){
l=rd(),r=rd();
mx[l]=max(mx[l],r),mn[l]=min(mn[l],r);
}
for(int i=;i<=n;++i) a[i].id=i,a[i].x=b[i],a[i].y=mn[i],a[i].z=mx[i],ans[i]=;
cdq(,n);
int mxx=;
for(int i=;i<=n;++i) mxx=max(mxx,ans[i]);
cout<<mxx<<endl;
return ;
}
【BZOJ4553】【TJOI2016】【HEOI2016】序列的更多相关文章
- [BZOJ4553][TJOI2016&&HEOI2016]序列(CDQ分治)
4553: [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 554[Su ...
- [BZOJ4553][Tjoi2016&Heoi2016]序列 cdp分治+dp
4553: [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 260 Solved: 133[Sub ...
- bzoj4553 [Tjoi2016&Heoi2016]序列 树状数组(区间最大值)+cqd
[Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1006 Solved: 464[Submit][ ...
- BZOJ4553: [Tjoi2016&Heoi2016]序列
Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所 ...
- BZOJ4553: [Tjoi2016&Heoi2016]序列 树套树优化DP
把pos[i]上出现的平常值定义为nor[i]最大值定义为max[i]最小值定义为min[i],那么我们发现在两个值,i(前),j(后),当且仅当max[i]<=nor[j],nor[i]< ...
- 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
[BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...
- BZOJ 4553 Tjoi2016&Heoi2016 序列
Tjoi2016&Heoi2016序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最 ...
- 4553: [Tjoi2016&Heoi2016]序列
4553: [Tjoi2016&Heoi2016]序列 链接 分析: 注意所有m此操作中,只会发生一个,于是考虑dp.dp[i]=dp[j]+1,j<i,a[j]<=L[i],R[ ...
- 【50.40%】【BZOJ 4553】[Tjoi2016&Heoi2016]序列
Time Limit: 20 Sec Memory Limit: 128 MB Submit: 371 Solved: 187 [Submit][Status][Discuss] Descript ...
- BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组
考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...
随机推荐
- Kafka.net使用编程入门(三)
这个世界既不是有钱人的世界,也不是有权人的世界,它是有心人的世界. 一些有用的命令 1.列出主题:kafka-topics.bat --list --zookeeper localhost:2181 ...
- .NET接入UnionPay银联支付(一)手机wap支付
最近呢,比较忙,公司在接入银联全渠道支付,博主接手的wap支付,发表一下博主在接入的时候遇到的坑和注意事项,方便大家学习接入,爬坑的路上更顺利一点~ 开发步骤 1. 以表单的方式组装要发送给银联全渠道 ...
- bzoj3277
题解: 后缀自动机 然后抄了一发题解 可以看看这个博客:http://blog.csdn.net/clover_hxy/article/details/53861268 代码: #include< ...
- 十二. Python基础(12)--生成器
十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...
- 运行java程序的方法-DOS命令和Eclipse方法
● 运行java程序的方法(使用DOS命令) 首先进行一个"文件夹选项"的设置: 在D:\Android\java_code目录下新建了一个Hello_World.java文件(不 ...
- 打开和写入word文档
一. 使用win32读取word内容 # -*- coding: utf-8 -*- from win32com import client as wc def readDocx2(): word = ...
- python笔记3-输出输入、字符串格式化
输入.输出 python怎么来接收用户输入呢,使用input函数,python2中使用raw_input,接收的是一个字符串,输出呢,第一个程序已经写的使用print,代码入下: 1 2 name=i ...
- JSP组件Telerik UI for JSP发布R1 2019 SP1|附下载
Telerik UI for JSP拥有由Kendo UI for jQuery支持的40+ JSP组件,同时通过Kendo UI for jQuery的支持能使用JSP封装包构建现代的HTML5和J ...
- LVS原理详解(3种工作方式8种调度算法)
一.集群简介 什么是集群 计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算 ...
- python scrapy爬虫数据库去重方法
1. scrapy对request的URL去重 yield scrapy.Request(url, self.parse, dont_filter=False) 注意这个参数:dont_filter= ...