[BZOJ3173][Tjoi2013]最长上升子序列

[BZOJ3173][Tjoi2013]最长上升子序列

试题描述

给定一个序列,初始为空。现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置。每插入一个数字,我们都想知道此时最长上升子序列长度是多少?

输入

第一行一个整数N,表示我们要将1到N插入序列中,接下是N个数字,第k个数字Xk,表示我们将k插入到位置Xk(0<=Xk<=k-1,1<=k<=N)

输出

N行,第i行表示i插入Xi位置后序列的最长上升子序列的长度是多少。

输入示例

3
0 0 2

输出示例

1
1
2

数据规模及约定

100%的数据 n<=100000

题解

首先讲一下怎么找到插入的位置,不难发现输入的数 k 就是让我们找到一个位置使得该位置左边有 k 个数然后在这个位置上插入。这不就是“第 k 大数”问题么?

好的,在此基础之上,我们再在 treap 上维护一波子树最大权值即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std;int read() {int x = 0, f = 1; char c = getchar();while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }return x * f;
}#define maxn 100010
struct Node {int r, val, mx, siz;Node() {}Node(int _, int __): r(_), val(__) {}
} ns[maxn];
int rt, ToT, fa[maxn], ch[2][maxn];
void maintain(int o) {ns[o].mx = ns[o].val; ns[o].siz = 1;for(int i = 0; i < 2; i++) if(ch[i][o])ns[o].mx = max(ns[o].mx, ns[ch[i][o]].mx),ns[o].siz += ns[ch[i][o]].siz;return ;
}
void rotate(int u) {int y = fa[u], z = fa[y], l = 0, r = 1;if(z) ch[ch[1][z]==y][z] = u;if(ch[1][y] == u) swap(l, r);fa[u] = z; fa[y] = u; fa[ch[r][u]] = y;ch[l][y] = ch[r][u]; ch[r][u] = y;maintain(y); maintain(u);return ;
}
void insert(int& o, int k, int val) {if(!o) {ns[o = ++ToT] = Node(rand(), val);return maintain(o);}int ls = ch[0][o] ? ns[ch[0][o]].siz : 0;bool d = (k >= ls + 1);insert(ch[d][o], k - (ls + 1) * d, val); fa[ch[d][o]] = o;if(ns[ch[d][o]].r > ns[o].r) {int t = ch[d][o];rotate(t); o = t;}return maintain(o);
}
int Find(int o, int k) {if(!o) return 0;int lm = ch[0][o] ? ns[ch[0][o]].mx : 0, ls = ch[0][o] ? ns[ch[0][o]].siz : 0;if(k >= ls + 1) return max(max(lm, ns[o].val), Find(ch[1][o], k - ls - 1));return Find(ch[0][o], k);
}int main() {int n = read();for(int i = 1; i <= n; i++) {int p = read(), v = Find(rt, p);insert(rt, p, v + 1);printf("%d\n", ns[rt].mx);}return 0;
}

替罪羊树版:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std;const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {if(Head == Tail) {int l = fread(buffer, 1, BufferSize, stdin);Tail = (Head = buffer) + l;}return *Head++;
}
int read() {int x = 0, f = 1; char c = Getchar();while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }return x * f;
}#define maxn 100010
struct Node {int v, siz, mx;Node() {}Node(int _): v(_) {}
} ns[maxn];
int rt, ToT, fa[maxn], ch[maxn][2];
void maintain(int o) {ns[o].siz = 1; ns[o].mx = ns[o].v;for(int i = 0; i < 2; i++) if(ch[o][i])ns[o].siz += ns[ch[o][i]].siz,ns[o].mx = max(ns[o].mx, ns[ch[o][i]].mx);return ;
}
const double Bili = .6;
bool unbal(int o) {return max(ch[o][0] ? ns[ch[o][0]].siz : 0, ch[o][1] ? ns[ch[o][1]].siz : 0) > Bili * ns[o].siz;
}
int rb;
void insert(int& o, int k, int v) {if(!o) {ns[o = ++ToT] = Node(v);return maintain(o);}int ls = ch[o][0] ? ns[ch[o][0]].siz : 0;if(k < ls + 1) insert(ch[o][0], k, v), fa[ch[o][0]] = o;else insert(ch[o][1], k - ls - 1, v), fa[ch[o][1]] = o;maintain(o);if(unbal(o)) rb = o;return ;
}
int cntn, get[maxn];
void getnode(int o) {if(!o) return ;getnode(ch[o][0]);get[++cntn] = o;getnode(ch[o][1]);fa[o] = ch[o][0] = ch[o][1] = 0;return ;
}
void build(int& o, int l, int r) {if(l > r) return ;int mid = l + r >> 1; o = get[mid];build(ch[o][0], l, mid - 1); build(ch[o][1], mid + 1, r);if(ch[o][0]) fa[ch[o][0]] = o;if(ch[o][1]) fa[ch[o][1]] = o;return maintain(o);
}
void rebuild(int& o) {cntn = 0; getnode(o);build(o, 1, cntn);return ;
}
void Insert(int k, int v) {rb = 0; insert(rt, k, v);if(!rb) return ;int frb = fa[rb];if(!frb) rebuild(rt), fa[rt] = 0;else if(ch[frb][0] == rb) rebuild(ch[frb][0]), fa[ch[frb][0]] = frb;else rebuild(ch[frb][1]), fa[ch[frb][1]] = frb;return ;
}
int qmx(int o, int k) {if(!o) return 0;int ls = ch[o][0] ? ns[ch[o][0]].siz : 0, lm = ch[o][0] ? ns[ch[o][0]].mx : 0;if(k < ls + 1) return qmx(ch[o][0], k);return max(max(lm, ns[o].v), qmx(ch[o][1], k - ls - 1));
}int main() {int n = read();for(int i = 1; i <= n; i++) {int pos = read(), tmp = qmx(rt, pos);Insert(pos, tmp + 1);printf("%d\n", qmx(rt, i + 1));}return 0;
}

 

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/6204729.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lrange是取出所有值并移除么_图解双指针 | LeetCode 27. 移除元素

