zoukankan      html  css  js  c++  java
  • P6510 奶牛排队(单调栈)

    一开始写了个傻逼做法

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n;
    int a[1000001];
    int lim;
    int ans;
    int maxx;
    int po;
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i){
    		scanf("%d",&a[i]);
    	}
    	cout<<2<<endl;
    	return 0; 
    	for(int i=1;i<n;++i){
    		lim=0;
    		maxx=a[i];
    		po=i; 
    		for(int j=i+1;j<=n;++j){
    			if(a[j]<=a[i]){
    				break;
    			}
    			if(a[j]<=a[j-1]){
    					lim++;
    			}else{
    				lim++;
    				if(j==i+1){
    				lim++;
    				} 
    			if(a[j]>maxx){
    				maxx=a[j];
    				ans=max(ans,lim);
    				}
    			}	
    		}
    	}
    	cout<<ans;
    	return 0;
    }
    

    (O(n^2))都有90分
    但是太慢了,问题在哪
    每一个点向右扩展只能到第一个小于等于它的位置,这个位置能不能一下子预处理出来呢?
    然后从这个位置往左走的话,如果当前走到的这个点的左边的第一个大于等于它的点位于他们之间的话,也是不行的
    这两个一左一右能不能预处理呢
    当然可以,使用单调栈就可以了。

    #include<stack>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    struct ed{
    	int h;
    	int id;
    };
    stack <ed>q;
    int a[1000005];
    int n;
    int r[1000005];
    int ans;
    int l[1000005];
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i){
    		scanf("%d",&a[i]);
    	}
    	for(int i=1;i<=n;++i){
    		while(!q.empty()&&q.top().h>=a[i]){
    			r[q.top().id]=i;
    			q.pop();
    		}
    		q.push((ed){a[i],i
    		});
    	}
    	while(!q.empty()){
    		r[q.top().id]=n+1;
    		q.pop();
    	}
    	for(int i=n;i>=1;--i){
    		while(!q.empty()&&q.top().h<=a[i]){
    			l[q.top().id]=i;
    			q.pop();
    		}
    		q.push((ed){
    			a[i],i
    		});
    	}
    	while(!q.empty()){
    		l[q.top().id]=0;
    		q.pop();
    	}
    	for(int i=1;i<n;++i){
    		for(int j=r[i]-1;j>i;--j){
    			if(l[j]<i){
    				ans=max(ans,j-i+1);
    				break;
    			}
    		}
    	}
    	cout<<ans;
    	return 0;
    }
    
  • 相关阅读:
    巧用SQL Server Profiler
    Linq结果直接返回实体对象
    C#(MVC) Word 替换,填充表格,导出并下载PDF文档
    C#匿名类型(Anonymous Type)学习日记
    C#Lambda表达式学习日记
    C#事件(Event)学习日记
    C#委托(Delegate)学习日记
    C#隐私信息(银行账户,身份证号码,名字)中间部分特殊字符替换(*)
    CSS布局模型
    Visual Studio 内置快速生产代码简写集合
  • 原文地址:https://www.cnblogs.com/For-Miku/p/15229469.html
Copyright © 2011-2022 走看看