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 內最長...