把pos[i]上出现的平常值定义为nor[i]最大值定义为max[i]最小值定义为min[i],那么我们发现在两个值,i(前),j(后),当且仅当max[i]<=nor[j],nor[i]<=min[j]时才会组成序列的前后两个值,并且当序列里所有连续的两个值都满足这个条件是时就可以,因此我们以f[i]表示以i为起点的序列最长值,那么我们就可以转移了f[i]=maxf[j](max[i]<=nor[j],nor[i]<=min[j],pos[i]<pos[j])+1,这就是一个三维逆序对,至于pos[i]我们用默认时间来维护(按倒序插入),用一颗值域线段树来维护nor[i]值域并在每个节点中建一颗替罪羊树表示在nor在此值域里的数,并用min值排序,并且在每个替罪羊节点上维护最大值标记(表示是子树里表示的点里f最大值)

用树套树解决三维偏序的一般思路:一维用时间维护,一维用线段树来维护,另一位用线段树里的平衡排序维护

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstring>
#define MAXN 100000
using namespace std;
inline int read()
{
int sum=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
inline int MAX(int x,int y)
{
return x>y?x:y;
}
inline int MIN(int x,int y)
{
return x<y?x:y;
}
const double alpha=0.75;
struct ScapeGoat_Tree
{
ScapeGoat_Tree *ch[];
int key,size,f,Max;
void pushup()
{
size=ch[]->size++ch[]->size;
Max=ch[]->Max>ch[]->Max?ch[]->Max:ch[]->Max;
Max=Max>f?Max:f;
}
bool isbad()
{
return alpha*size+<ch[]->size||alpha*size+<ch[]->size;
}
}*null,Node[MAXN<<],*list[MAXN<<];
int top,len;
inline void ScapeGoat_Tree_Init()
{
null=Node;
null->ch[]=null->ch[]=null;
}
inline ScapeGoat_Tree *NEW(int key,int F)
{
ScapeGoat_Tree *p=&Node[++top];
p->ch[]=p->ch[]=null;
p->size=;
p->key=key;
p->f=p->Max=F;
return p;
}
void travel(ScapeGoat_Tree *p)
{
if(p==null)return;
travel(p->ch[]);
list[++len]=p;
travel(p->ch[]);
}
ScapeGoat_Tree *divide(int l,int r)
{
if(l>r)return null;
int mid=(l+r)>>;
list[mid]->ch[]=divide(l,mid-);
list[mid]->ch[]=divide(mid+,r);
list[mid]->pushup();
return list[mid];
}
inline void rebuild(ScapeGoat_Tree *&p)
{
len=;
travel(p);
p=divide(,len);
}
ScapeGoat_Tree **insert(ScapeGoat_Tree *&p,int key,int F)
{
if(p==null)
{
p=NEW(key,F);
return &null;
}
ScapeGoat_Tree **ret=insert(p->ch[p->key<key],key,F);
p->pushup();
if(p->isbad())ret=&p;
return ret;
}
inline void Insert(ScapeGoat_Tree *&Root,int key,int F)
{
ScapeGoat_Tree **p=insert(Root,key,F);
if(*p!=null)rebuild(*p);
}
inline int get_Rank(ScapeGoat_Tree *Root,int key)
{
ScapeGoat_Tree *p=Root;
int ret=;
while(p!=null)
if(p->key>=key)
p=p->ch[];
else
ret+=p->ch[]->size+,p=p->ch[];
return ret;
}
int get_Max(ScapeGoat_Tree *p,int l)
{
if(l>p->size)return ;
if(l<=) return p->Max;
int ans=;
if(l<=p->ch[]->size)ans=get_Max(p->ch[],l);
if(l<=p->ch[]->size+)ans=MAX(ans,p->f);
ans=MAX(ans,get_Max(p->ch[],l-p->ch[]->size-));
return ans;
}
inline int query(ScapeGoat_Tree *Root,int key)
{
return get_Max(Root,get_Rank(Root,key)+);
}
struct Seg_Tree
{
ScapeGoat_Tree *root;
int l,r,mid;
Seg_Tree *ch[];
}node[MAXN<<],*root;
int sz;
inline Seg_Tree *New(int l,int r)
{
Seg_Tree *p=&node[sz++];
p->l=l;
p->r=r;
p->mid=(l+r)>>;
p->root=null;
return p;
}
void build(Seg_Tree *p)
{
if(p->l==p->r)return;
p->ch[]=New(p->l,p->mid);
p->ch[]=New(p->mid+,p->r);
build(p->ch[]);
build(p->ch[]);
}
inline void Seg_Tree_Init()
{
root=New(,MAXN);
build(root);
}
void Ins(Seg_Tree *p,int pos,int key,int F)
{
Insert(p->root,key,F);
if(p->l==p->r)return;
Ins(p->ch[p->mid<pos],pos,key,F);
}
int Query(Seg_Tree *p,int l,int key)
{
if(l<=p->l)
return query(p->root,key);
int ans=;
if(l<=p->mid) ans=Query(p->ch[],l,key);
ans=MAX(ans,Query(p->ch[],l,key));
return ans;
}
int n,m;
int Max[MAXN+],Min[MAXN+],nor[MAXN+],f[MAXN+];
inline void Init()
{
ScapeGoat_Tree_Init();
Seg_Tree_Init();
n=read(),m=read();
for(int i=;i<=n;i++)Max[i]=Min[i]=nor[i]=read();
for(int i=;i<=m;i++)
{
int x=read(),y=read();
Max[x]=MAX(y,Max[x]);
Min[x]=MIN(y,Min[x]);
}
}
inline void WORK()
{
f[n]=;
Ins(root,nor[n],Min[n],);
int ans=;
for(int i=n-;i>;i--)
{
f[i]=Query(root,Max[i],nor[i])+;
Ins(root,nor[i],Min[i],f[i]);
ans=MAX(f[i],ans);
}
printf("%d",ans);
}
int main()
{
Init();
WORK();
}

BZOJ4553: [Tjoi2016&Heoi2016]序列 树套树优化DP的更多相关文章

  1. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  2. bzoj4553 [Tjoi2016&Heoi2016]序列 树状数组(区间最大值)+cqd

    [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1006  Solved: 464[Submit][ ...

  3. [BZOJ4553][TJOI2016&&HEOI2016]序列(CDQ分治)

    4553: [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 554[Su ...

  4. [BZOJ4553][Tjoi2016&Heoi2016]序列 cdp分治+dp

    4553: [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 260  Solved: 133[Sub ...

  5. BZOJ4553: [Tjoi2016&Heoi2016]序列

    Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所 ...

  6. BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组

    考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...

  7. bzoj3295: [Cqoi2011]动态逆序对(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  8. BZOJ 4553 Tjoi2016&Heoi2016 序列

    Tjoi2016&Heoi2016序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最 ...

  9. 4553: [Tjoi2016&Heoi2016]序列

    4553: [Tjoi2016&Heoi2016]序列 链接 分析: 注意所有m此操作中,只会发生一个,于是考虑dp.dp[i]=dp[j]+1,j<i,a[j]<=L[i],R[ ...

随机推荐

  1. java两年工作经验有什么经验

    这两年里,了解了完整项目的开发过程,知道如何快速入手一个完全没接触过的项目:譬如先了解数据库关系后,马上熟悉一个功能从前端到后端的实现过程,自己再写一个功 能,这样子就能马上上手开发项目,之后在慢慢了 ...

  2. JAVA图书管理系统汇总共27个[转]

    java图书馆管理系统[优秀毕业设计论文+源码]http://down.51cto.com/data/68350java+sql server图书管理系统 http://down.51cto.com/ ...

  3. fiddler抓包工具教程

    Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操作.也可以用来检测网络安全.反正好处多多,举之不尽呀!当年学习的时候也蛮费劲,一些蛮实用隐藏的小功能 ...

  4. RabbitMQ入门:发布/订阅(Publish/Subscribe)

    在前面的两篇博客中 RabbitMQ入门:Hello RabbitMQ 代码实例 RabbitMQ入门:工作队列(Work Queue) 遇到的实例都是一个消息只发送给一个消费者(工作者),他们的消息 ...

  5. CHAPTER 7 Science in Islam 第7章 伊斯兰中的科学

    CHAPTER 7 Science in Islam 第7章 伊斯兰中的科学 Galen did not live to see the decline of the Roman Empire, bu ...

  6. 北美跨境电商平台Wish透露未来一年在华规划

    9月12日,北美跨境电商平台Wish在深圳透露了未来一年在中国区的重点规划.Wish中国区总裁丁浩川表示,在下一阶段,Wish公司将继续围绕 提升平台流量. 加强品类支撑. 深化库存管理. 推进物流改 ...

  7. SQL ser 进行表中的插入操作时,变量字段名,导致报错时解决办法 :动态SQL

    标题不能描述的很清楚,下面具体说所我要描述的问题,和解决的办法. 作为SQL小白一枚,近日在写一段代码,代码如下: 报错显示 变量@vv附近错误. 后来经过了解,原来是因为,这样需要使用 动态SQL去 ...

  8. “Hello World!”团队第六周第七次会议

    博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.checkout&push代码 一.会议时间 2017年11月23日  ...

  9. 第九次psp例行报告

    本周psp 本周进度条 代码累积折线图 博文字数累积折线图 饼状图

  10. Last Daily Scrum (2015/11/9)

    今晚我们终于完成了新版本的爬虫工作,可以替换掉之前部署在服务器上的那个爬虫了.由于周末大家各种原因导致了我们迭代一的截止日没有完成所有任务,所以今天晚上大家加班加点终于把这一迭代的爬虫项目完成了. 成 ...