BZOJ 4491 我也不知道題目名字是什麼

2022-04-30 08:03:08 字數 1213 閱讀 2692

time limit: 10 sec  memory limit: 512 mb

submit: 278  solved: 154

[submit][status][discuss]

給定乙個序列a[i],每次詢問l,r,求[l,r]內最長子串,使得該子串為不上公升子串或不下降子串

第一行n,表示a陣列有多少元素

接下來一行為n個整數a[i]

接下來乙個整數q,表示詢問數量

接下來q行,每行2個整數l,r

對於每個詢問,求[l,r]內最長子串,使得該子串為不上公升子串或不下降子串

91 2 3 4 5 6 5 4 3

51 6

1 72 7

1 95 966

564//樣例解釋

五個詢問分別對應

[1,6][1,6][2,6][1,6][6,9]

n,q<=50000

by 乙個讀錯題的沙茶

其實就是乙個很經典的思想...

既然是最長的不下降子串,也就是連續的,那麼我們就差分一下,這樣就轉化成最長的大於等於0的連續子串...線段樹維護前字尾和區間最長就好了...

其實寫這道題主要目的是記錄一下某只智障(我...)的事蹟...

交上去怎麼都tle,然後要了資料,發現可以跑出來答案還是對的...但是跑得極其慢.....大概就是100s估計也跑不出來...

然後請來ryc小盆友來查錯...我說我再怎麼也不能把線段樹寫成$o(n^2)$的吧...剛說完一秒鐘ysq小盆友指了query的這一行...

inline m query(int l,int r,int tr)tree[maxn<<2];

inline m merge(m a,m b)

inline void build(int l,int r,int tr)

int mid=(l+r)>>1;

build(l,mid,tr<<1),build(mid+1,r,tr<<1|1);

tree[tr]=merge(tree[tr<<1],tree[tr<<1|1]); }

inline m query(int l,int r,int tr)

}tr1,tr2;

signed main(void){

scanf("%d",&n);

for(int i=1;i<=n;i++) scanf("%d",&a[i]);

for(int i=1;iby neighthorn

BZOJ 4491 我也不知道題目名字是什麼

給定乙個序列a i 每次詢問l,r,求 l,r 內最長子串,使得該子串為不上公升子串或不下降子串 第一行n,表示a陣列有多少元素 接下來一行為n個整數a i 接下來乙個整數q,表示詢問數量 接下來q行,每行2個整數l,r 對於每個詢問,求 l,r 內最長子串,使得該子串為不上公升子串或不下降子串 9...

BZOJ4491 我也不知道題目名字是什麼

給定乙個序列a i 每次詢問l,r,求 l,r 內最長子串,使得該子串為不上公升子串或不下降子串 第一行n,表示a陣列有多少元素 接下來一行為n個整數a i 接下來乙個整數q,表示詢問數量 接下來q行,每行2個整數l,r 對於每個詢問,求 l,r 內最長子串,使得該子串為不上公升子串或不下降子串 9...

BZOJ4491 我也不知道題目名字是什麼

試題描述 給定乙個序列 a i 每次詢問 l,r 求 l,r 內最長子串,使得該子串為不上公升子串或不下降子串 輸入第一行 n 表示 a 陣列有多少元素 接下來一行為 n 個整數 a i 接下來乙個整數 q 表示詢問數量 接下來 q 行,每行 2 個整數 l r 輸出對於每個詢問,求 l,r 內最長...