【CDOJ931】Car race game(树状数组求逆序)

题目连接:http://acm.uestc.edu.cn/#/problem/show/931

OJ评判系统有些坑,不支持__int64以及输出的%I64d大家注意。全开long long也会TLE,比较坑。逆序的基础操作题,不错。

 

 1 #include <bits/stdc++.h>

 2 #define MAX 100010

 3 using namespace std;

 4 

 5 int s[MAX * 10];

 6 

 7 struct Node {

 8     int x, v;

 9 } node[MAX];

10 

11 bool cmp (Node a, Node b) {

12     if (a.x == b.x) {

13         return a.v > b.v;

14     }

15     return a.x < b.x;

16 }

17 

18 int lowbit (int x) {

19     return x & (-x);

20 }

21 

22 int sum (int p) {

23     int ans = 0;

24     while (p) {

25         ans += s[p];

26         p -= lowbit(p);

27     }

28     return ans;

29 }

30 

31 void add (int p, int del) {

32     while (p <= 1000000) {

33         s[p] += del;

34         p += lowbit(p);

35     }

36 }

37 

38 int main () {

39     int n, i;

40     while (scanf("%d", &n) != EOF) {

41         long long ans = 0;

42         for (i = 0; i < n; ++ i) {

43             scanf("%d %d", &node[i].x, &node[i].v);

44         }

45         sort (node, node + n, cmp);

46         memset(s, 0, sizeof(s));

47         for (i = 0; i < n; ++ i) {

48             ans = ans + i - sum(node[i].v);

49             add(node[i].v, 1);

50         }

51         printf ("%lld\n", ans);

52     }

53     return 0;

54 }

 

你可能感兴趣的:(game)