赞
踩
为前缀和
-
-
- import java.io.*;
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.Scanner;
-
-
-
- public class Main{
- static
- class BIT{
- int size;
- long[] tr;
- public BIT(int n) {
- size=n;
- tr=new long[n+1];
- }
- public int lowbit(int x) {
- return x&(-x);
- }
- public void update(int x) {
- for(int i=x;i<=size;i+=lowbit(i)) {
- tr[i]++;
- }
- }
- public long query(int x) {//区间组合最多1e10,int会爆
- long ans=0;
- for(int i=x;i>0;i-=lowbit(i)) {
- ans+=tr[i];
- }
- return ans;
- }
- }
- public static void main(String[] args) throws IOException{
- Scanner input=new Scanner(System.in);
- int n=input.nextInt();
- long k=input.nextLong();
- long ans=0;
- long[] Sum=new long[n];//用于离散化的前缀和
- long[] pre=new long[n];//保留原本的前缀和
- Sum[0]=input.nextLong();
- if(Sum[0]>=k)ans++;
- pre[0]=Sum[0];
- for(int i=1;i<n;++i) {
- Sum[i]=input.nextLong();
- Sum[i]+=Sum[i-1];
- if(Sum[i]>=k)ans++;
- pre[i]=Sum[i];
- }
- Arrays.sort(Sum);
- HashMap<Long,Integer> hs=new HashMap<Long, Integer>();
- int cnt=0;
- long[] Qu=new long[n+1];//离散后数轴每位对应的前缀和
- for(int i=0;i<n;++i) {
- if(hs.get(Sum[i])==null) {
- cnt++;
- hs.put(Sum[i], cnt);
- Qu[cnt]=Sum[i];
- }
- }
- //排序后位置不同,可能在后面的前缀和被移到前面或在前面的前缀和被移到后面
-
- BIT Tr=new BIT(cnt);
- Tr.update(hs.get(pre[0]));
- for(int i=1;i<n;++i) {
- long y=pre[i]-k;
- int l=1,r=cnt,id=-1;//二分查找
- while(l<=r) {
- int mid=(l+r)>>1;
- if(Qu[mid]<=y) {
- id=mid;
- l=mid+1;
- }
- else r=mid-1;
- }
- if(id!=-1)ans+=Tr.query(hs.get(Qu[id]));
- Tr.update(hs.get(pre[i]));
- }
- System.out.println(ans);
- }
-
- }
-

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。