題解 bzoj4540 HNOI2016 序列

2021-08-06 08:20:56 字數 2499 閱讀 9429

給定長度為n的序列:a1,a2,…,an,記為a[1:n]。類似地,a[l:r](1≤l≤r≤n)是指序列:al,al+1,…,ar-1,ar。若1≤l≤s≤t≤r≤n,則稱a[s:t]是a[l:r]的子串行。現在有q個詢問,每個詢問給定兩個數l和r,1≤l≤r≤n,求a[l:r]的不同子串行的最小值之和。例如,給定序列5,2,4,1,3,詢問給定的兩個數為1和3,那麼a[1:3]有6個子序列a[1:1],a[2:2],a[3:3],a[1:2],a[2:3],a[1:3],這6個子序列的最小值之和為5+2+4+2+2+2=17。

輸入檔案的第一行包含兩個整數n和q,分別代表序列長度和詢問數。接下來一行,包含n個整數,以空格隔開

,第i個整數為ai,即序列第i個元素的值。接下來q行,每行包含兩個整數l和r,代表一次詢問。

對於每次詢問,輸出一行,代表詢問的答案。

5 5

5 2 4 1 3

1 5

1 3

2 4

3 5

2 5

28 17

11 11

17 1 ≤n,q ≤ 100000,|ai| ≤ 10^9

考慮序列中的某個數ai

,記它左邊第乙個比他小的數的位置為la

sti (如果沒有就是0),記它右邊第乙個比他小的數的位置為ne

xti (如果沒有就是n+1)。我們可以知道該數有貢獻的區間左端點範圍為[l

asti

+1,i

] ,右端點範圍為[i

,nex

ti−1

] 。所以我們可以把乙個數有貢獻的範圍看做平面上乙個矩形,這個平面的橫座標代表的是某個區間左端點,縱座標代表的是某個區間的右端點,即平面上的點(l,r)代表的是區間[l,r]。所以對於ai

來說,它的貢獻範圍在平面上就是橫座標在[l

asti

+1,i

] ,縱座標在[i

,nex

ti−1

] 範圍內的矩形區域。同時對於乙個詢問[l,r],它所詢問的就是橫座標大於l、縱座標小於r的矩形區域(我們預設平面上r>l的區域貢獻是0)。於是問題被我們轉換成了平面矩形加法、平面矩形查詢權值和的問題。這個可以離線+掃瞄線用樹狀陣列/線段樹在o(

nlog

2n) 的時間內完成。

對於平面矩形加法、平面矩形查詢權值和的問題,我們按y從小到大掃。

設當前掃瞄線高度為h,矩形上界為up,矩形下界為down,左邊為l,右邊為r,當前矩形權值為val。

如果當前矩形還沒有掃到上界,那麼他在橫座標[l,r]範圍內每個點的貢獻為(h

−dow

n)∗v

al=h

∗val

−dow

n∗va

l ,我們用兩個樹狀陣列/線段樹分別維護橫座標上的va

l 和do

wn∗v

al,查詢的時候乙個乘乙個加,是k∗

h+b 的形式,即第乙個樹狀陣列中維護每個橫縱標對於當前h的k值,第二個則維護b值。

如果當前矩形掃到了上界,即將退出,那麼他將來在橫座標[l,r]範圍內每個點的貢獻為(u

p−do

wn)∗

val ,由於這個貢獻不會再變化,所以我們可以把這個貢獻加到第二個樹狀陣列/線段樹中維護,同時刪除第乙個線段樹中的val即可。

**:

#include

#include

#include

using

namespace

std;

template

inline

void read(t &x)

typedef

long

long ll;

const

int maxn=100010;

int n,m,a[maxn],l[maxn],r[maxn],cnt,sta[maxn],top;

ll ans[maxn];

struct line

void add(int x,ll val)

void add(int l,int r,ll val)

ll query(int x)

ll query(int l,int r)

}k,b;

int main()

sta[top=0]=n+1;

for(int i=n;i>=1;i--)

for(int i=1;i<=m;i++)

cnt=m;

for(int i=1;i<=n;i++)

sort(q+1,q+cnt+1);

for(int i=1;i<=cnt;i++)

else

if(q[i].f==2)

else ans[q[i].id]=k.query(q[i].l,n)*q[i].y+b.query(q[i].l,n);

}for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);

return

0;}

BZOJ4540 HNOI2016 序列 莫隊

time limit 20 sec memory limit 512 mb 給定長度為n的序列 a1,a2,an,記為a 1 n 類似地,a l r 1 l r n 是指序列 al,al 1,ar 1,ar。若1 l s t r n,則稱a s t 是a l r 的子串行。現在有q個詢問,每個詢問給...

BZOJ1008 HNOI2008 越獄 題解

監獄有連續編號為1.n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄 正難則反 反正我沒想到,定式思維想求發生越獄結果根本求不出來orz m n是總狀態數。不發生越獄時,第乙個人可以選m個宗教,往後所有...

題解 bzoj4825 HNOI2017單旋

h 國是乙個熱愛寫 的國家,那裡的人們很小去學校學習寫各種各樣的資料結構。伸展樹 splay 是一種資料結構,因為 好寫,功能多,效率高,掌握這種資料結構成為了 h 國的必修技能。有一天,的 卡 帶著他的 的 常數 來企圖毀滅 h 國。卡 給 h 國的人 說,splay 如果寫成單旋的,將會更快。卡...