题目

luogu

思路

每次都是插入比之前所有数字大的数,所以之前的答案就不会改变

用fhq-treap求出原序列,然后用树状数组依次算出每个值得lis(显然g[i]=g[i-j]+1)

然后答案就是前i个得最大值(答案一定是不降的)

这里具体讲一下fhq-treap

如果你还是维护val的话,显然不对

如果要在x的位置插入y

那么我们就要把前x个和后size[rt]-x个分开

这里的关键字就成了size了(显然)

然后你就按照size进行分裂

注意递归的关键字的改变

split(ch[now][1],k-size[ch[now][0]]-1,ch[x][1],y);

错误&&傻叉

1.pushup(rt)

2.一脸茫然只会模板

代码

#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn=1e5+7;
const int inf=0x3f3f3f3f;
int n,rt,a[maxn],a_size;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
struct node {
int ch[maxn][2],val[maxn],pri[maxn],size[maxn],cnt;
int make_edge(int a) {val[++cnt]=a;size[cnt]=1;pri[cnt]=rand();return cnt;}
void pushup(int x) {size[x]=size[ch[x][0]]+size[ch[x][1]]+1;}
int merge(int x,int y) {
if(!x||!y) return x+y;
if(pri[x]<pri[y]) {
ch[x][1]=merge(ch[x][1],y);
pushup(x);return x;
} else {
ch[y][0]=merge(x,ch[y][0]);
pushup(y);return y;
}
}
void split(int now,int k,int &x,int &y) {
if(!now) x=y=0;
else {
if(size[ch[now][0]]+1<=k) x=now,split(ch[now][1],k-size[ch[now][0]]-1,ch[x][1],y);
else y=now,split(ch[now][0],k,x,ch[y][0]);
pushup(now);
}
}
void insert(int a,int i) {
int x,y;
split(rt,a,x,y);
rt=merge(merge(x,make_edge(i)),y);
}
void dfs(int now) {
if(!now) return;
dfs(ch[now][0]);
a[++a_size]=val[now];
dfs(ch[now][1]);
}
}dsr;
struct BIT{
int ma[maxn];
int lowbit(int x) {
return x&(-x);
}
void add(int id,int x) {
for(int i=id;i<=n;i+=lowbit(i))
ma[i]=max(ma[i],x);
}
int query(int x) {
int ans=0;
for(int i=x;i>=1;i-=lowbit(i))
ans=max(ma[i],ans);
return ans;
}
}tree;
int ans[maxn];
int main() {
srand(time(NULL));
n=read();
FOR(i,1,n) {
int x=read();
dsr.insert(x,i);
}
dsr.dfs(rt);
FOR(i,1,n) {
ans[a[i]]=tree.query(a[i]-1)+1;
tree.add(a[i],ans[a[i]]);
}
FOR(i,1,n) ans[i]=max(ans[i],ans[i-1]),cout<<ans[i]<<"\n";
return 0;
}

luogu P4396 [AHOI2013]作业的更多相关文章

  1. 【题解】Luogu P4396 [AHOI2013]作业

    原题传送门 最快的解法好像是cdq,但窝只会莫队+线段树/树状数组的做法 题目要我们求1.在区间[l,r]中值域在[a,b]中有多少个数2.在区间[l,r]中值域在[a,b]中有多少个不同数 一眼就看 ...

  2. bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)

    题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不 ...

  3. P4396 [AHOI2013]作业 分块+莫队

    这个题正解是莫队+树状数组,但是我个人非常不喜欢树状数组这种东西,所以决定用分块来水这个题.直接在莫队维护信息的时候,维护单点同时维护块内信息就行了. 莫队就是这几行核心代码: void add(in ...

  4. 洛谷P4396 [AHOI2013]作业(树套树)

    题意 题目链接 Sol 为什么一堆分块呀..三维数点不应该是套路离线/可持久化+树套树么.. 亲测树状数组套权值线段树可过 复杂度\(O(nlog^2n)\),空间\(O(nlogn)\)(离线) # ...

  5. P4396 [AHOI2013]作业

    题目链接 luogu4396 思路 唯有水题暖人心 咕了4天,今天跟着std对拍才做出来不得不说题解真的水的一批 先离散化一下 第一问差分询问,权值树状数组套一套就好了 \(nlog_{n}\) 第二 ...

  6. 洛谷 P4396 [AHOI2013]作业

    题目描述 题目传送门 分析 因为询问是关于区间的,并且没有强制在线,所以能用莫队解决 但是还要支持查询区间内大于等于 \(a\),小于等于 \(b\) 的数的个数和数值的个数 所以还要套一个数据结构 ...

  7. [AHOI2013]作业 (莫队+分块)

    [AHOI2013]作业 (莫队+分块) 题面 给定了一个长度为n的数列和若干个询问,每个询问是关于数列的区间[l,r],首先你要统计该区间内大于等于a,小于等于b的数的个数,其次是所有大于等于a,小 ...

  8. BZOJ3236: [AHOI2013]作业

    BZOJ3236: [AHOI2013]作业 题目描述 传送门 行,我知道是Please contact lydsy2012@163.com! 传送门2 题目分析 这题两问还是非常,emmmm. 首先 ...

  9. BZOJ 3236: [Ahoi2013]作业

    3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1393  Solved: 562[Submit][Status ...

随机推荐

  1. 网站编辑须知9个SEO技巧

    1. 文章当中最好需要出现一个网站核心关键词所谓的网站核心的关键词就是指与网站内容相关性比较高并且是比较受欢迎的关键词,当然还有相当高的转化率 2. 文章标题当中需要出现关键词.关键字在标题标签< ...

  2. router-link传参 query方式

    router.js内的路由配置 { path: '/CreateProgress', name: 'CreateProgress', component:CreateProgress }   传参(q ...

  3. linux中fork函数详解(转)

    add by zhj: 在Linux,创建进程是用fork(),它其实就是拷贝父进程的数据段和其它数据,这相当于C函数调用中的值传递,这是 此后两者的修改都互不影响.因为两者的数据虽相同,但却在不同的 ...

  4. 前端 html input标签 placeholder属性 标签上显示内容

    前端 html  input标签 的placeholder属性  标签上显示内容 <!DOCTYPE html> <html lang="en"> < ...

  5. 部署MyEclipse及Tomcat服务器

     修改MySQL文件工程密码 Tomcat6.12\webapps\SmsService\WEB-INF\applicationContext.xml目录下的数据库密码 <property na ...

  6. 什么是anaconda【转载】

    转自:https://zhidao.baidu.com/question/525102108723657245.html https://zhidao.baidu.com/question/62475 ...

  7. C# 序列化(Serialize)与反序列化(Deserialize)

    序列化是将对象的状态信息转换为可保持或传输的格式的过程(一堆字符),比如转化为二进制.xml.json等的过程. 反序列化就是将在序列化过程中所生成的二进制串.xml.json等转换成数据结构或者对象 ...

  8. for和foreach的区别

    public class Program { public static void Main() { Program program = new Program(); program.For();// ...

  9. 安恒X计划12月月赛

    ezweb 主要是序列化问题.没有PHP环境,在线运行的.实例化对象之后修改一下file.然后echo输出序列化的结果.不过下面有一个正则检查.数字前加一个+,影响了正则的匹配,但是对于序列化的还原没 ...

  10. SQL Expression Language Tutorial 学习笔记一

    http://docs.sqlalchemy.org/en/latest/core/tutorial.html Google 翻译了一下 SQLAlchemy Expression Language, ...