CF961E Tufurama

思路:

从前往后遍历i,对于每个i,使用树状数组统计episode数大于等于i的season数,本次统计结束之后,把长度为i的season从树状数组中删掉,避免影响下次统计。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN = 200005;
 4 int bit[MAXN], a[MAXN], n;
 5 vector<int> v[MAXN];
 6 int lowbit(int x) { return x & -x; }
 7 void add(int i, int x)
 8 {
 9     while (i <= n) { bit[i] += x; i += lowbit(i); }
10 }
11 int sum(int i)
12 {
13     int ans = 0;
14     while (i) { ans += bit[i]; i -= lowbit(i); }
15     return ans;
16 }
17 int main()
18 {
19     while (cin >> n)
20     {
21         memset(bit, 0, sizeof bit);
22         for (int i = 1; i < MAXN; i++) v[i].clear();
23         for (int i = 1; i <= n; i++) 
24         { 
25             cin >> a[i];
26             add(i, 1);
27             if (a[i] < MAXN) v[a[i]].push_back(i);
28         }
29         long long ans = 0;
30         for (int i = 1; i <= n; i++)
31         {
32             int tmp = sum(min(a[i], n)) - sum(i);
33             if (tmp > 0) ans += tmp;
34             for (int j = 0; j < v[i].size(); j++) add(v[i][j], -1);
35         }
36         cout << ans << endl;
37     }
38     return 0;
39 }

 

转载于:https://www.cnblogs.com/wangyiming/p/8733129.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值