[TJOI2013]最长上升子序列 平衡树
其实是一道性质题。
首先观察到插入的数是递增的,
那么根据上升子序列的性质,
我们的非法情况就是统计到了在一个数前面的后插入的数,
但是由于插入的数是递增的,显然插入这个数后,这个数就是最大的,所以除了它自己,不会有任何数统计到它,
也就是说,插入一个数时,因为它后面的数都比它小,所以不会对后面DP值产生影响,
而显然它也是不会对它前面的数产生影响的,
因此插入操作实质上是一种无效操作。
所以我们只需要得到最终序列,然后直接dp得到以每个数为结尾的最长上升子序列,
然后统计答案的时候按照数的大小输出前缀max即可。
#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
#define R register int
#define AC 110000
#define getchar() *o++
char READ[],*o=READ;
int n,tot,maxn;
int s[AC],d[AC],ans[AC];
rope <int> tmp;
/*这大概是一道很妙的观察性质题吧,,,
可以观察到,对于插入任意一个数而言,不管插在哪里,对它前面的DP值是不会产生影响的,
而由于插入的数是递增的,所以插入这个数时,这个数自己就是当前数列里最大的那一个,
所以对后面的DP值也不会产生影响,所以其实只需要得到最后的序列直接DP即可以了,因为插入是无效的。 换句话来说,就是因为直接对最后序列查询得到的是不合法结果,当且仅当这个数的DP值中利用到了
在这个数前面的,且在它后面插入的数。而对于这道题而言,在它后面插入的数都比它大,
所以插在前面肯定查询不到,而插在后面自然也查不到了,所以直接做就好了 那如何处理输出问题呢?
因为时间顺序就是数字大小,因此把每个位置的DP值放入对应的数字大小里,然后前缀取max就可以了
*/
inline int read()
{
int x=;char c=getchar();
while(c > '' || c < '') c=getchar();
while(c >= '' && c <= '') x=x*+c-'',c=getchar();
return x;
} void pre()
{
n=read();
for(R i=;i<=n;i++)
{
int a=read();
tmp.insert(a,i);
}
//printf("!!!");
for(R i=;i<=n;i++)
{
// printf("%d\n",i);
s[i]=tmp.at(i-);
// if(s[i] == 1) printf("!!!%d\n",i);
}
} void half(int x)
{
int l=,r=tot,mid;
while(l < r)
{
mid=(l + r) >> ;
if(d[mid] > x) r=mid;//因为这里直接转移是保护了信息的,因此寻找第一个大于x的数
else l=mid+;
}
d[l]=x;
ans[x]=l;
}
//这种二分所利用的单调性实质上是因为前面被放入的后面一定可以用?
void work()
{
//for(R i=1;i<=n;i++) printf("%d ",s[i]);
//printf("\n");
for(R i=;i<=n;i++)
{
if(s[i] > d[tot]) d[++tot]=s[i],ans[s[i]]=tot;
else if(s[i] < d[]) d[]=s[i],ans[s[i]]=;//error!!!放入第一个ans当然=1了
else half(s[i]);
//ans[s[i]]=tot;//ans[s[i]]代表放入了s[i]后的最大ans,error 不能在这里就改最大ans,因为会统计到大于s[i]的ans
//error!!!但还是要前缀和取max,因为这个只是统计到了s[i]的ans,还要考虑比s[i]小的数(之前插入)的ans
//因为比s[i]小的数位置可能在右边,这个时候还没有统计到
}//error!!!注意是存入对应的值所在位置
for(R i=;i<=n;i++)
{
maxn=max(maxn,ans[i]);
printf("%d\n",maxn);
}
} int main()
{
// freopen("in.in","r",stdin);
fread(READ,,,stdin);
pre();
work();
// fclose(stdin);
return ;
}
[TJOI2013]最长上升子序列 平衡树的更多相关文章
- Bzoj 3173: [Tjoi2013]最长上升子序列 平衡树,Treap,二分,树的序遍历
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1183 Solved: 610[Submit][St ...
- bzoj3173[Tjoi2013]最长上升子序列 平衡树+lis
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2253 Solved: 1136[Submit][S ...
- BZOJ 3173: [Tjoi2013]最长上升子序列( BST + LIS )
因为是从1~n插入的, 慢插入的对之前的没有影响, 所以我们可以用平衡树维护, 弄出最后的序列然后跑LIS就OK了 O(nlogn) --------------------------------- ...
- BZOJ_3173_[Tjoi2013]最长上升子序列_splay
BZOJ_3173_[Tjoi2013]最长上升子序列_splay Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数 ...
- 【LG4309】【BZOJ3173】[TJOI2013]最长上升子序列
[LG4309][BZOJ3173][TJOI2013]最长上升子序列 题面 洛谷 BZOJ 题解 插入操作显然用平衡树就行了 然后因为后面的插入对前面的操作无影响 就直接在插入完的序列上用树状数组求 ...
- bzoj 3173 [Tjoi2013]最长上升子序列 (treap模拟+lis)
[Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2213 Solved: 1119[Submit][Status] ...
- [BZOJ3173][Tjoi2013]最长上升子序列
[BZOJ3173][Tjoi2013]最长上升子序列 试题描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上 ...
- BZOJ 3173: [Tjoi2013]最长上升子序列
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1524 Solved: 797[Submit][St ...
- BZOJ 3173: [Tjoi2013]最长上升子序列 [splay DP]
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1613 Solved: 839[Submit][St ...
随机推荐
- Ubuntu配置IP
Ubuntu网络配置的常用系统,于是我学习研究了Ubuntu网络配置,在这里对大家详细介绍下Ubuntu网络配置应用,希望对大家有用Ubuntu网络配置包含了非常好的翻译和容易使用的架构./etc/n ...
- 使用分治法求X的N次方,时间效率为lgN
最近在看MIT的算法公开课,讲到分治法的求X的N次方时,只提供了数学思想,于是自己把代码写了下,虽然很简单,还是想动手写一写. int powerN(int x,int n){ if(n==0){ r ...
- ionic 日期插件学习
<ion-header> <ion-navbar> <ion-title> DateTime </ion-title> </ion-navbar& ...
- Vue-cli 工具 / 通过 Vue-cli 工具重构 todoList
本博文归纳在 Vue 学习过程中, Vue-cli 工具的使用说明.除此之外还通过 Vue-cli 工具将之前 Vuejs 基本语法当中实现的 todoList 进行重构. 安装 npm instal ...
- mac os x下应用endnote异常解决办法
最近在用Office+Endnote写论文,使用拼音输入法换字时会出现重字和拼音的情况,比如我想打“桥连”,最终出现的是"qiao'lian桥lian桥连”.后来发现这个问题时由endnot ...
- leetcode个人题解——#20 Valid Parentheses
class Solution { public: bool isValid(string s) { stack<char> brackts; ; i < s.size(); i++) ...
- 软工冲刺-Alpha 冲刺 (3/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 很胖,刚学,照猫画虎做了登录与注册界面. 展示GitHub ...
- TCP系列10—连接管理—9、syncookie、fastopen与backlog
这部分内容涉及较多linux实现,可以跳过. 一.listen系统调用对backlog的处理 当socket处于LISTEN或者CLOSED状态时,fastopen队列的长度可以通过TCP_FASTO ...
- <Effective C++>读书摘要--Resource Management<一>
1.除了内存资源以外,Other common resources include file descriptors, mutex locks, fonts and brushes in graphi ...
- nuget程序包还原失败:未能解析此远程名称
一个简便的方法就是取消下载缺少的程序包. 步骤如下: 1,工具--NuGet程序包管理器--程序包管理器设置 2,NuGet Package Manager--常规,取消勾选.