DP【洛谷P1704】 寻找最优美做题曲线
【洛谷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”(不加引号,全是小写字母)。
自己YY的做法A了两道题了,十分开心,不过看到了我的做法居然和这道题的作者的作法一样,不太开心。。。
这道题就是在一个序列中让你选定一些数,再在必选这些数的基础上找出LIS。
我的做法挺鬼畜的。
首先对于一个要选定的点,我们可以排除一些绝对不会选的点。条件就是在当前点前面的点的值如果大于当前点,那么因为当前点必选,所以就可以排除那个前面的点,同样的,如果当前点后面的点的值小于当前点的值,那么我们也不选。
这样,我们就可以得到一个新的数组,在这个数组里直接求一遍LIS就行了。
刚刚自己想了一下,忽然感觉这个做法是错误的,因为我感觉在新数组里选LIS并没有保证原本要选的点一定被选。
但是并不是这样的,(机房一堆大佬反驳我。。。可是我说我的做法错他们反驳说对是什么鬼啊。。。)
我们可以这么想,对于一个一定要选的点,经过我们的处理,在这个点之前是一段全部小于他的数,后面是一段全部大于他的数,那么不管我们在这前后两段怎么选,都一定不会有一个数去替代他的位置,也就是说,我们可以用反证法证不选他不是最优的就可以了。
开心。
code:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int wx=500017;
inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}
return sum*f;
}
int n,m,ans[wx],len,tot;
int flag[wx],a[wx],b[wx],f[wx],vis[wx];
int main(){
n=read();m=read();
for(int i=1,x;i<=m;i++)x=read(),flag[x]=1;
for(int i=1;i<=n;i++)a[i]=read();
int last=0;
for(int i=1;i<=n;i++){
if(a[i]>a[last])vis[i]=1;
if(flag[i])last=i;
}
last=n+1;a[n+1]=0x3f3f3f3f;
for(int i=n;i>=1;i--){
if(a[i]>a[last]&&flag[i]){
printf("impossible");return 0;
}
if(a[i]>a[last])vis[i]=0;
if(flag[i])last=i;
}
for(int i=1;i<=n;i++){
if(vis[i])b[++tot]=a[i];
}
ans[1]=b[1];len=1;
for(int i=2;i<=tot;i++){
if(b[i]>ans[len]){
ans[++len]=b[i];
}
else{
int pos=lower_bound(ans,ans+len,b[i])-ans;
ans[pos]=b[i];
}
}
printf("%d\n",len);
return 0;
}
DP【洛谷P1704】 寻找最优美做题曲线的更多相关文章
- luogu P1704 寻找最优美做题曲线
题目背景 nodgd是一个喜欢写程序的同学,前不久(好像还是有点久了)洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- 题 ...
- (luogu1704)寻找最优美做题曲线 [TPLY]
寻找最优美做题曲线 题目链接:https://www.luogu.org/problemnew/show/P1704 题目大意: 求包含指定点的最长不降子序列(严格递增) 题解 首先我们发现 一个序列 ...
- LIS【p1704】寻找最优美做题曲线
Description 洛谷OJ刷题有个有趣的评测功能,就是系统自动绘制出用户的"做题曲线".所谓做题曲线就是一条曲线,或者说是折线,是这样定义的:假设某用户在第b[i]天AC了c ...
- 树形DP 洛谷P2014 选课
洛谷P2014 选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门 ...
- 经典DP 洛谷p1880 石子合并
https://www.luogu.org/problemnew/show/P1880 题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新 ...
- 【洛谷P3709】大爷的字符串题
看这题网上居然还没人写blog,怕是都去看洛谷自带的了-- 你才是字符串!你全家都是字符串!这题跟字符串没多大关系,只是出题人lxl想要吐槽某中学而已--... 其实这题说白了就是问区间里出现最多的数 ...
- 洛谷P1072 [NOIP2009] Hankson 的趣味题
P1072 Hankson 的趣味题 题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson 正在思考一 ...
- 区间DP 洛谷P2858牛奶零食
题目链接 题意:你有n个货物从1-n依次排列,每天可以从两侧选一个出来卖,卖的价格是当天的天数乘该货物的初始价格,问这批货物卖完的最大价格 输入:第一行n,之后是n个货物的初始价值 这道题不能用贪心做 ...
- [DP]洛谷P1115最大子段和
题目来源 https://www.luogu.org/problemnew/show/P1115 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一 ...
随机推荐
- 转:InnoDB Page Structure(InnoDB页面结构详解)
InnoDB Page Structure(InnoDB页面结构详解) 此转载自登博的博客,给大家分享.
- HTML5实用知识点
本文讲解HTML5实用知识点 新增的表单type Canvas使用 SVG使用 Audio使用 Video使用 网页缓存 文件缓存 后台worker Server-Sent Events 定位 拖放功 ...
- 2016.7.27 VS搜索正则表达式,在UltraEdit中可选用Perl正则引擎,按C#语法搜索
表达式 语法 说明 任一字符 . 匹配除换行符外的任何一个字符. 最多 0 项或更多 * 匹配前面表达式的 0 个或更多搜索项. 最多一项或更多 + 匹配前面表达式的至少一个搜索项. 最少 0 项或更 ...
- Drools学习笔记4—Consequence/RHS
Right Hand Side,当LHS所有条件满足才会执行 可以使用LHS部分定义的绑定变量.全局变量.或者直接编写JAVA代码. 提供宏函数操作working memory fact对象,如ins ...
- 第十二章 Jetty的工作原理解析(待续)
Jetty的基本架构 Jetty的启动过程 接受请求 处理请求 与JBoss集成 与Tomcat的比较
- CGContextRef详解
/* CoreGraphics - CGContext.h */ /** Graphics state functions. **/ //为了让开发者在进行坐标变换时无须计算多次坐标变换后的累加结果, ...
- ABP仓储
简介 我们都知道ABP已经实现了仓储模式,支持EF core 和dapper 进行数据库的连接和管理,可以很方便的注入仓储来操作你的数据,不需要自己单独定义一个仓储来实现,通用的仓储实现了通用的cru ...
- js在浏览器下的区别小结(部分)
1.初始化数组: document.write([1,2,3,].length); IE:4//把数组中最后一个逗号后面的当做了undefined元素 FF.Opera.Safari:3 2.join ...
- matlab学习笔记(3)
数据分析: 多项式: 多项式表示:p = [1 2 3 0]; //表示 1*x^3+2*x^2+3*x^1+0 ,系数从高次向低次项,0系数不能省略. roots函数:求解多项式的根.roots(p ...
- 数据库监听。数据库一次notify,Activity多次接收
今天项目中发现一个bug: (1)当uri数据库中有更新,会从数据库层DataService中通知应用层,调用notifyChange: mContext.getContentResolver().n ...