noip模拟【noname】
noname
【问题描述】
给定一个长度为n的正整数序列,你的任务就是求出至少需要修改序列中的多少个数才能使得该数列成为一个严格(即不允许相等)单调递增的正整数序列,对序列中的任意一个数,你都可以将其修改为任意的正整数。
【输入格式】
每个测试点第一行为一个正整数T,表示该测试点内的数据组数,你需要对该测试点内的T组数据都分别给出正确的答案才能获得该测试点的分数。
接下来T组数据,每组数据第一行一个正整数n,表示序列长度,接下来一行n个正整数描述这个序列。
【输出格式】
对于每一组测试数据输出一行一个非负整数表示答案。
【输入输出样例】
noname.in |
noname.out |
4 3 1 1 2 3 2 2 3 4 1 2 3 4 4 2 3 3 4 |
2 1 0 2 |
【样例解释】
第一组数据中,由于正整数的限制,只能修改序列中第2、3个数。
第二组数据中,将第一个数修改为1即可。
第三组数据已经符合条件,不需要修改。
第四组数据中,由于正整数的限制,只修改一个数并不能完成任务,而需要同时修改前两个数或者后两个数。
【数据规模与约定】
对于30%的数据,有1≤n≤10。
对于80%的数据,有1≤n,T≤50,且输入序列中每个数均不超过50。
对于100%的数据,有1≤n≤50000,1≤T≤5000,输入序列中每个数均为不超过1000000000(10^9)的正整数,且每个测试点中T组数据对应的n值总和不超过500000。
【题解思路】
这题看着怎么这么像LIS啊?(:雾
回顾一下dp入门题LIS ?
依稀记得这题是可以二分优化的吧:O(n^2) à O(nlogn)
我们思考类型题:
- 把一个序列改成非严格单调递增的(单调不下降的),至少需要修改多少个数?
A:用该序列总长度减去最长不下降子序列的长度。
2.那么把一个序列改成严格单增的呢?
A:用该序列总长度减去最长上升子序列的长度?标准错答案啊。
正解是:构造序列B[i] = A[i] – i;答案即为序列总长度减去B的最长不下降子序列。
Why??? 因为要求严格单调递增,所以前一项与后一项至少相差一,将这个必要的差值减去,就相当于求B改成非严格单增最少需修改的数,也就相当于第一个问题。
3.(本题)在2的条件下把整数改成了正整数。题目意思就变成:求首项为非负整数的最长上升子序列。
那岂不是很简单的一个dp ???当然还是需要二分优化的啦。
【code】
#include<bits/stdc++.h>
using namespace std;
const int maxx= ;
int a[maxx],b[maxx],n,T,f[maxx],len;
inline int read(){
int x=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int find(int x){
int l = ,r = len + ;
if(x < f[])return ;
while(l+ < r){
int m = l + r>>;
if(f[m] <= x) l=m;
else r = m;
}
return l;
}
void work(){
len = ;
for(int i = ;i <= n;i++){
if(b[i] < )continue;
int id = find(b[i]);
len = max(id + ,len);
f[id+] = min(f[id+],b[i]);
}
printf("%d\n",n-len);
}
int main(){
freopen("noname.in","r",stdin);
freopen("noname.out","w",stdout);
T = read();
while(T--){
n = read();
memset(f,0x3f,sizeof(f));
for(int i = ;i <= n; ++i){
a[i] = read();
b[i] = a[i] - i;
}
work();
}
return ;
}
noip模拟【noname】的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
随机推荐
- HttpServletRequest常用方法
1.获取客户机信息 getRequestURL:该方法返回客户端发出请求时的完整URL getRequestURI:该方法返回请求行中的资源名部分 getQueryString:该方法返回请求中的参数 ...
- jdbc连接oracle的几种格式
1. SID的方式.已经不推荐使用这种方式了. jdbc:oracle:thin:[<user>/<password>]@<host>[:<port>] ...
- c#之根据出生日期获得星座信息
星座定义如下: 代码如下: public enum Constellation { Aquarius = , // 水瓶座 1.20 - 2.18 Pisces = , // 双鱼座 2.19 - 3 ...
- Springboot的异步线程池
1:定义线程池 @EnableAsync @Configuration class TaskPoolConfig { @Bean("taskExecutor") public Ex ...
- 54. Spiral Matrix(剑指offer 19)
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- kali linux android木马(内网+外网)
1,内网木马 先生成一个小马 msfpayload -p android/meterpreter/reverse_tcp LHOST=192.168.8.104 LPORT=5555 R > a ...
- 17.Setters/getters
知道类的成员变量何时因某种原因发生变化通常很有用.也可能需要以某种方式封装其访问. 为此,GDScript使用 setget 关键字提供了一个 setter/getter 语法.在变量定义后可直接使用 ...
- BR(BoomerangRobot)机器人项目
项目宗旨:推动机器人技术及相关知识的普及,增进广大机器人DIYer们的交流,提高爱好者们自身的专业水平,项目提供以机器人BR(boomerangrobot)为硬件平台,ROS(robot operat ...
- Java将对象保存到文件中/从文件中读取对象
1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: public static void writeObjectToFile(Obje ...
- kalinux 换源
1.系统使用第一步建议先换源,否则将出现很多未知问题 #以下两个2选1,打开要编辑的源 sudo leafpad /etc/apt/sources.list sudo gedit /etc/apt/s ...