区间交

原创 2016年06月01日 23:17:23

区间交

Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 652    Accepted Submission(s): 308



Problem Description
小A有一个含有n个非负整数的数列与m个区间。每个区间可以表示为li,ri

它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大。

例如样例中,选择[2,5][4,5]两个区间就可以啦。
 

Input
多组测试数据

第一行三个数n,k,m(1n100000,1km100000)

接下来一行n个数ai,表示lyk的数列(0ai109)

接下来m行,每行两个数li,ri,表示每个区间(1lirin)

 

Output
一行表示答案
 

Sample Input
5 2 3 1 2 3 4 6 4 5 2 5 1 4
 

Sample Output
10
 

题解:

         题目要求从m个区间中找出k个区间的交区间,且交区间的sum(a[l],a[r])的和最大. 我们可以考虑转换这个问题.变为求原序列的一段区间被多少个区间覆盖.

         假设当前找的是区间[L,R],那么很显然某个区间要包含这个[L,R],它的左右端点必须要L,R的两边. 知道这个,我们只需要处理那些左端点<=L的.然后再通过树状

         数组求出有多少个右端点>=R.然后对于原序列的区间,只需要尺取一下就行了.


AC代码:

#include <iostream>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N],c[N];

struct Interval
{
    int l,r;
    void read()
    {
        scanf("%d %d",&l,&r);
    }
    bool operator < (const Interval &a) const
    {
        return l < a.l;
    }
} interval[N];

void add(int x,int n)
{
    while(x <= n)
    {
        c[x]++;
        x += x & -x;
    }
}

int get(int x)
{
    int s = 0;
    x--;
    while(x > 0)
    {
        s += c[x];
        x -= x & -x;
    }
    return s;
}

void solve()
{
    int n,k,m;
    while(~scanf("%d %d %d",&n,&k,&m))
    {
        memset(c,0,sizeof c);
        for(int i = 1; i <= n; ++i) scanf("%d",&a[i]);
        for(int i = 1; i <= m; ++i) interval[i].read();
        sort(interval + 1,interval + m + 1);
        ll ans = 0,sum = 0;
        int l,pos;
        pos = l = 1;
        for(int r = 1; r <= n; ++r)
        {
            sum += a[r];
            while(l <= r)
            {
                while(pos <= m && interval[pos].l <= l)
                    add(interval[pos++].r,n);
                int num = pos - 1 - get(r);
                if(num >= k)
                {
                    ans = max(ans,sum);
                    break;
                }
                else
                {
                    sum -= a[l];
                    l++;
                }
            }
        }
        cout << ans << endl;
    }
}

int main()
{
    solve();
    return 0;
}


版权声明:追逐心中的梦想,永不放弃! By-xdlove

线段树 hdu5700 区间交

传送门:点击打开链接 题意:有n个区间,求k个区间,使得这k个区间相交的区间内数字之和最大。数列的数字均>=0 思路:通常这种题目我们都会先按照区间的右区间位置排序。之后的步骤如果想到了,就会变得...
  • qwb492859377
  • qwb492859377
  • 2016年05月23日 10:45
  • 1210

HDU 5700 区间交

Problem Description 小A有一个含有n个非负整数的数列与m个区间。每个区间可以表示为li,rili,ri。 它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大。...
  • Donald_TY
  • Donald_TY
  • 2016年08月16日 17:29
  • 144

hdu 5700 区间交 (multiset)

题意:小A有一个含有n个非负整数的数列与m个区间。每个区间可以表示为li,ri。 它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大。 题目分析:求前缀和,枚举左端点...
  • Ezereal
  • Ezereal
  • 2016年05月23日 14:58
  • 206

【51Nod】1672 - 区间交(线段树 & 贪心)

点击打开题目 1672 区间交 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  取消关注 ...
  • wyg1997
  • wyg1997
  • 2016年08月13日 09:59
  • 455

51nod 1672 区间交 (经典贪心)

1672 区间交 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 小A有一个含有n个非负整数的数...
  • qq_34374664
  • qq_34374664
  • 2017年07月09日 17:16
  • 454

HDU-5700-区间交

Problem Description小A有一个含有n个非负整数的数列与m个区间。每个区间可以表示为li,ri。 它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大。 例如样例中...
  • f_zyj
  • f_zyj
  • 2016年06月01日 03:29
  • 418

【Bzoj4653】区间

题意在数轴上有 n个闭区间 [l1,r1],[l2,r2],…,[ln,rn]。现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置。对于一个合法的选取方案,它的花费为被选中的最长区间长度...
  • Zhayan9QvQ
  • Zhayan9QvQ
  • 2017年05月01日 15:36
  • 276

hdu5700 区间交 思维

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5700 题目大意:  Problem Description 小A有一个含有n个非负整数的数列与...
  • qq_24477135
  • qq_24477135
  • 2016年06月10日 14:44
  • 213

HDU-5700-区间交(线段树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5700 Problem Description 小A有一个含有n个非负整数的数列与m个区间。...
  • qq978874169
  • qq978874169
  • 2016年05月24日 21:20
  • 240

Problem C: 区间交交

Problem C: 区间交交 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 36  Solved: 11 [Submit][Status][W...
  • baidu_23955875
  • baidu_23955875
  • 2015年02月16日 09:46
  • 792
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:区间交
举报原因:
原因补充:

(最多只允许输入30个字)