40 条题解
- 
  1Onlynagesha LV 9 @ 2017-01-27 11:58:31 好不容易搞出来了(手动笑哭) 
 #include <cstdio>
 #include <cstring>
 #include <algorithm>using namespace std; #define rep(id,a,b) for(int id=(a);id<(b);++id) 
 #define irep(id,a,b) for(int id=(a);id>(b);--id)
 #define reset(arr,c) memset(arr,c,sizeof(arr))typedef long long int64; const int maxN=100000+5; int N; 
 int h[maxN];void read(int* x) 
 {
 (*x)=0;
 char c=getchar();
 while(c>'9' || c<'0') c=getchar();
 while(c>='0' && c<='9')
 {
 (*x)=(*x)*10+c-'0';
 c=getchar();
 }
 }void input() { read(&N); rep(i,0,N) read(h+i); } #include <stack> struct Node 
 {
 int v,p,mv,mp;
 Node(int _v,int _p,int _mv,int _mp):v(_v),p(_p),mv(_mv),mp(_mp) {}
 };int solve() 
 {
 int ans(0);
 stack<Node> st;
 irep(i,N-1,-1)
 {
 int m=h[i],p=i;
 while(!st.empty() && h[i] < st.top().v)
 {
 if(st.top().mv > m) { m=st.top().mv; p=st.top().mp; }
 st.pop();
 }
 st.push(Node(h[i],i,m,p));
 ans=max(ans,p-i+1);
 }
 return (ans==1)?0:ans;
 }int main() { input(); printf("%d\n",solve()); return 0; } 
 提供两组易错数据:
 6
 2 8 4 5 1 9
 7
 1 8 3 4 6 5 7
- 
  0@ 2017-01-25 16:48:14暴力一发! 
 #include <bits/stdc++.h>
 #include <ext/pb_ds/tree_policy.hpp>
 #include <ext/pb_ds/assoc_container.hpp>
 using namespace std;const int N = 100000 + 5; int n, h[N]; int main() { 
 scanf("%d", &n);
 for (int i = 1; i <= n; i++) scanf("%d", &h[i]);
 int ans = 0;
 for (int i = n; i >= 1; i--) {
 int mn = h[i];
 for (int j = i - 1; j >= 1; j--) {
 if (h[j] >= h[i]) break;
 if (h[j] >= mn) continue; else mn = h[j];
 ans = max(ans, i - j + 1);
 }
 }
 printf("%d\n", ans);
 return 0;
 }
- 
  0@ 2016-09-27 16:52:13暴力即可。。。 
 #include<cstdio>
 #include<cstring>
 #include<cmath>
 #include<cstdlib>
 #include<queue>
 #include<vector>
 #include<algorithm>
 #define N 2000010
 using namespace std;
 typedef long long LL;
 int n,mx;
 int a[N];
 int main()
 {
 scanf("%d",&n);
 for(int i=1;i<=n;i++)
 scanf("%d",&a[i]);
 mx=0;
 bool flag;
 for(int i=n;i>=1;i--)
 {
 for(int j=i-1;j>=1;j--)
 {
 if(a[i]<=a[j])
 break;
 flag=1;
 for(int k=j+1;k<i;k++)
 {
 if(a[k]<=a[j]||a[k]>=a[i])
 {
 flag=0;
 break;
 }
 }
 if(flag)
 {
 mx=max(mx,i-j+1);
 if(mx==n)
 {
 printf("%d",n);
 return 0;
 }
 }
 }
 }
 printf("%d",mx);
 return 0;
 }
- 
  0@ 2016-05-22 20:48:00#include <cstdio> 
 #include <iostream>
 using namespace std;struct node 
 {
 int a,b;
 };
 node s[100001];int n; 
 int a[100001];int main() 
 {
 cin>>n;
 for(int i=1;i<=n;i++)
 cin>>a[i];a[0]=0x7fffffff; int top=0; 
 int ans=-100;
 for(int i=n;i>=0;i--)
 {
 while(top>=0 && a[i]>=a[s[top].a])
 {
 if(ans<s[top].a-s[top].b+1) ans=(s[top].a-s[top].b+1);
 if(a[s[top].b]<a[s[top-1].b]) s[top-1].b=s[top].b;
 top--;
 }
 top++;
 s[top].a=i;
 s[top].b=i;
 }
 if(ans==1) ans=0;
 cout<<ans<<endl;
 }
 //AC
