生活随笔
收集整理的這篇文章主要介紹了
BEAUTIFUL
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
DESCRIPTION:
一個長度為n 的序列,對于每個位置i 的數ai 都有一個優美值,其定義是:找到序列中最
長的一段[l, r],滿足l<i<r,且[l, r] 中位數為ai(我們比較序列中兩個位置的數的大小時,
以數值為第一關鍵字,下標為第二關鍵字比較。這樣的話[l, r] 的長度只有可能是奇數),r - l
+ 1 就是i 的優美值。
接下來有Q 個詢問,每個詢問[l, r] 表示查詢區間[l, r] 內優美值的最大值。
INPUT:
第一行輸入n 接下來n 個整數,代表ai 接下來Q,代表有Q 個區間接下來Q 行,每行
兩個整數 l, r 表示區間的左右端點
OUTPUT:
對于每個區間的詢問,輸出答案
SAMPLE INPUT:
8
16 19 7 8 9 11 20 16
8
3 8
1 4
2 3
1 1
5 5
1 2
2 8
7 8
SAMPLE OUTPUT:
7
3
1
3
5
3
7
3
數據范圍:
30%: N,Q<50
70%:N,Q<2000
100%:N<2000,Q<100000,ai<200
對于所有數據,滿足n 2000, Q <100000,ai <200
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{freopen("beautiful.in",
"r",stdin);freopen("beautiful.out",
"w",stdout);static int a[
2001],b[
8001],v[
2001],f[
2001][
2001];int *l(b+
2000),*r(b+
6000);int n(
0),cnt(
0);scanf("%d",&
n);for(
int i=
1;i<=n;i++
)scanf("%d",a+
i);for(
int i=
1;i<=n;i++
){cnt=
0;memset(b,0,
sizeof(b));l[0]=r[
0]=
i;for(
int j=i-
1;j>
0;j--
){if(a[j]>a[i])cnt++
;else cnt--
;l[cnt]=
j;}cnt=
0;for(
int j=i+
1;j<=n;j++
){if(a[j]>=a[i])cnt++
;else cnt--
;r[cnt]=
j;}v[i]=
0;for(
int j=-n;j<=n;j++
)if(l[j]&&r[-
j])v[i]=max(v[i],r[-j]-l[j]+
1);} for(
int i=
1;i<=n;i++
)f[i][i]=
v[i];for(
int i=
1;i<=n;i++
)for(
int j=i+
1;j<=n;j++
)f[i][j]=max(f[i][j-
1],f[j][j]);int q(
0);scanf("%d",&
q);while(q){q--
;int lt(
0),rt(
0);scanf("%d%d",<,&
rt);printf("%d\n",f[lt][rt]);}return 0;
} ?
轉載于:https://www.cnblogs.com/JebediahKerman/p/6011310.html
總結
以上是生活随笔為你收集整理的BEAUTIFUL的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。