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 -
02017-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;
} -
02016-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;
} -
02016-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 -
02016-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;
} -
02016-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;
} -
02016-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;}
}
} -
02015-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. -
02015-03-11 21:15:04@
-
02013-08-26 15:44:32@
单调队列解不了吗。。。
-
02009-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.程序短 速度快 其实是合并区间
-
02009-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
大家方法好多啊,自叹不如!! -
02009-09-18 11:18:03@
此题和P1091有异曲同工之妙的感觉的说..........
倒着写........ -
02009-09-11 20:07:08@
膜拜[怪盗~基德]大牛
-
02009-08-27 11:13:07@
郁闷...
正着做第九个点超时..
倒着做0msAC...
好阴的数据啊 -
02009-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 -
02009-08-04 15:19:29@
Accepted 有效得分:100 有效耗时:237ms
注意堆栈溢出……不要递归 -
02009-06-30 14:02:39@
很明显要写单调队列,打了个O(N)的交上去,70分
然后发现算法有问题,于是加个二分,o(nlgn),AC
后来发现头指针没变,原来是栈...... -
02009-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.
那位牛给看看! -
02009-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