51NOD 1672 区间交

题目链接:

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1672

题解:

这里的数据的范围给的是1e5,所以,对于找到区间以后,一遍的循环是不会超时的。这里的难点主要是怎么找到满足条件的区间。我们可以这么去思考,先将区间的一个端点固定,去找另一个满足条件的最大的端点(因为这里的ai已经保证全部都是大于0的, 没有负数,所以,一定是找范围大的)。自己是参考了网上大神的代码,用了mulitset来进行一个区间的维护,感觉写的很妙。

代码:

#include <set>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
typedef long long ll;
const int maxn = 100000+10;
struct node
{
    int left,right;
}s[maxn];
int num[maxn];
ll sum[maxn];

int cmp(node a,node b)
{
    if(a.left!=b.left)
        return a.left<b.left;
    return a.right<b.right;
}

multiset<int> seg;//跟set差不多,但是这个是可以重复的。
multiset<int >::iterator iter;

int n,k,m;
int main()
{
    seg.clear();
    scanf("%d%d%d",&n,&k,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&num[i]);
    for(int i=0;i<m;i++)
        scanf("%d%d",&s[i].left,&s[i].right);
    sum[0]=0;
    for(int i=1;i<=n;i++)
        sum[i]=sum[i-1]+num[i];//对于结果进行预处理。
    sort(s,s+m,cmp);
    for(int i=0;i<k;i++)
        seg.insert(s[i].right);
    iter=seg.begin();//在满足条件下的初始的,最小的区间
    //int ans=0;
    ll ans=0;
    ans=max((ll)0,sum[*iter]-sum[s[k-1].left-1]);
    for(int i=k;i<m;i++)
    {
        seg.insert(s[i].right);
        if(s[i].right>=*iter)
            iter++;
        ans=max(ans,sum[*iter]-sum[s[i].left-1]);
    }
    printf("%lld\n",ans);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值