The All-purpose Zero

简要题意: 

长度为n的数组,每个数字为S[i],$0$是一种很神奇的数字,你想要的,它都可以变!

问这个序列的最长上升子序列长度为多少?

分析:

我们将除了‘0’以外的S[i],减去i之前出现的‘0’的个数,最后求得排除‘0’后的最长上升子序列长度,加上‘0’的个数,就是我们要求的答案。

在这里我不主要分析该做法的正确性,我们引入一个O(nlogn)的方法来求最长上升子序列。

LIS (点此看题)

贪心+二分

我们令f[i]表示长度为i的上升子序列,末尾的最小值。

这里我们因为贪心,所以子序列末尾越小越好。

我们按顺序枚举给出的数组S[i],然后对f[]二分查找除小于S[i]的最大的f[j],并用它将f[j+1]更新。

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define LL long long
const int N=1e5+5;
int n, a[N], b[N], len;
signed main()
{
scanf("%d",&n);
for(re i=1;i<=n;++i) scanf("%d",&a[i]);
for(re i=1;i<=n;++i)
{
if(a[i] > b[len]) b[++len] = a[i];
else
{
int tp = lower_bound(b+1, b+1+len, a[i])-b;
b[tp] = a[i];
}
}
printf("%d", len);
}

上马

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define LL long long
const int N=1e5+5;
int n, a[N], b[N], num, len;
inline void work()
{
num = len = 0;
scanf("%d",&n);
for(re i=1;i<=n;++i)
{
scanf("%d",&a[i]);
if(a[i] == 0)
{
num ++;
a[i] = 1e9;
}
else
{
a[i] -= num;
}
}
b[0] = -1e9;
for(re i=1;i<=n;++i)
{
if(a[i] == 1e9) continue; if(a[i] > b[len]) b[++len] = a[i];
else
{
int tp = lower_bound(b+1, b+1+len, a[i])-b;
b[tp] = a[i];
}
}
printf("%d\n", len+num);
}
signed main()
{
int T;
scanf("%d",&T);
for(re i=1;i<=T;++i)
{
printf("Case #%d: ",i);
work();
}
return 0;
}

热身训练2 The All-purpose Zero的更多相关文章

  1. 数位dp & 热身训练7

    数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...

  2. 热身训练4 Article

    Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ...

  3. 热身训练4 Eighty seven

    Eighty seven 简要题意: n个卡片,其中第i个卡片的数值为$a[i]$.一共q次询问,每次询问将删去其中3个卡片(可能删除若干相同的卡片)后,问能否选出10个卡片,数值之和等于87. n≤ ...

  4. 热身训练3 Palindrome

    Palindrome 简要题意:  我们有一个字符串S,字符串的长度不超过500000. 求满足S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)(n≥2)的子串个数.  分析: 我们能通过简 ...

  5. 热身训练2 GCD

    题目描述 简要题意:  n个数字,a1,a2,...,an m次询问(l,r),每次询问需回答 1.gcd(al,al+1,al+2,...,ar);2.gcd(ax,ax+1,ax+2,...,ay ...

  6. 热身训练2 Another Meaning

    题目来源 简要题意: 众所周知,在许多情况下,一个词语有两种意思.比如"hehe",不仅意味着"hehe",还意味着"excuse me". ...

  7. 热身训练1 Calculator

    题目出处:Calculator 简要题意: 你有一个确定的函数,f(x)=+...*...^...,其中共有n个操作,从左到右依次计算. 共有m次询问,我们每次询问,1.会修改f(x)中的操作:2.输 ...

  8. 热身训练1 ping ping ping

    点此进入 题意: 一棵树,n+1 个节点,以0号节点为根,给出端点(a,b),节点a到节点b的路径上,至少有一个点是"坏掉的",求"坏掉的点"最少 分析: St ...

  9. 热身训练1 Problem B. Harvest of Apples

    http://acm.hdu.edu.cn/showproblem.php?pid=6333 题意: 求 C(0,n)+C(1,n)+...+C(m,n) 分析: 这道题,我们令s(m,n) = C( ...

随机推荐

  1. 【第一篇】- Maven 系列教程之Spring Cloud直播商城 b2b2c电子商务技术总结

    Maven 教程 Maven 翻译为"专家"."内行",是 Apache 下的一个纯 Java 开发的开源项目.基于项目对象模型(缩写:POM)概念,Maven ...

  2. %v的使用

    不同的类型,他们的默认的%v     一个变动的格式化字符串,相当于一个变量,遇到不同类型,就变形成不同的格式. 类型 %v bool %t int/int8/... %d uint/uint8/.. ...

  3. jmeter 参数化学习之CSV Data Set Config随机读取一行参数

    需要使用到循环控制器,if控制器,CSV Data Set Config,Random Variable 4个组件 如图 先在线程组下面放一个随机数生成器 然后在同一层级设置一个永久的循环控制器,记住 ...

  4. 字符串出现的topK问题

    /** * return topK string * @param strings string字符串一维数组 strings * @param k int整型 the k * @return str ...

  5. Stage 1 项目需求分析报告

    迷你商城后台管理系统-- 需求分析 1. 引言 作为互联网热潮的崛起,消费者们的普遍差异化,实体商城要想在互联网的浪潮中继续发展,就需要制定出针对用户以及消费者的消费习惯以及喜爱品种的消费方案.从而企 ...

  6. 学习PHP中的高精度计时器HRTime扩展

    不知道大家还记得在学校的时候体育测试时老师带的秒表吗?当枪声想起时,我们开始跑步,这时秒表启动,当我们跑过终点后,老师会按下按扭记录我们的成绩,这就是一个典型的定时器的应用.今天我们要学习的内容其实就 ...

  7. php去除html标签及空格回车

    /** * 去除html标签和空格回车等 * @param $string * @return string */ function cutstr_html($string){ $string = s ...

  8. 使用ELK监控Nginx日志实现接口流量访问统计

    前段时间自己看书学习了一下elasticSearch,后面自己实践了使用elasticSearch.logStash.kibana搭建一个网站接口流量访问统计的监控看板.在这里做一些记录学习. 先看一 ...

  9. Fiddler修改抓包请求

    hi,说到fiddler的用途,第一时间想到抓包,不过还有一个功能是:支持修改请求. 那么问题来了,怎么做呢?很简单,先定下我们需要修改哪个请求. 这里用F12跟fiddler做演示. 首先我们在F1 ...

  10. HTML 网页开发、CSS 基础语法——六. HTML基本结构

    1.基本骨架 HTML文件最基本的四个标签,组成了网页的基本骨架,包括:<html>. <head>.<title>.<body>四组标签. ① < ...