POJ 3067-Japan-树状数组

把桥按照左边点坐标排序,左边相同按照右边。

然后依次插入树状数组,getsum就是在这个桥之前的桥,也就是这个桥产生的交点。

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <vector>
 5 
 6 using namespace std;
 7 
 8 const int maxn = 2e3+100;
 9 int N,M,K,T;
10 
11 struct line{
12     int l,r;
13     line(int _l=0,int _r=0) :l(_l),r(_r){}
14 
15     bool operator < (const line &b) const
16     {
17         if(l == b.l) return r < b.r;
18         else return l < b.l;
19     }
20 };
21 
22 vector <line> highway;
23 int c[maxn];
24 
25 int lowbit(int x)
26 {
27     return x&(-x);
28 }
29 
30 void update(int x)
31 {
32     while(x <= M)
33     {
34         c[x] += 1;
35         x += lowbit(x);
36     }
37 }
38 
39 long long getsum(int x)
40 {
41     long long sum = 0;
42     while(x >= 1)
43     {
44         sum += c[x];
45         x -= lowbit(x);
46     }
47     return sum;
48 }
49 
50 int main()
51 {
52     scanf("%d",&T);
53     int cas = 0;
54     while(T--)
55     {
56         scanf("%d%d%d",&N,&M,&K);
57         highway.clear();
58         memset(c,0,sizeof c);
59         for(int i=0,l,r;i<K;i++)
60         {
61             scanf("%d%d",&l,&r);
62             highway.push_back(line(l,r));
63         }
64         sort(highway.begin(),highway.end());
65 
66         long long res = 0;
67         for(int i=0;i<highway.size();i++)
68         {
69             update(highway[i].r);
70             res += i - getsum(highway[i].r) + 1;
71         }
72 
73         printf("Test case %d: %lld\n",++cas,res);
74     }
75 }

 

转载于:https://www.cnblogs.com/helica/p/5281503.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值