- 优美值
- 题目描述
-
输入格式
- 接下来一行为整数Q,代表有 Q个区间需要查询。
- 接下来Q行,每行 两个整数l,r(l<=r),表示区间的左右端点。
输出格式
样例
数据范围与提示
n<=2000,Q<=100000,ai<=2001 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int maxn=2000+10; 6 int a[maxn],w[maxn]; 7 int n,l[maxn<<1],r[maxn<<1]; 8 void solve(){ 9 int cnt=0; 10 for(int i=1;i<=n;i++){ 11 memset(l,0,sizeof(l)); 12 memset(r,0,sizeof(r)); 13 l[n]=i; 14 r[n]=i; 15 cnt=0; 16 for(int j=i-1;j>=1;j--){ 17 if(a[j]>a[i]) cnt++; 18 else cnt--; 19 l[cnt+n]=j; 20 } 21 cnt=0; 22 for(int j=i+1;j<=n;j++){ 23 if(a[j]>=a[i]) cnt++; 24 else cnt--; 25 r[cnt+n]=j; 26 } 27 int t=max(i-1,n-i); 28 for(int j=1-i;j<=i-1;j++){ 29 if(l[j+n]>0&&r[-j+n]>0){ 30 w[i]=max(w[i],r[n-j]-l[j+n]+1); 31 } 32 } 33 } 34 } 35 int main(){ 36 scanf("%d",&n); 37 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 38 solve(); 39 int q; 40 scanf("%d",&q); 41 for(int i=1;i<=q;i++){ 42 int x,y; 43 scanf("%d%d",&x,&y); 44 int ans=0; 45 for(int j=x;j<=y;j++){ 46 ans=max(ans,w[j]); 47 } 48 printf("%d ",ans); 49 } 50 return 0; 51 }