給定長度為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 如果寫成單旋的,將會更快。卡...