cf1042d 树状数组逆序对+离散化
Posted zsben991126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf1042d 树状数组逆序对+离散化相关的知识,希望对你有一定的参考价值。
/* 给定一个数组,要求和小于t的段落总数 求前缀和 dp[i]表示以第i个数为结尾的小于t的段落总数,sum[i]-sum[l]<t; sum[i]-t<sum[l],所以只要找到满足条件的sum[l]数量即可 将sum排序,每次找到sum[i]-t的排名,大于它的就是l的数量 */ #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 200005 ll tmp[maxn],n,a[maxn],t,sum[maxn],ans; ll bits[maxn]; void add(int x,int val){ for(int i=x;i<=n+1;i+=i&-i) bits[i]++; } ll query(int x){ ll ans = 0; for(int i=x;i>0;i-=i&-i) ans += bits[i]; return ans; } int main(){ cin>>n>>t; memset(bits,0,sizeof bits); for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i]; for(int i=1;i<=n;i++)tmp[i]=sum[i]; sort(tmp,tmp+1+n);//带着0排序 //add(0,1); for(int i=1;i<=n;i++){ int pos=lower_bound(tmp,tmp+n+1,sum[i-1])-tmp+1; add(pos,1); pos=upper_bound(tmp,tmp+n+1,sum[i]-t)-tmp; ans+=i-query(pos); } printf("%lld ",ans); }
以上是关于cf1042d 树状数组逆序对+离散化的主要内容,如果未能解决你的问题,请参考以下文章
Poj 2299 - Ultra-QuickSort 离散化,树状数组,逆序对
CCPC河南省赛B-树上逆序对| 离线处理|树状数组 + 线段树维护逆序对 + dfs序 + 离散化
Codeforces Round #301 (Div. 2) E. Infinite Inversions —— 逆序对 离散化 + 树状数组