luogu P1704 寻找最优美做题曲线
题目背景
nodgd是一个喜欢写程序的同学,前不久(好像还是有点久了)洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题。于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家……
题目描述
洛谷OJ刷题有个有趣的评测功能,就是系统自动绘制出用户的“做题曲线”。所谓做题曲线就是一条曲线,或者说是折线,是这样定义的:假设某用户在第b[i]天AC了c[i]道题,并且b[i]严格递增,那么该用户的做题曲线就是平面上点(i,c[i])依次连出的一条折线。比如你在第1天做了3道题,第3天做了4道题,第6天做了1道题,那么你在前6天的做题曲线就是从点(1,3)到点(2,4)到点(3,1)的连续折线。
nodgd同学可以预测出自己未来N天每条能够AC题目的数量,同时有一个很无趣的爱好,就是单调递增,nodgd强迫自己的做题曲线保持严格的单调递增。但是出于某些原因,nodgd在某些日子(共有K天)必须刷题,而且刷题数量一定是预计的数量(体现nodgd的神预测)。nodgd同学想知道,在这样的情况下,自己最多有多少天可以刷题,不过nodgd同学还有大量的数学竞赛题、物理竞赛题、英语竞赛题、美术竞赛题、体育竞赛题……要做,就拜托你来帮他算算了。
输入输出格式
输入格式:
第一行两个正整数,N和K,表示nodgd预测了未来N天每天做题的数量,其中K天必须刷题。
第二行K个正整数p[i],表示第p[i]天必须刷题(1<=p[i]<=N,保证每个p[i]不同)。
第三行N个正整数c[i],表示在第i天nodgd可以AC的题目数量必须是c[i]。
输出格式:
一行。
如果能找到严格递增的做题曲线:一个正整数,表示nodgd最多有多少天可以刷题。
如果找不到严格递增的做题曲线:直接输出“impossible”(不加引号,全是小写字母)。
输入输出样例
输入样例#1:
13 4
2 13 8 7
6 10 9 8 9 10 11 16 14 12 13 14 18
输出样例#1:
5
说明
数据范围
1<=N<=500000,1<=K<=N/2
1<=p[i]<=N,保证每个p[i]不同,不保证p[i]按大小顺序输入
1<=c[i]<=10^9
若果一数在序列内严格比他前面的书大,比后面的数小,那么这个数一定存在于最长上升子序列中
显然在规定必须选取的连续两天内,比前一天小的和比后一天大的一定不合法,去掉之后便可使规定选取数变为上述数
删掉不合法数然后求一遍最长上升子序列就好,注意,第七组数据规定了必须要取第0天,这是一个坑点,当然是O(nlogn)的啦(≧▽≦)/
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 500007;
int a[maxn],b[maxn],tmp[maxn],len=1,n,m;
bool tag[maxn];
bool check() {
sort(b+1,b+m+1);
for(int i=2;i<=m;++i) {
if(a[b[i]]<a[b[i-1]]) {
puts("impossible");return 1;
}
}
return 0;
}
int mid_serch(int x) {
int l=1,r=len;
while(l<=r) {
int mid=(l+r)>>1;
if(tmp[mid]<a[x])l=mid+1;
else r=mid-1;
}
return l;
}
int main () {
int t=0;
//freopen ("a.in","r",stdin);
//freopen("a.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) {scanf("%d",b+i);if(b[i]==0)t=1;}
for(int i=1;i<=n;++i) scanf("%d",a+i);
if(check())return 0;
for(int i=2;i<=m;i++)
for(int j=b[i-1]+1;j<b[i];++j)
if(a[j]<=a[b[i-1]]||a[j]>=a[b[i]])tag[j]=1;
for(int i=1;i<b[1];++i)
if(a[i]>=a[b[1]])
tag[i]=true;
for(int i=b[m]+1;i<=n;++i)
if(a[i]<=a[b[m]])
tag[i]=true;
tmp[1]=a[1];
for(int i=2;i<=n;++i) {
if(tag[i])continue;
if(a[i]>tmp[len])tmp[++len]=a[i];
else {
int pos=mid_serch(i);
tmp[pos]=a[i];
}
}
//for(int i=1;i<=len;i++) {
// printf("%d\n",tmp[i]);
//}
printf("%d\n",len+t);
return 0;
}
luogu P1704 寻找最优美做题曲线的更多相关文章
- DP【洛谷P1704】 寻找最优美做题曲线
[洛谷P1704] 寻找最优美做题曲线 题目背景 nodgd是一个喜欢写程序的同学,前不久(好像还是有点久了)洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情, ...
- (luogu1704)寻找最优美做题曲线 [TPLY]
寻找最优美做题曲线 题目链接:https://www.luogu.org/problemnew/show/P1704 题目大意: 求包含指定点的最长不降子序列(严格递增) 题解 首先我们发现 一个序列 ...
- LIS【p1704】寻找最优美做题曲线
Description 洛谷OJ刷题有个有趣的评测功能,就是系统自动绘制出用户的"做题曲线".所谓做题曲线就是一条曲线,或者说是折线,是这样定义的:假设某用户在第b[i]天AC了c ...
- [日记&做题记录]-Noip2016提高组复赛 倒数十天
写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...
- AtCoder Grand Contest 11~17 做题小记
原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-11-to-20.html UPD(2018-11-16): ...
- noip做题记录+挑战一句话题解?
因为灵巧实在太弱辽不得不做点noip续下命QQAQQQ 2018 积木大赛/铺设道路 傻逼原题? 然后傻逼的我居然检查了半天是不是有陷阱最后花了差不多一个小时才做掉我做过的原题...真的傻逼了我:( ...
- 小学生轻松做题App
作业链接:https://edu.cnblogs.com/campus/fzzcxy/2016SE/homework/2180 原型模型设计工具:墨刀 原型模型链接:https://modao.cc/ ...
- 洛谷P3926 SAC E#1 - 一道不可做题 Jelly【模拟/细节】
P3926 SAC E#1 - 一道不可做题 Jelly [链接]:https://www.luogu.org/problem/show?pid=3926 题目背景 SOL君(炉石主播)和SOL菌(完 ...
- luogu 2296 寻找道路 (搜索)
luogu 2296 寻找道路 题目链接:https://www.luogu.org/problemnew/show/P2296 从终点bfs或者dfs,找出所有终点能到达的点. 然后再从1到n看一下 ...
随机推荐
- Ibatis入门基本语法
1. Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate.Toplink等在java编程的对象持久化方面深受开发人员欢迎. 对象关系映 ...
- bcdboot应用
1.下个win8 的pe,功能齐全的.2.CMD执行命令 bcdboot c:\windows /s x: /f all c代表c盘即win所在分区盘符.s,命令参数,引导另存到其他地方.x,某储存引 ...
- javascript顺序数组简单实现个二分查找
直接上码了注释写得很详细: function bsearch(A,x){ //l:查找范围左 r:查找范围右 let l = 0, //查询范围左边界 r = A.length-1, //查找范围右边 ...
- UVa-232-纵横字谜的答案
这一题的话,输出的时候,我们要按照3位输出,不能按照两位,因为是10*10的网格,所以就是100位,不管有没有100的起始格,它都是按照3位进行输出的,从题上的输出可以看到,不然的话,就会PE. 然后 ...
- 老男孩Python高级全栈开发工程师【真正的全套完整无加密】
点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师[真正的全套完整无加密] 课程大纲 老男孩python全栈,Python 全栈,Python教程,Django ...
- MySQL 之视图、 触发器、事务、存储过程、内置函数、流程控制、索引
本文内容: 视图 触发器 事务 存储过程 内置函数 流程控制 索引 ------------------------------------------------------------------ ...
- Python9-模块2-包的进阶-day21
包是一种通过使用‘.模块名’来组织python模块名称空间的方式. 1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉: ...
- C++ 字符串分割,并把子字符串转换成int型整数
主要涉及到string类的两个函数find和substr: find()函数的用法: 原型:size_t find ( const string& str, size_t pos = 0 ) ...
- PAT Basic 1064
1064 朋友数 如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”.例如 123 和 51 就是朋友数,因为 1+2+3 = 5+1 = 6,而 6 就是它 ...
- 通过 PC 远程控制 Android 的应用 -- 可以将手机屏幕投射显示到电脑上
测试结果中的部分测试图:Mobizen手机界面: 电脑界面: 主界面 视频 全屏视频 WebKey手机界面: 电脑界面: AirMore手机界面: 电脑界面:主界面 镜像 全屏镜像 Airdroid手 ...