博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Petya and Array (权值线段树+逆序对)
阅读量:5283 次
发布时间:2019-06-14

本文共 3116 字,大约阅读时间需要 10 分钟。

Petya and Array 

time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Petya has an array aa consisting of nn integers. He has learned partial sums recently, and now he can calculate the sum of elements on any segment of the array really fast. The segment is a non-empty sequence of elements standing one next to another in the array.

Now he wonders what is the number of segments in his array with the sum less than tt. Help Petya to calculate this number.

More formally, you are required to calculate the number of pairs l,rl,r (lrl≤r) such that al+al+1++ar1+ar<tal+al+1+⋯+ar−1+ar<t.

Input

The first line contains two integers nn and tt (1n200000,|t|210141≤n≤200000,|t|≤2⋅1014).

The second line contains a sequence of integers a1,a2,,ana1,a2,…,an (|ai|109|ai|≤109) — the description of Petya's array. Note that there might be negative, zero and positive elements.

Output

Print the number of segments in Petya's array with the sum of elements less than tt.

Examples
input
5 4 5 -1 3 4 -1
output
5
input
3 0 -1 2 -3
output
4
input
4 -1 -2 1 -2 3
output
3
Note

In the first example the following segments have sum less than 44:

  • [2,2][2,2], sum of elements is 1−1
  • [2,3][2,3], sum of elements is 22
  • [3,3][3,3], sum of elements is 33
  • [4,5][4,5], sum of elements is 33
  • [5,5][5,5], sum of elements is 1

  参考博客 

  找区间和小于t的个数,区间和的问题,一般用前缀和来做

  可以看成sum[i]>t+sum[k]的个数,i<k<=n。这样就变成了一个逆序对的问题

  

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #define maxn 500005 10 #define lson l,mid,rt<<1 11 #define rson mid+1,r,rt<<1|1 12 typedef long long ll; 13 using namespace std; 14 15 vector
v; 16 ll n; 17 ll a[maxn]; 18 ll sum[maxn]; 19 20 int tree[maxn<<3]; 21 22 int getid(ll x){ 23 return lower_bound(v.begin(),v.end(),x)-v.begin()+1; 24 } 25 26 void pushup(int rt){ 27 tree[rt]=tree[rt<<1]+tree[rt<<1|1]; 28 } 29 30 void build(int l,int r,int rt){ 31 if(l==r){ 32 tree[rt]=0; 33 return; 34 } 35 int mid=(l+r)/2; 36 build(lson); 37 build(rson); 38 pushup(rt); 39 } 40 41 void add(int L,int k,int l,int r,int rt){ 42 if(l==r){ 43 tree[rt]+=k; 44 return; 45 } 46 int mid=(l+r)/2; 47 if(L<=mid) add(L,k,lson); 48 else add(L,k,rson); 49 pushup(rt); 50 } 51 52 ll query(int L,int R,int l,int r,int rt){ 53 if(L<=l&&R>=r){ 54 return tree[rt]; 55 } 56 int mid=(l+r)/2; 57 ll ans=0; 58 if(L<=mid) ans+=query(L,R,lson); 59 if(R>mid) ans+=query(L,R,rson); 60 return ans; 61 } 62 63 64 int main(){ 65 66 std::ios::sync_with_stdio(false); 67 ll t; 68 cin>>n>>t; 69 for(int i=1;i<=n;i++){ 70 cin>>a[i]; 71 } 72 v.push_back(t-1); 73 for(int i=1;i<=n;i++){ 74 sum[i]=a[i]+sum[i-1]; 75 v.push_back(sum[i]); 76 v.push_back(sum[i]+t-1); 77 } 78 if(n==1){ 79 if(a[1]
=1;i--){ 94 ans+=query(1,getid(sum[i]+t-1),1,Size,1); 95 add(getid(sum[i]),1,1,Size,1); 96 } 97 ans+=query(1,getid(t-1),1,Size,1); 98 99 cout<
<
View Code

 

  

转载于:https://www.cnblogs.com/Fighting-sh/p/9719751.html

你可能感兴趣的文章
qt 事件
查看>>
python 学习第二周总复习
查看>>
Ubuntu Tomcat
查看>>
11判断js中的数据类型的几种方法
查看>>
114JS原生:8行实现发电报效果
查看>>
linux命令行下xlsx转换成pdf或csv的笔记
查看>>
week1-绪论
查看>>
Linux root 用户下 selenium 运行chrome --no-sandbox的问题的解决
查看>>
Echo团队Alpha冲刺 - 测试随笔
查看>>
wordcount
查看>>
常用“Request.ServerVariables()”汇总
查看>>
Vue 还是 React 还是 Angular ?
查看>>
mysql 事务 存储过程 函数
查看>>
【MOSS】SPListItems操作
查看>>
转载 修改 Linux 内核 DM9000 支持 tiny210 开发板
查看>>
Sqoop2 环境搭建
查看>>
2018-2019-1 20165237 20165227 20165228 实验三 实时系统
查看>>
跳棋算法
查看>>
第三方库 jsoncpp 读写json
查看>>
使用git提交代码简单说明
查看>>