题解

40 条题解

  • 1
    @ 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;}
    }
    }

    • @ 2016-05-22 19:45:10

      单调栈,全AC.
      LOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL

  • 0
    @ 2015-09-19 17:18:07

    program 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 有效耗时:0ms

    program 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:29

    Accepted 有效得分: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

信息

ID
1548
难度
7
分类
数据结构 | 单调队列 点击显示
标签
(无)
递交数
915
已通过
156
通过率
17%
被复制
1
上传者