很不错的一道题

给你一个长度为n的数组,问共有多少个区间满足区间之和小于给定的数t

这种题一般做法肯定是枚举,固定左端点枚举右端点,枚举的过程需要优化,否则就是n方

这道题我先求一个前缀和,然后逆着枚举,显然问题转化为了对于一个数,如果寻找他右边的数哪些小于它+t,这就转化为了区间求和,可以树状数组或者线段树,但是数的范围太大,因此需要用离散化

这道题的还有一个问题是定位,有一个很简单的定位方法就是把每一个前缀和+t也放进去,这样去定位就很简单了

另外就是使用upper_bound不过找的数要减一

具体做法看代码

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define pf printf
#define int long long
#define IO ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
const int maxn=+;
int sum[maxn],a[maxn],up;
vector<int> v;
int n,t;
inline int lowbit(int x){return x&-x;}
void add(int x,int d)
{
while(x<=up){
sum[x]+=d;x+=lowbit(x);
}
}
int Sum(int x)
{
int ret=;
while(x>){
ret+=sum[x];
x-=lowbit(x);
}
return ret;
}
main()
{
IO;
int ans=;
cin>>n>>t;
for(int i=;i<=n;i++){
cin>>a[i];
a[i]+=a[i-];
v.push_back(a[i]);
if(a[i]<t) ans++;
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
up=v.size();
for(int i=n;i;i--){
ans+=Sum(upper_bound(v.begin(),v.end(),a[i]+t-)-v.begin());
add(lower_bound(v.begin(),v.end(),a[i])-v.begin()+,);
}
cout<<ans<<endl;
}

Petya and Array CodeForces - 1042D的更多相关文章

  1. Petya and Array CodeForces - 1042D (树状数组)

    D. Petya and Array time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. codeforces 1042d//Petya and Array// Codeforces Round #510 (Div. 2)

    题意:给出一个数组,求其中和小于t的区间数. 先计算前缀和数组sum[i].对当前的sum[i],查询树状数组中有几个比(sum[i]-t)大的数,那么用sum[i]减它就是一个合法区间.再将当前的s ...

  3. Codeforces Round #510 (Div. 2) D. Petya and Array(树状数组)

    D. Petya and Array 题目链接:https://codeforces.com/contest/1042/problem/D 题意: 给出n个数,问一共有多少个区间,满足区间和小于t. ...

  4. Petya and Array (权值线段树+逆序对)

    Petya and Array http://codeforces.com/problemset/problem/1042/D time limit per test 2 seconds memory ...

  5. 1042.D Petya and Array 前缀 + 树状数组

    11.19.2018 1042.D Petya and ArrayNew Point: 前缀 + 树状数组 :树状数组逐个维护前缀个数 Describe: 给你一个数组,一个标记数,问你有多少区间[l ...

  6. [CodeForces]1042D

    大意:求一个序列有几个子序列的和小于给定值,里面的数有正有负,序列长度≤200000. 列个式子,其实求的是sum[r]-sum[l-1]<T sum[r]-T<sum[l-1] 所以我们 ...

  7. Greg and Array CodeForces 296C 差分数组

    Greg and Array CodeForces 296C 差分数组 题意 是说有n个数,m种操作,这m种操作就是让一段区间内的数增加或则减少,然后有k种控制,这k种控制是说让m种操作中的一段区域内 ...

  8. E - Petya and Exam CodeForces - 832B 字典树+搜索

    E - Petya and Exam CodeForces - 832B 这个题目其实可以不用字典树写,但是因为之前写过poj的一个题目,意思和这个差不多,所以就用字典树写了一遍. 代码还是很好理解的 ...

  9. 【Codeforces 1042D】Petya and Array

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 把a[i]处理成前缀和 离散化. 枚举i从1..n假设a[i]是区间和的a[r] 显然我们需要找到a[r]-a[l]<t的l的个数 即a ...

随机推荐

  1. O准备如何苟进复赛圈?华为软挑开挂指南(附赛题预测)

    事先声明,这不是华为软挑的软广,我也不是海军. 这篇文章纯粹是心血来潮,原因是去年上传到github的参赛代码,前几天又有两个人star和fork了. 记得star热潮还是去年4月复赛刚结束的那几天, ...

  2. apache工具

    组件 功能介绍HttpClient 提供HTTP客户端与服务器的各种通讯操作. 现在已改成HttpComponentsIO io工具的封装.Lang3 Java基本对象方法的工具类包 如:String ...

  3. aliyun---ossutil

    上传文件: ossutil -c config cp -rf 源文件 oss://目标路径 config为存储key的文件 例子: ossutil -c config cp -rf /data/res ...

  4. 同步锁——ReentrantLock

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 Lock接口简介 在JUC包下面有一个java.util ...

  5. 响应式Web设计:构建令人赞叹的Web应用程序的秘诀

    骨架屏(Skeleton Screen) 参考博客:https://medium.com/@owencm/reactive-web-design-the-secret-to-building-web- ...

  6. GNU make doc - 6.6 追加变量值

    有时我们需要对已经定义过的变量进行追加,可以使用+=进行这一操作,就像下面这样 objects += another.o 该语句取objects变量的值,并在其后追加another.o(结果会在原变量 ...

  7. 与WinRT组件进行操作

    1,原理: WinRT是一个新的类库,应用程序可以用它访问操作系统的功能. 在内部,WinRT以组件的形式实现.COM Component Object Model- WinRT使用.net元数据来描 ...

  8. Spark之RDD本质

    1.在一个完整的数据转换流程里往往涉及到多个具有衍生关系RDD,这些RDD其实是通过逻辑串联来利用装饰器模式层层包装扩展的的一堆对象,这些相邻RDD间必须有继承关系.并且比Java中的装饰器来的更彻底 ...

  9. MS14-068提权和impacket工具包提权

    ms14-068提权 工具利用 a)拿下边界机win7,并已经有win7上任意一个账号的密码 -u 用户名@域 -p 用户密码 -s 用户sid -d 域控 ms14-068.exe -u test3 ...

  10. Android Gradle报错 (Error:No such property: GradleVersion for class: JetGradlePlugin) 的原因与解决

    Error:No such property: GradleVersion for class: JetGradlePlugin 错误原因:IDE 版本(GradlePlugin)和 Gradle 版 ...