题目描述 原题链接&#xff1a;LeetCode 27. 移除元素给定一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素&#xff0c;返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成…

计算机辅助工程分析及应用论文,计算机辅助工程计量的论文

【摘要】随着科学技术的不断进步&#xff0c;计算机辅助工程计量的技术也日趋成熟并得到广泛应用。下面就广联达图形算量作以简要概述。【关键词】计算机、辅助、工程计量一、gcl7.0图形算量软件应用综述广联达图形算量软件gcl7.0是专为在目前传统定额模式向清单模式过渡时期量…

Effective前端5:减少前端代码耦合

什么是代码耦合&#xff1f;代码耦合的表现是改了一点毛发而牵动了全身&#xff0c;或者是想要改点东西&#xff0c;需要在一堆代码里面找半天。由于前端需要组织js/css/html&#xff0c;耦合的问题可能会更加明显&#xff0c;下面按照耦合的情况分别说明&#xff1a; 1. 避免全…

戴尔笔记本电脑的计算机配置在哪,戴尔电脑的便签在哪里?笔记本电脑怎么设置便签?...

戴尔电脑是国内一些用户所使用的电脑品牌。如果戴尔电脑安装的是Windows系统&#xff0c;是可以在电脑附件中找到系统自带的便笺或者Sticky Notes工具的&#xff0c;可以粘贴在电脑桌面上记录简单的文字内容&#xff0c;但并不支持设置待办提醒事项。除了系统自带便笺之外&…

12帧跑步动画分解图_画出人物跑步的动画运动规律,并上传动画效果视频和逐帧图片。...

【判断题】在竞争激烈的市场环境中,职业生的就业优势是证书【简答题】请把今天的语文作业拍照、语音上传,谢谢!【简答题】请把今天的语文作业拍照上传,今日古诗语音上传,谢谢!【简答题】请把今天的作业拍照、语音上传,谢谢!【判断题】职业纵向发展只体现在技术和职务提升。【判…

VMWare MAC系统调整磁盘

VMware&#xff0c;打开虚拟文件&#xff0c;调整磁盘大小。 从40G调整到80G 进入虚拟机&#xff0c;打开终端 diskutil list;diskutil resizeVolume disk0s2 80GB http://blog.csdn.net/binyao02123202/article/details/51629288转载于:https://www.cnblogs.com/cb168/p/62096…

约翰诺曼超级计算机研究中心,第433章 拉泽尔松教授的决定_学霸的黑科技系统_晨星LL作品_du00...

就在陆舟与格林教授达成共识的时候&#xff0c;他在普林斯顿高等研究院的办公室外面&#xff0c;正晃悠着一个奇怪的人影。似乎是犹豫了一会儿&#xff0c;那人敲开门&#xff0c;走进了办公室。“请问这里是陆舟教授的办公室吗&#xff1f;”停下手中的笔&#xff0c;薇拉开口…

java并发编程(十七)内存操作总结

转载请注明出处&#xff1a;http://blog.csdn.net/ns_code/article/details/17377197 主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则&#xff0c;即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量主要是指共享变量&#x…

柔性体没有应变_边坡防护终结篇!柔性防护系统(主被动网)知识总结!

筑龙岩土20万岩土人在这里关注来源&#xff1a;北京科技大学课件版权归原作者所有有粉丝一定发现我们推送的几篇关于边坡防护与加固的文章&#xff0c;均整理自北京科技大学的课件。没有注意到的可以回顾一下下面的系列文章&#xff0c;今天还剩最后一小点&#xff0c;落石防护…

