描述
zzx和city一直喜欢一起玩游戏,某一天zzx做了一个丧心病狂的消消乐游戏,游戏是这样的,zzx随机生成一个序列让city从前往后寻找5个数ai(1<=i<=5)如果5个数ai满足a1<a2<a3<a4<a5则可以消除这5个数,然而目前出现了一种情况,就是zzx和city不清楚这个序列还有没有可以消除的方案,所以想请你帮忙判断一下。
输入
输入数据有多组,输入到文件结束为止。
第一行输入一个N(106>=N>=5)。
第二行输入N个zzx随机生成的序列(在int32范围内的数字)。
输出
如果有可以消除的方案,输出YES,否则输出NO
样例输入
样例输出
解题思路:二分 替换
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 7 int n; 8 const int N=1e6+5; 9 int dp[N],arr[N]; 10 int len; 11 12 //inline int read(){ 13 // int x=0,f=1; 14 // char ch=getchar(); 15 // while(ch<'0'||ch>'9'){ 16 // if(ch=='-') f=-1; 17 // ch=getchar(); 18 // } 19 // while(ch>='0'&&ch<='9'){ 20 // x=(x<<1)+(x<<3)+(ch^48); 21 // ch=getchar(); 22 // } 23 // return x*f; 24 //} 25 26 void Binary(int num){ 27 int left=1,right=len; 28 int ans; 29 while(left<=right){ 30 int mid=left+right>>1; 31 if(dp[mid]>=num) ans=mid,right=mid-1; 32 else left=mid+1; 33 } 34 dp[ans]=num; 35 } 36 37 int main(){ 38 while(scanf("%d",&n)!=EOF){ 39 for(int i=1;i<=n;i++) scanf("%d",&arr[i]); 40 dp[1]=arr[1]; 41 len=1; 42 for(int i=2;i<=n;i++){ 43 if(arr[i]>dp[len]) dp[++len]=arr[i]; 44 else{ 45 Binary(arr[i]); 46 } 47 } 48 if(len>=5) printf("YES "); 49 else printf("NO "); 50 } 51 return 0; 52 }