算法竞赛入门经典 LA 4329(树状数组)

本文深入解析了《算法竞赛入门经典-训练指南》中的一道关于能力值排序的问题,通过使用树状数组(Binary Indexed Tree)来高效计算满足条件的裁判数量。文章详细介绍了树状数组的实现和应用,包括如何进行前缀和查询和更新操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

  一排有着不同能力值的人比赛,规定裁判的序号只能在两人之间,而且技能值也只能在两人之间

问题

  

《算法竞赛入门经典-训练指南》的分析:


 

上代码

  

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 const int maxa = 100000+10;
 6 const int maxn = 20000+10;
 7 
 8 int a[maxn];
 9 int BIt[maxa];
10 int c[maxn];
11 int d[maxn];
12 int n;
13 long long ans;
14 int lowbit(int x)
15 {
16     return x&(-x);
17 }
18 int sum(int x)
19 {
20     int ret = 0;
21     while(x>0)
22     {
23         ret += BIt[x];
24         x -= lowbit(x);
25     }
26     return ret;
27 }
28 void update(int x)
29 {
30     while(x<=maxa-1)
31     {
32         ++BIt[x];
33         x += lowbit(x);
34     }
35 }
36 int main()
37 {
38     //ios::sync_with_stdio(false);
39     int t;
40     //cin>>t;
41     scanf("%d",&t);
42     while(t--)
43     {
44         ans = 0;
45         memset(BIt,0,sizeof(BIt));
46         memset(c,0,sizeof(c));
47         cin>>n;
48         for(int i=1;i<=n;i++)
49         {
50             //cin>>a[i];
51             scanf("%d",&a[i]);
52         }
53         for(int i=1;i<=n-1;i++)
54         {
55             c[i]=sum(a[i]-1);
56             update(a[i]);
57         }
58         memset(BIt,0,sizeof(BIt));
59         memset(d,0,sizeof(d));
60         for(int i=n;i>=2;i--)
61         {
62             d[i]=sum(a[i]-1);
63             update(a[i]);
64         }
65         for(int i=2;i<=n-1;i++)
66             ans +=c[i]*(n-i-d[i])+(i-c[i]-1)*d[i];
67         cout<<ans<<endl;
68 
69     }
70     return 0;
71 }

 ps:

  初学ing,写的不好。纯属自用

转载于:https://www.cnblogs.com/Crossea/p/11295661.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值