樹狀陣列 繞圈跑

2021-09-25 04:05:37 字數 1872 閱讀 1401

顯然我們可以預處理出每乙個人在事件結束後跑步的圈數s_i

那麼答案可以表示為:∑i=

1n−1

∑j=i

+1n⌊

sj−s

i⌋\sum_^ \sum_^ \lfloor s_j-s_i\rfloor

i=1∑n−

1​j=

i+1∑

n​⌊s

j​−s

i​⌋我們來思考一下⌊s1

−s2⌋

\lfloor s_1-s_2\rfloor

⌊s1​−s

2​⌋和⌊s1

⌋−⌊s

2⌋\lfloor s_1\rfloor-\lfloor s_2\rfloor

⌊s1​⌋−

⌊s2​

⌋的區別。

顯然,如果s

1s_1

s1​的小數部分大於s

2s_2

s2​的小數部分,那麼答案沒有影響。反之,答案便會差乙個111.

因此,對於i

i>

\>\

>

來說,答案就會差了1

11.此時,這個減去的個數就是小數部分的逆序對個數。

這個怎麼求呢?我們只需要對小數離散化就可以。

**如下:

#include
#define int long long

using

namespace std;

const

int n =

200000

;int n, l, c, ans =

0, cnt =0;

int a[n]

;double b[n]

;struct node

} t[n]

;map<

double

,int

>mp;

inline

intread

(void

)while

(c>=

'0'&& c<=

'9') s = s*

10+c-

48,c =

getchar()

;return s*w;

}struct tree

;#define lowbit(i) (i & -i)

void

add(

int x,

int v)

intask

(int x)

} tree;

void

read_init

(void

)bool

cmp(node p1,node p2)

void

work_lisan

(void

)sort

(t+1

,t+n+

1,cmp)

;return;}

void

get_answer

(void

)for

(int i=n;i;

--i)

ans -

= tree.

ask(t[i]

.num-1)

, tree.

add(t[i]

.num,1)

;printf

("%lld\n"

, ans)

;return;}

signed

main

(void

)

NOIP2012模擬8 6 繞圈跑

這題考場剛了很久,最後沒想到正解,只好打了個n2暴力。後來發現正解很容易理解,就開打了。1h。2h。3h。精度問題坑了我很久 沒想到的是 好了,一改,就切了。o o 上標 include include define n 100010 define db long double define ll ...

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...

樹狀陣列 瞎bb 樹狀陣列

樹狀陣列是乙個利用一維陣列和位運算組成的求解區間問題的高效資料結構,其構造如圖所示 首先,我們要用它解決單點修改 區間查詢的操作。根據這張圖我們建立乙個陣列bit,下標就是圖中顯示的十進位制數。bit i 就表示了圖中所示的一段區間的和,例如bit 6 sum 5,6 bit 4 sum 1,4 下...