计算机原理中的cps,信息物理融合系统(CPS)原理

信息物理融合系统(CPS)原理语音编辑锁定讨论上传视频《信息物理融合系统(CPS)原理》是2017年机械工业出版社出版的图书&#xff0c;作者是[美] &#xfffd;拉吉夫阿卢尔&#xff0c;董云卫翻译。[1]书 名信息物理融合系统(CPS)原理作 者[美] &#xfffd;拉吉夫阿卢尔译…

十六周个人作业

计划估计此程序需要3-5天。 开发需求分析用户故事&#xff1a;作为一个观众&#xff0c;我希望了解某一场比赛的比分&#xff0c;以便了解赛况。&#xff08;满意条件&#xff1a;精确到每一局的结果比分&#xff09;。 从分析用例故事可以知道完成此程序需要这两项任务&#x…

新型计算机作文1000,人类:感性的计算机作文1000字

库克似乎并不担心人工智能研究者所说的“奇点”之到来。对于创造新物种的企愿毕竟是刻入基因序列中的&#xff0c;潘多拉魔盒迟早会开&#xff0c;而经由人类这并不完美的造物之手诞生的、可机会趋近完美的人工智能&#xff0c;是否会超越人的思维极限&#xff0c;或拥有与人相…

迁徙图_虾米音乐上的原住民会迁徙去哪呢?

一石激起千层浪。最近&#xff0c;认证为「前华纳音乐/环球音乐中国区市场总监」的相征(今年因《乐队的夏天》走红)发微博称&#xff1a;江湖传闻&#xff0c;虾米音乐明年1月份关闭&#xff0c;一个时代要结束了吗&#xff1f;时代是没那么容易结束的。只不过&#xff0c;每一…

个人作业

.计划 3天 .开发 .需求分析 用户故事&#xff1a;作为一个观众&#xff0c;我希望了解某一场比赛的比分&#xff0c;以便了解赛况。&#xff08;满意条件&#xff1a;精确到每一局的比分&#xff09;。 任务&#xff1a; 观众可以选择查看每局的比分&#xff0c;也可以查看每一…

xp做打印服务器 找不到驱动,XP系统安装打印机驱动提示找不到指定的模块怎么办...

‍‍今天一位用户反馈说XP系统安装打印机驱动提示“找不到指定的模块”&#xff0c;导致打印机驱动没办法正常使用&#xff0c;怎么办呢&#xff1f;如果已经安装过打印机驱动失败&#xff0c;可以先卸载&#xff0c;在重启电脑。接下去教程和大家分享XP系统安装打印机驱动提示…

python 回车键_python tkinter 绑定回车键

# _*_ coding:utf-8_*_from Tkinter import *def submit(ev None):p.set(u.get())root Tk()root.title("测试")frame Frame(root)frame.pack(padx8, pady8, ipadx4)lab1 Label(frame, text"获取:")lab1.grid(row0, column0, padx5, pady5, stickyW)#绑…

判断点在多边形内部

项目的需要&#xff0c;需要判断点在多边形的内部&#xff0c;是整个算法必要的步骤&#xff0c;查了一些资料&#xff0c;中文很少&#xff0c;英文资料已经介绍的很清楚了&#xff0c;这里只是总结一下。 问题的完整描述是判断平面上一点在多边形的内部、外部或者边界上。 有…

js文件里获取路由 vue_【源码拾遗】从vue-router看前端路由的两种实现

本文由浅入深观摩vue-router源码是如何通过hash与History interface两种方式实现前端路由&#xff0c;介绍了相关原理&#xff0c;并对比了两种方式的优缺点与注意事项。最后分析了如何实现可以直接从文件系统加载而不借助后端服务器的Vue单页应用。随着前端应用的业务功能越来…

龙武2服务器在维护,龙武5.25更新维护时间_龙武5.5更新维护详情_牛游戏网

龙武5.25日更新维护公告&#xff0c;相信小伙伴们也很关心更新内容&#xff0c;那么&#xff0c;让我们一起看看这次更新的内容吧&#xff01;尊敬的广大玩家朋友&#xff1a;为保证玩家顺畅进行游戏&#xff0c;提高整体服务质量&#xff0c;给玩家提供更好的服务&#xff0c;…

[bzoj1036][ZJOI2008]树的统计Count

Description 一棵树上有$n$个节点,编号分别为$1$到$n$,每个节点都有一个权值$w_i$. 有三种操作: $1.CHANGE\;u\;t$:把结点$u$的权值改为$t$; $2.QMAX\;u\;v$:询问从点$u$到点$v$的路径上的节点的最大权值; $3.QSUM\;u\;v$:询问从点$u$到点$v$的路径上的节点的权值和. $P.S.$ 从…