CF-1119 D. Frets On Fire(排序,二分)

题目链接
题意:给定n个数。k次查询, 给定一个区间 [li, ri], 对n个数分别从li 加到 ri ,统计过程中出现的不同数的个数。
思路:对于区间 [li, ri] 以及 a[i] 和 a[i-1] , 如果a[i]-a[i-1] > ri - li + 1 那么这里就会有 ri - li + 1 个不同的数。
由此,应当先将数组排序。然后就这样统计累加答案。
提交, 超时。
优化:排序后,相邻两个数之间的差大于区间长度,ans += 区间长度, 否则就 += 相邻两数之差。所以可以将两数之差保存,并排序,这样的话,每次查询的时候,就可以直接二分区间长度,对于前面的就直接将差相加(可以弄个前缀和数组),后面的就是 剩余个数*区间长度。

#include <bits/stdc++.h>
const int maxn = 100005;
using namespace std;
typedef long long ll;
ll s[maxn], cha[maxn], pre[maxn];

int main()
{
    int n, m = 0;
    scanf("%d", &n);
    for(int i=0; i<n; i++)
        cin>>s[i];
    sort(s, s+n);
    for(int i=1; i<n; i++)
        if(s[i] > s[i-1])
            cha[m++] = s[i] - s[i-1];
    sort(cha, cha+m);
    pre[0] = cha[0];
    for(int i=1; i<m; i++)
        pre[i] = pre[i-1] + cha[i];
    int k;
    scanf("%d", &k);
    while(k--){
        ll l, r, len;
        cin>>l>>r;
        len = r - l +1;
        int t = upper_bound(cha, cha+m, len) - cha;
        ll ans = pre[t-1] + len * (m-t+1);
        cout<<ans<<endl;
    }
    return 0;
}

springboot052基于Springboot+Vue旅游管理系统毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值