顯然我們可以預處理出每乙個人在事件結束後跑步的圈數s_i
那麼答案可以表示為:∑i=
1n−1
∑j=i
+1n⌊
sj−s
i⌋\sum_^ \sum_^ \lfloor s_j-s_i\rfloor
i=1∑n−
1j=
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 下...