间桐慎二是间桐家著名的废柴,有一天,他在学校随机了一组随机数列, 准备使用他那强大的人工智能求出其最长上升子序列,但是天有不测风云,人有旦夕祸福,柳洞一成路过时把间桐慎二的水杯打翻了……
现在给你一个长度为 n 的整数序列,其中有一些数已经模糊不清了,现在请你任意确定这些整数的值,使得最长上升子序列最长(为何最长呢?因为间桐慎二向来对自己的人品很有信心) 。
标签:return 一个 bzoj 为什么 else class while led 数据
题解:一开始想得极其复杂,看了Claris的题解后也觉得极不可做,然而直到看到了这个做法:
先统计有多少个N,然后将N去掉,然后对于每个k,我们令它的值-=它前面N的个数,最后跑最长上升子序列即可。
不要问我为什么是正确的。。。如果两个K之间N的个数比这两个数的差要多,那么为什么不直接将这个K扔掉呢。。。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=100010; int n,m,sum; int s[maxn]; char str[5]; inline int rd() { int ret=0,f=1; char gc=getchar(); while(gc<‘0‘||gc>‘9‘) {if(gc==‘-‘) f=-f; gc=getchar();} while(gc>=‘0‘&&gc<=‘9‘) ret=ret*10+(gc^‘0‘),gc=getchar(); return ret*f; } int main() { n=rd(); int i,v,l,r,mid; for(i=1;i<=n;i++) { scanf("%s",str); if(str[0]==‘K‘) { v=rd()-sum; l=1,r=m+1; while(l<r) { mid=(l+r)>>1; if(s[mid]<v) l=mid+1; else r=mid; } if(l>m) m++; s[l]=v; } else sum++; } printf("%d",m+sum); return 0; }
标签:return 一个 bzoj 为什么 else class while led 数据
原文地址:http://www.cnblogs.com/CQzhangyu/p/7898252.html