CF1042D Petya and Array 题解

比较典的一个题。

经验题:P2717 P5459

题意:给定 {an},t,求 l=1nr=ln[i=lrai<t]

思路

sx=i=1xai,则原式等于 l=1nr=ln[srsl1<t]

考虑枚举 r,统计 l1<rsl1>srtl1 的个数。

发现是个二维偏序,用权值树状数组维护之,复杂度 O(nlogn)

代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define F(x) v[m++] = x
#define H(x) lower_bound(v, v + m, x) - v + 1
using namespace std;
inline long long R()
{
    long long r = 0;bool b = 0;char c = getchar();
    while(!isdigit(c)) b = c == '-', c = getchar();
    while(isdigit(c)) r = r * 10 + c - '0', c = getchar();
    return b ? -r : r;
}
int n, m = 1, c[400050];long long t, q, a[200050], v[400050];
void C(int x) {for(;x <= m;x += x & -x) ++c[x];}
int Q(int x)
{
    int q = 0, y = m;for(--x;y > x;y &= y - 1) q += c[y];
    for(;x > y;x &= x - 1) q -= c[x];return q;
}
int main()
{
    n = R();t = R();for(int i = 1;i <= n;++i)
    F(a[i] = a[i - 1] + R()), F(a[i] - t + 1);
    sort(v, v + m);m = unique(v, v + m) - v;C(H(0));
    for(int i = 1;i <= n;++i) q += Q(H(a[i] - t + 1)), C(H(a[i]));
    return printf("%lld", q), 0;
}
posted @   Jijidawang  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示