QDU排位賽 於老師發生什麼事了 字典樹

2021-10-10 18:07:32 字數 2524 閱讀 5380

給定乙個正整數序列a,試求這個序列的逆序對的個數。所謂逆序對,即為序列a中的兩個不同的元素

i​​,

a​j​

​>

i​​,

a​j​

​>

組成的數對。 其滿足:i

i<

j和 a​i

​​

>a​

ja ​_ ​​ >a ​_

a​i​​​

>a​

j​​​ 。

例如序列。它有

3​​,

a​4​

​>

3​​,

a​4​

​>

,

3​​,

a​5​

​>

3​​,

a​5​

​>

,

4​​,

a​5​

​>

4​​,

a​5​

​>

三個逆序對。

輸入格式比較特殊!!

第一行為乙個正整數n(n≤1

05

n≤10^

n≤10

5)。表示序列中元素的個數。

接下來n行,每一行是乙個以二進位制輸入正整數。保證每個正整數a​i

​​≤2

​150

a ​_i ​​ ≤2 ​^

a​i​​​

≤2​1

50​​ 。

乙個正整數表示該序列的逆序對數。

2

110101

511

101100

11

資料水了,套個lgn也可以過。

解法1:樹狀陣列求逆序對o(l

og(n

)∑le

n)

o(log(n)\sum)

o(log(

n)∑l

en)

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

1e5+

100;

string a[n]

;int d[n]

;vectorv;

int n;

intlowbit

(int x)

void

add(

int x,

int a)

}ll ask

(int x)

return res;

}int

find

(string s)

intmain()

sort

(v.begin()

,v.end()

);v.erase

(unique

(v.begin()

,v.end()

),v.

end())

;for

(int i=n;i>=

1;i--

)printf

("%lld\n"

, ans)

;return0;

}

解法二:字典樹 o(∑

len)

o(\sum)

o(∑len

) 假設要求s=101011101前面的大於s的數x的個數,肯定是與s對等位上s[i]=0&&x[i]=1的個數之和。

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n =

1.5e7+10

;struct node

}trie[n][2

];char s[

200]

, t[

200]

;int n;

ll ans,tot=1;

intmain()

int p =1;

for(

int k =

0; k <

150; k++

) trie[p]

[ch]

.data++

; p = trie[p]

[ch]

.id;

if(p ==0)

break;}

}printf

("%lld\n"

, ans)

;return0;

}

排位賽題解

十進位制轉二進位制,右移 與 運算結合,遍歷每個數字在二進位制下點每一位。include intmain for int i 0 i 4 i for int i 0 i 4 i a i 1 右移除2 printf d d d d n num 0 num 1 num 2 num 3 return0 題...

排位賽一 E Milk Visits

farmer john 計畫建造 n 個農場,用 n 1 條道路連線,構成一棵樹 也就是說,所有農場之間都互相可以到達,並且沒有環 每個農場有一頭奶牛,品種為更賽牛或荷斯坦牛之一。farmer john 的 m 個朋友經常前來拜訪他。在朋友 i 拜訪之時,farmer john 會與他的朋友沿著從農...

排位賽二G Bucket Brigade

給定乙個10x10的地圖,b是倉庫,l是湖泊,是路,r是石頭 石頭不能走 現在倉庫著火了,母牛哥要去救火了,求倉庫到湖泊的最小步數 倉庫和湖泊不算入步數 bfs模板題。include include include include include include using namespace st...