- 
  0@ 2016-05-22 20:37:11//陈天神犇题解(单调栈) 
 #include <cstdio>const int maxn=100000; 
 const int maxint=0x7fffffff;int n,h[maxn+1],ans; struct cow 
 {
 int index,mini;
 cow(int i=0,int m=0):index(i),mini(m){}
 }s[maxn+1];int tot=0; void init() 
 {
 //freopen("tahort.in","r",stdin);
 //freopen("tahort.out","w",stdout);scanf("%d",&n); 
 for(int i=1;i<=n;i++)
 scanf("%d",&h[i]);
 h[0]=maxint;
 }void solve() 
 {
 for(int i=n;i>=0;i--)
 {
 while(tot&&h[i]>=h[s[tot].index])
 {
 if(ans<s[tot].index-s[tot].mini+1)
 ans=s[tot].index-s[tot].mini+1;
 if(h[s[tot].mini]<h[s[tot-1].mini])
 s[tot-1].mini=s[tot].mini;
 tot--;
 }
 s[++tot]=cow(i,i);
 }if(ans==1) 
 printf("0\n");
 else
 printf("%d\n",ans);
 }int main() 
 {
 init();
 solve();
 return 0;
 }
- 
  0@ 2016-05-22 20:15:50#include <cstdio> 
 #include <iostream>
 using namespace std;struct node 
 {
 int left,right;
 }a;
 int ans;int main() 
 {
 int n;
 scanf("%d",&n);
 int ni;
 ni=0;
 for(int i=1;i<=n;i++)
 {
 int p;
 scanf("%d",&p);
 if(ni==0)
 {
 a.left=i;
 a.right=i;
 ni=1;
 }
 else
 {
 //cout<<a[ni].left<<" "<<a[ni].right<<" "<<a[ni].lenth<<endl;
 if(p>a.left)
 {
 a.right=i;
 }
 else
 {
 if(a.right-a.left+1>ans) ans=a.right-a.left+1;
 a.right=i;
 a.left=i;
 }
 }
 }
 //5 3 4 6 2
 if(ans==1)
 {
 printf("0");
 return 0;
 }
 printf("%d\n",ans);
 return 0;
 }
- 
  0@ 2016-05-22 19:43:23#include <iostream> 
 #include <cstdio>
 using namespace std;int n,a[100001],res=0; 
 bool PP=true;int max1(int a,int b); 
 void Solve();int main(){ 
 cin>>n;
 for(int i=1;i<=n;i++) cin>>a[i];
 Solve();
 if(PP) cout<<res<<endl;
 return 0;
 }int max1(int a,int b){ 
 return (a)>(b)?(a):(b);
 }void Solve(){ 
 bool f;
 for(int i=n;i>1;i--)
 for(int j=i-1;j>=1;j--){
 if(a[i]<=a[j]) break;
 f=true;
 for(int k=j+1;k<i;k++)
 if(a[k]<=a[j] || a[k]>=a[i]) {f=false;break;}
 if(f) res=max1(res,i-j+1);
 if(res==n) {cout<<res<<endl; PP=false; return;}
 }
 }
- 
  0@ 2015-09-19 17:18:07program cow; 
 var
 a:array[1..120000] of longint;
 n,i,j,k,min,ans:longint;
 begin
 readln(n);
 for i:=1 to n do
 readln(a[i]);
 i:=n;
 ans:=0;
 //num:=1;
 while i>=1 do
 begin
 min:=a[i];
 j:=i-1;
 k:=i;
 while (j>=1) and (a[j]<a[i]) do
 begin
 //inc(num);
 if a[j]<min then
 begin
 min:=a[j];
 k:=j;
 end;
 dec(j);
 if i-k+1>ans then
 ans:=i-k+1;
 end;
 if k=i then
 dec(i)
 else i:=k;
 end;
 if ans=1 then
 ans:=0;
 writeln(ans);
 end.
- 
  0@ 2015-03-11 21:15:04
- 
  0@ 2013-08-26 15:44:32单调队列解不了吗。。。 
- 
  0@ 2009-10-15 13:22:59编译通过... 
 ├ 测试数据 01:答案正确... 0ms
 ├ 测试数据 02:答案正确... 0ms
 ├ 测试数据 03:答案正确... 0ms
 ├ 测试数据 04:答案正确... 0ms
 ├ 测试数据 05:答案正确... 0ms
 ├ 测试数据 06:答案正确... 0ms
 ├ 测试数据 07:答案正确... 0ms
 ├ 测试数据 08:答案正确... 0ms
 ├ 测试数据 09:答案正确... 0ms
 ├ 测试数据 10:答案正确... 0ms
 ---|---|---|---|---|---|---|---|-
 Accepted 有效得分:100 有效耗时:0msprogram vj1548; 
 var p,min,n,i,max:longint;
 a,f:array[0..100000] of longint;
 begin
 readln(n);a[0]:=-1;
 for i:=1 to n do readln(a[i]);
 for i:=1 to n do
 begin
 p:=i-1;min:=a[i];f[i]:=i-1;
 while p0 do
 begin
 if a[p]>=a[i] then break;
 if a[f[p]+1]max) and (i-f[i]1) then max:=i-f[i];
 writeln(max);
 end.程序短 速度快 其实是合并区间 
