2023河南萌新联赛第(六)场:河南理工大学 L - 阴晴不定的大橘学长
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
在通往院楼的道路上,大橘学长总会对小W行注目礼,而小W也会上前摸一摸大橘学长给今天带来 a c ac ac的好运。虽然大橘学长是一只猫,但是大橘学长也会有心情不好的时候。
现在给你一个大橘学长心情的临界值 x x x,并给你 n n n个时刻,第 i i i个时刻的心情值是 a [ i ] a[i] a[i],对于任意的 [ l , r ] [l,r] [l,r]时间段内如果 ( ∑ i = l r a [ i ] ) ≥ x (\sum_{i=l}^{r}a[i] ) \geq x (∑i=lra[i])≥x,说明在这个时间段内是可以抚摸大橘学长的,如果在大橘学长心情不好的时候抚摸它,会招致 w a wa wa的坏运气以及学长愤怒的利爪,
现在请聪明的你来编写程序求解从 1 1 1到 n n n时刻内有多少时间段可以抚摸大橘学长。
注意:只要时间段 [ l , r ] [l,r] [l,r]中 l l l与 r r r有一个不同,便可认定为不同时间段。
下图为 心情不好的大橘学长
在这里插入图片描述
输入描述:
第一行输入两个整数
n
n
n,
x
x
x,
n
n
n代表有
n
n
n个时刻,
x
x
x代表学长心情的临界值。
第二行输入
n
n
n个整数,
a
1
,
a
2
,
a
3
⋯
,
a
n
a_1,a_2,a_3\cdots,a_n
a1,a2,a3⋯,an,其中
a
i
a_i
ai代表第
i
i
i时刻大橘学长的心情值。
对于
100
100
100%的数据,
1
≤
n
≤
2
∗
1
0
5
,
−
1
0
9
≤
a
i
≤
1
0
9
,
−
1
0
9
≤
x
≤
1
0
9
1\leq n\leq 2*10^5,-10^9\leq a_i\leq10^9,-10^9\leq x\leq10^9
1≤n≤2∗105,−109≤ai≤109,−109≤x≤109
输出描述:
输出一个整数,代表可以抚摸的时间段的数量。
示例1
输入
5 3
-1 3 -2 1 4
输出
6
说明
(1,5),(2,2),(2,5),(3,5),(4,5),(5,5)是满足条件的6个时间段。
示例2
输入
5 3
1 3 2 4 3
输出
13
import java.io.*;
import java.util.ArrayList;
import java.util.TreeSet;
public class Main {
static int N = 1000010;
static long[] tr = new long[N];
public static int lowbit(int x) {
return x & -x;
}
public static void add(int x) {
for (int i = x; i < N - 10; i += lowbit(i)) {
tr[i]++;
}
}
public static long query(int x) {
long res = 0;
for (int i = x; i > 0; i -= lowbit(i)) {
res += tr[i];
}
return res;
}
public static int find(long x, ArrayList<Long> number) {
int l = 0, r = number.size() - 1;
while (l < r) {
int mid = l + r >> 1;
if (number.get(mid) >= x) r = mid;
else l = mid + 1;
}
return l + 1;
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] str = bf.readLine().split(" ");
int n = Integer.parseInt(str[0]);
int x = Integer.parseInt(str[1]);
str = bf.readLine().split(" ");
int[] a = new int[n + 1];
long[] s = new long[n + 1];
for (int i = 1; i <= n; i++) {
a[i] = Integer.parseInt(str[i - 1]);
s[i] = s[i - 1] + a[i];
}
TreeSet<Long> treeSet = new TreeSet<>();
for (int i = 0; i <= n; i++) {
treeSet.add(s[i]);
treeSet.add(s[i] - x);
}
ArrayList<Long> number = new ArrayList<>(treeSet);
long res = 0;
add(find(0L, number));
for (int i = 1; i <= n; i++) {
res += query(find(s[i] - x, number));
add(find(s[i], number));
}
bw.write(res + "\n");
bw.close();
}
}