zoukankan      html  css  js  c++  java
  • {POJ}{3903}{Stock Exchange}{nlogn 最长上升子序列}

    题意:求最长上升子序列,n=100000

    思路:O(N^2)铁定超时啊。。。。利用贪心的思想去找答案。利用栈,每次输入数据检查栈,二分查找替换掉最小比他大的数据,这样得到的栈就是更优的。这个题目确实不错,思路很好

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <memory>
    #include <cmath>
    #include <bitset>
    #include <queue>
    #include <vector>
    #include <stack>
    using namespace std;
     
     
    #define CLR(x,y) memset(x,y,sizeof(x))
    #define MIN(m,v) (m)<(v)?(m):(v)
    #define MAX(m,v) (m)>(v)?(m):(v)
    #define ABS(x) ((x)>0?(x):-(x))
    #define rep(i,x,y) for(i=x;i<y;++i)
    
    
    const int MAXN = 110000;
    
    int n,m;
    int len;
    int val;
    int s[MAXN];
    
    int BF(int cur)
    {
    	int low,high,mid;
    	int pre;
    
    	low = 0;
    	high = len-1;
    	while(low <= high)
    	{
    		mid = (low+high)>>1;
    		if(s[mid]<cur){
    			low = mid+1;
    		}
    		else if(s[mid]>cur){
    			high = mid-1;
    		}
    		else 
    			return mid;
    	}
    	return low;
    }
    void Solve()
    {
    	while(scanf("%d",&n)!=EOF)
    	{
    		len = 0;
    		for(int i = 0 ; i < n; ++i)
    		{
    			scanf("%d",&val);
    			if(len == 0 || s[len-1] < val){
    				s[len] = val;
    				++len;
    			}
    			else
    			{
    				int f = BF(val);
    				s[f] = val;
    			}
    		}
    
    		printf("%d
    ",len);
    	}
    }
    
    int main()
    {
    	Solve();
    
    	return 0;
    }
    
  • 相关阅读:
    Method of Four Russians 学习笔记
    一道不知道哪里来的数论题
    ICPC2021银川 游记
    决策单调性优化dp学习笔记
    浅谈如何优美地实现线段树?
    2021 EC Final 2020 题解
    5.5 SYSU校内训练
    5.4 SYSU校内训练
    存储相关招聘信息-长期
    screen几个使用方法
  • 原文地址:https://www.cnblogs.com/lvpengms/p/3922813.html
Copyright © 2011-2022 走看看