- 
  0@ 2009-09-19 13:44:50├ 测试数据 01:答案正确... 0ms 
 ├ 测试数据 02:答案正确... 0ms
 ├ 测试数据 03:答案正确... 0ms
 ├ 测试数据 04:答案正确... 0ms
 ├ 测试数据 05:答案正确... 0ms
 ├ 测试数据 06:答案正确... 0ms
 ├ 测试数据 07:答案正确... 0ms
 ├ 测试数据 08:答案正确... 0ms
 ├ 测试数据 09:答案正确... 0ms
 ├ 测试数据 10:答案正确... 0ms
 大牛Orz
 大家方法好多啊,自叹不如!!
- 
  0@ 2009-09-18 11:18:03此题和P1091有异曲同工之妙的感觉的说.......... 
 倒着写........
- 
  0@ 2009-09-11 20:07:08膜拜[怪盗~基德]大牛 
- 
  0@ 2009-08-27 11:13:07郁闷... 
 正着做第九个点超时..
 倒着做0msAC...
 好阴的数据啊
- 
  0@ 2009-08-11 10:52:15编译通过... 
 ├ 测试数据 01:答案正确... 0ms
 ├ 测试数据 02:答案正确... 0ms
 ├ 测试数据 03:答案正确... 0ms
 ├ 测试数据 04:答案正确... 0ms
 ├ 测试数据 05:答案正确... 0ms
 ├ 测试数据 06:答案正确... 0ms
 ├ 测试数据 07:答案正确... 0ms
 ├ 测试数据 08:答案正确... 0ms
 ├ 测试数据 09:答案正确... 0ms
 ├ 测试数据 10:答案正确... 0ms
 ---|---|---|---|---|---|---|---|-
 Accepted 有效得分:100 有效耗时:0ms
 怎么会有人超时啊 Orz
- 
  0@ 2009-08-04 15:19:29Accepted 有效得分:100 有效耗时:237ms 
 注意堆栈溢出……不要递归
- 
  0@ 2009-06-30 14:02:39很明显要写单调队列,打了个O(N)的交上去,70分 
 然后发现算法有问题,于是加个二分,o(nlgn),AC
 后来发现头指针没变,原来是栈......
- 
  0@ 2009-06-21 19:18:26编译通过... 
 ├ 测试数据 01:答案正确... 0ms
 ├ 测试数据 02:答案正确... 0ms
 ├ 测试数据 03:答案正确... 0ms
 ├ 测试数据 04:答案正确... 0ms
 ├ 测试数据 05:答案正确... 0ms
 ├ 测试数据 06:答案正确... 25ms
 ├ 测试数据 07:答案正确... 0ms
 ├ 测试数据 08:答案正确... 0ms
 ├ 测试数据 09:运行超时...
 ├ 测试数据 10:答案正确... 0ms
 ---|---|---|---|---|---|---|---|-
 Unaccepted 有效得分:90 有效耗时:25ms
 郁闷~!
 type
 maandmi=record
 max,min:longint;
 end;
 var
 n,b,c:longint;
 s,i,j:longint;maxl:longint;
 a:array[1..100000] of longint;
 procedure init;
 begin
 readln(n);
 for i:= 1 to n do
 readln(a[i]);
 end;
 function findminandmax(i,j:longint):maandmi;
 var
 k,min1,max1:longint;
 begin
 min1:=maxlongint;max1:=0;
 for k:= i to j do
 begin
 if a[k]max1 then begin max1:=a[k];findminandmax.max:=k;end;
 end;
 end;
 function check(i,j:longint):boolean;
 var
 k:longint;
 begin
 check:=true;
 for k:= i to j do
 if a[k]maxl then maxl:=s;exit;
 end
 else
 begin
 if j-i>=1 then
 begin
 d:=findminandmax(i,j);
 b:=d.min;
 c:=d.max;
 if (bi)and (bj) then begin find(i,b-1);find(b,j);end;
 if b=i then find(i+1,j);
 if b=j then find(i,j-1);
 s:=c-b+1;
 if s>maxl then maxl:=s;
 end;
 end;
 end;
 begin
 init;
 s:=0;maxl:=0;
 find(1,n);
 writeln(maxl);
 end.
 那位牛给看看!
- 
  0@ 2009-06-16 20:11:41主过程 
 {{{{ max[n]:=w[n]; min[n]:=w[n]; m[n]:=n;
 for i:=n-1 downto 1 do begin
 if w[i]>=max then begin max[i]:=w[i]; m[i]:=i end
 else begin max[i]:=max; m[i]:=m end;
 if w[i]w[i] then begin
 if m[j]-i+1>ans then ans:=m[j]-i+1;
 break
 end; }}}}}}
 if w[j]>k then begin
 if j-i+1>ans then ans:=j-i+1;
 k:=w[j]
 end
 end;
 if i+ans>n then break
 end;
 writeln(ans)
 去掉{}内部分得90;
 加上AC