2023河南萌新联赛第(六)场:河南理工大学 L - 阴晴不定的大橘学长

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 1n2105,109ai109,109x109

输出描述:

输出一个整数,代表可以抚摸的时间段的数量。

示例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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wa_Automata

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值