51nod 1672 区间交(贪心)

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1672 区间交(贪心)相关的知识,希望对你有一定的参考价值。

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

题意:

 

思路:
其实这就是一个经典的区间贪心问题,只需要按照左端点排序,然后用优先队列维护,每次将右端点最小的点出队列。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<stack>
 7 #include<queue>
 8 #include<cmath>
 9 #include<map>
10 #include<set>
11 using namespace std;
12 typedef long long ll;
13 typedef pair<int,int> pll;
14 const int INF = 0x3f3f3f3f;
15 const int maxn = 100000+5;
16 
17 int n,k,m;
18 int a[maxn];
19 ll sum[maxn];
20 
21 priority_queue< int,vector<int>,greater<int> > q;
22 
23 struct node
24 {
25     int left, right;
26     bool operator< (const node& rhs) const
27     {
28         return left<rhs.left||(left==rhs.left && right<rhs.right);
29     }
30 }p[maxn];
31 
32 int main()
33 {
34     //freopen("in.txt","r",stdin);
35     while(~scanf("%d%d%d",&n,&k,&m))
36     {
37         sum[0]=0;
38         for(int i=1;i<=n;i++)
39         {
40             scanf("%d",&a[i]);
41             sum[i]=sum[i-1]+a[i];
42         }
43         for(int i=0;i<m;i++)
44             scanf("%d%d",&p[i].left,&p[i].right);
45         sort(p,p+m);
46         while(!q.empty())  q.pop();
47         ll ans=0;
48         for(int i=0;i<m;i++)
49         {
50             q.push(p[i].right);
51             if(q.size()==k)
52             {
53                 ans=max(ans,sum[q.top()]-sum[p[i].left-1]);
54                 q.pop();
55             }
56         }
57         printf("%lld\\n",ans);
58     }
59     return 0;
60 }

 

以上是关于51nod 1672 区间交(贪心)的主要内容,如果未能解决你的问题,请参考以下文章

51nod1672区间交

51nod 1133 不重叠的线段 (贪心,序列上的区间问题)

51Nod 1133 不重叠的线段 | 典型贪心

51Nod 1091 线段重叠 贪心 区间重叠

51Nod 1091 线段的重叠(贪心+区间相关,板子题)

HihoCoder1672 : 区间问题([Offer收割]编程练习赛41)(贪心)