我早已習慣你不在身邊,
人間四月天 寂寞斷了弦。
回望身後藍天,跟再見說再見……
某天,蒟蒻autumn發現了從 gty的妹子樹(bzoj3720) 上掉落下來了許多妹子,他發現她們排成了乙個序列,每個妹子有乙個美麗度。
bakser神犇與他打算研究一下這個妹子序列,於是bakser神犇問道:"你知道區間[l,r]中妹子們美麗度的逆序對數嗎?"
請你幫助一下autumn吧。
第一行包括乙個整數n(1<=n<=50000),表示數列a中的元素數。
第二行包括n個整數a1...an(ai>0,保證ai在int內)。
接下來一行包括乙個整數m(1<=m<=50000),表示詢問的個數。
接下來m行,每行包括2個整數l、r(1<=l<=r<=n),表示詢問al...ar中的逆序對數(若ai>aj且il,r要分別異或上一次詢問的答案(lastans),最開始時lastans=0。
保證涉及的所有數在int內。
對每個詢問,單獨輸出一行,表示al...ar中的逆序對數。
41 4 2 3
12 4
2正解:分塊+樹狀陣列+主席樹。
想$o(n\sqrt)$的做法,想不出來。。然後看了一眼題解的複雜度。。
$o(n\sqrtlogn)$,這不是$mato$的檔案管理那題的複雜度嗎。。
然後就不是很難做了。
首先,我們將序列分塊以後可以預處理出$f[j][i]$,表示第$j$個點到第$i$個塊右端點這段區間的逆序對數。這個用樹狀陣列統計,複雜度是$o(n\sqrtlogn)$的。
然後,我們再把每個數弄到主席樹上(等下會用到的)。
詢問的時候,如果$l$和$r$在同乙個塊上,我們直接用樹狀陣列暴力統計這個區間的逆序對。
如果$l$和$r$不在同乙個塊上,我們就把區間分開,$l$和$r$的前乙個塊的右端點分成乙個區間,加上對應的$f$值。
然後我們再暴力統計$r$這個塊上屬於這個區間的點與前面區間的逆序對數。那麼我們要統計的就是$l-1$到$i-1$中大於$a[i]$的數的個數,這個就是用剛剛建好的主席樹搞就行了。
於是這道題我們就完美地解決了。
1//it is made by wfj_2048~
2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include
14#define inf (1<<30)
15#define n (50010)
16#define il inline
17#define rg register
18#define ll long long
19#define lb(x) (x & -x)
20#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
2122
using
namespace
std;
2324
int sum[20*n],ls[20*n],rs[20*n],rt[n],sz;
25int f[n][230
],c[n],a[n],hsh[n],n,m,tot;
26int
ll[n],rr[n],bl[n],totb,block;
27ll ans;
2829 il int
gi()
3637 il void add(rg int x,rg int v)
3839 il int query(rg int x)
4041 il void insert(rg int x,rg int &y,rg int l,rg int r,rg int
v)46
47 il int querynxt(rg int x,rg int y,rg int l,rg int r,rg int
v)52
53 il void
work()
59 sort(hsh+1,hsh+tot+1),tot=unique(hsh+1,hsh+tot+1)-hsh-1;60
for (rg int i=1;i<=n;++i)
64for (rg int i=1;i<=totb;++i)
69 m=gi(); rg int
l,r;
70while (m--) else
81 printf("
%lld\n
",ans);82}
83return;84
}8586int
main()
bzoj3744 Gty的妹子序列
time limit 20 sec memory limit 128 mb submit 967 solved 293 submit status discuss 我早已習慣你不在身邊,人間四月天 寂寞斷了弦。回望身後藍天,跟再見說再見 某天,蒟蒻autumn發現了從 gty的妹子樹 bzoj372...
BZOJ 3744 Gty的妹子序列
第一行包括乙個整數n 1 n 50000 表示數列a中的元素數。第二行包括n個整數a1 an ai 0,保證ai在int內 接下來一行包括乙個整數m 1 m 50000 表示詢問的個數。接下來m行,每行包括2個整數l r 1 l r n 表示詢問al ar中的逆序 對數 若ai aj且i 對每個詢問...
BZOJ3744 GTY的妹子序列
第一行包括乙個整數n 1 n 50000 表示數列a中的元素數。第二行包括n個整數a1.an ai 0,保證ai在int內 接下來一行包括乙個整數m 1 m 50000 表示詢問的個數。接下來m行,每行包括2個整數l r 1 l r n 表示詢問al.ar中的逆序 對數 若ai aj且i對每個詢問,...