博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UTR#2 T1
阅读量:7199 次
发布时间:2019-06-29

本文共 859 字,大约阅读时间需要 2 分钟。

题意:给定一个n,以下n个数(假定为fi),要求构造一个n个数的序列,使得这个序列每一个位置的最大上升子序列的长度等于对应的fi。

其实这道题是个很简单的题,之前7月也在BC上做到过,为什么要写呢,因为思维过程还是挺好的。

考虑我们要构造这么一个序列,每个位置要满足什么条件呢?首先,对于一个位置,这个位置之前的那些位置,如果它们的fi大于等于这个位置上的fi,那么我们给这个位置放的数一定要小于前面那些位置上的数,而对于小于这个位置的fi的那些位置,我们的值又要大于它们的值,也就是说安排后我们要保证fi大的位置分配给它的数一定要大。那么对于两个fi相同的位置,怎么办呢?一定是位置靠后的那个分配的小。为什么呢,很显然,如果大了的话,就可以使最大上升子序列的长度加1了。

所以这道题做法就出来了:以fi为第一关键字升序,下标为第二关键字降序,排一道序,然后对应地填上1-n这些数就好了。

1 #include
2 using namespace std; 3 #define N 100005 4 inline int read(){ 5 int x=0,f=1; char a=getchar(); 6 while(a<'0' || a>'9') {
if(a=='-') f=-1; a=getchar();} 7 while(a>='0' && a<='9') x=x*10+a-'0',a=getchar(); 8 return x*f; 9 }10 struct data{11 int num,pos;12 bool operator < (const data& w)const{13 if(num==w.num) return pos>w.pos;14 return num

 

转载于:https://www.cnblogs.com/enigma-aw/p/6265085.html

你可能感兴趣的文章
iostat 监视I/O子系统
查看>>
近期事件杂记
查看>>
gentoo下grub文件编辑
查看>>
vim 图
查看>>
html5-video标签 学习
查看>>
【HDOJ】2386 Dart Challenge
查看>>
扩展欧几里德
查看>>
505C Mr. Kitayuta, the Treasure Hunter
查看>>
hdu 1045 Fire Net
查看>>
delphi 里的@^#等符号都是什么意思?
查看>>
drf 富文本编辑器上传的图片路径问题
查看>>
工作记录--WPF自定义控件,实现一个可设置编辑模式的TextBox
查看>>
【LeetCode每天一题】Validate Binary Search Tree(有效的二叉搜索树)
查看>>
git学习笔记
查看>>
高手教你恢复误删文件的秘籍
查看>>
Hibernate 中property属性insert,update
查看>>
【小型系统】简单的刷票系统(突破IP限制进行投票)
查看>>
接口服务中的日志
查看>>
MyCAT部署及实现读写分离(转)
查看>>
多个(子)进程的开启,进程的常用属性和方法
查看>>