vjudge

sol

字典序最小可以通过倒着\(dp\)解决。对每个\(i\)记录它可以转移到的\(dp\)值最大且字典序最小的\(nxt_i\)。

尝试着写一下\(dp\)式子。

\[dp_i=max\{dp_j\}+1(j>i,L_j\le L_i,R_j\ge R_i)
\]

同时要保证\(j\)最小。

对\(R\)数组全部去相反数之后相当于是一个二维的最长非降子序列。

直接把所有决策往树套树里面插就行了。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 5e4+5;
struct segment_tree{int ls,rs,v;}t[N*150];
int n,a[N],b[N],o1[N],o2[N],len1,len2,rt[N],tot,dp[N],nxt[N],ans,start;
int better(int i,int j)
{
if (!i) return j;
if (dp[i]^dp[j]) return dp[i]>dp[j]?i:j;
return i<j?i:j;
}
void modify(int &x,int l,int r,int p,int v)
{
if (!x) x=++tot;t[x].v=better(t[x].v,v);
if (l==r) return;int mid=l+r>>1;
if (p<=mid) modify(t[x].ls,l,mid,p,v);
else modify(t[x].rs,mid+1,r,p,v);
}
int query(int x,int l,int r,int ql,int qr)
{
if (!x||l>=ql&&r<=qr) return t[x].v;
int mid=l+r>>1;
if (qr<=mid) return query(t[x].ls,l,mid,ql,qr);
if (ql>mid) return query(t[x].rs,mid+1,r,ql,qr);
return better(query(t[x].ls,l,mid,ql,qr),query(t[x].rs,mid+1,r,ql,qr));
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
for (int i=1;i<=tot;++i) t[i].ls=t[i].rs=t[i].v=0;
tot=len1=len2=ans=start=0;
for (int i=1;i<=n;++i) o1[++len1]=a[i]=gi();
for (int i=1;i<=n;++i) o2[++len2]=b[i]=1e9-gi();
sort(o1+1,o1+len1+1);len1=unique(o1+1,o1+len1+1)-o1-1;
sort(o2+1,o2+len2+1);len2=unique(o2+1,o2+len2+1)-o2-1;
for (int i=1;i<=n;++i)
{
a[i]=lower_bound(o1+1,o1+len1+1,a[i])-o1;
b[i]=lower_bound(o2+1,o2+len2+1,b[i])-o2;
}
for (int i=n;i;--i)
{
int res=0;
for (int j=a[i];j;j-=j&-j)
res=better(res,query(rt[j],1,len2,1,b[i]));
dp[i]=dp[res]+1;nxt[i]=res;
if (dp[i]>=ans) ans=dp[i],start=i;
for (int j=a[i];j<=len1;j+=j&-j)
modify(rt[j],1,len2,b[i],i);
}
printf("%d\n",ans);
for (int i=start;i;i=nxt[i])
{
printf("%d",i);
if (nxt[i]) printf(" ");//防PE
}
puts("");
for (int i=1;i<=len1;++i) rt[i]=0;
}
return 0;
}

[HDU5324]Boring Class的更多相关文章

  1. [2015hdu多校联赛补题]hdu5324 Boring Class

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5324 题意:给你一个二维的序列,让你找出最长的第一维升第二维降的子序列(如果多个答案,输出字典序最小) ...

  2. hihoCoder 1430 : A Boring Problem(一琐繁题)

    hihoCoder #1430 : A Boring Problem(一琐繁题) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 As a ...

  3. sdut 2610:Boring Counting(第四届山东省省赛原题,划分树 + 二分)

    Boring Counting Time Limit: 3000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述     In this problem you a ...

  4. HDU 4358 Boring counting(莫队+DFS序+离散化)

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others) ...

  5. sdutoj 2610 Boring Counting

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2610 Boring Counting Time ...

  6. hdu 4358 Boring counting dfs序+莫队+离散化

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others) ...

  7. 后缀数组 --- HDU 3518 Boring counting

    Boring counting Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3518 Mean: 给你一个字符串,求:至少出 ...

  8. HDU 5793 A Boring Question (逆元+快速幂+费马小定理) ---2016杭电多校联合第六场

    A Boring Question Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  9. SDUT 2610 Boring Counting(离散化+主席树区间内的区间求和)

    Boring Counting Time Limit: 3000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descriptio ...

随机推荐

  1. 关于IDEA导出项目jar包/runnable jar

    将项目导出为jar包分为 runnable jar 与 普通jar包 一.导出为普通jar包 该jar包中只有项目源代码, java -cp wordcount.jar 用来运行普通jar包 1.打开 ...

  2. springboot获取URL请求参数的几种方法

    原文地址:http://www.cnblogs.com/xiaoxi/p/5695783.html 1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于pos ...

  3. yuv转opencv中的IplImage

    http://www.2cto.com/kf/201208/145559.html http://www.opencv.org.cn/forum.php?mod=viewthread&tid= ...

  4. linux音频 DAPM之二:audio paths与dapm kcontrol

    转:https://blog.csdn.net/wh_19910525/article/details/12749293 在用alsa_amixer controls时,除了我们之前提到的snd_so ...

  5. python 运行报错 Process finished with exit code -1073741819 (0xC0000005)

    发现是由于openpyxl模块导致的,去掉这个模块的内容就能运行,import openpyxl就运行不起来, 将openpyxl卸载了重装, 以及更换了不同的openpyxl版本,都不行,还是运行不 ...

  6. numpy模块之创建矩阵、矩阵运算

    本文参考给妹子讲python  https://zhuanlan.zhihu.com/p/34673397 NumPy是Numerical Python的简写,是高性能科学计算和数据分析的基础包,他是 ...

  7. 友盟分享适配iOS9

    在新发布的iOS9系统上围绕用户数据的安全性和体验新增了一些安全特性,同时也影响了应用的实现以及集成方式,为了保证良好的稳定性和体验,需要做如下处理: 1.  HTTP传输安全 以iOS9 SDK编译 ...

  8. MySQL实验1: 新建一个名为 library 的数据库,包含 book、reader 两张表,根据自己的理解安排表的内容并插入数据。

    数据表(table)简称表,它是数据库最重要的组成部分之一.数据库只是一个框架,表才是实质内容. 实验: 新建一个名为 library的数据库,包含 book.reader两张表,根据自己的理解安排表 ...

  9. 【P2514】工厂选址(贪心)

    看到题了不首先应该看看数据范围确定一下算法么,这个题的数据范围大约可以支持到O(nmlogm),所以肯定不是搜索什么的,DP貌似至少也要n^2m,所以可以想一些其他的.对于题目的输入,我们发现这些输入 ...

  10. ViewPagerAdapter 示例

    package com.ali.fridge.supermarket.module; /**  * Created by xiaomin.wxm on 2016/3/7.  */ import and ...