CodeForces 754D Fedor and coupons ——(k段线段最大交集)

  还记得lyf说过k=2的方法,但是推广到k是其他的话有点麻烦。现在这里采取另外一种方法。

  先将所有线段按照L进行排序,然后优先队列保存R的值,然后每次用最小的R值,和当前的L来维护答案即可。同时,如果Q的size()比k大,那么就弹出最小的R。

  具体见代码:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <set>
 5 #include <vector>
 6 #include <map>
 7 #include <vector>
 8 #include <queue>
 9 using namespace std;
10 const int N = (int)3e5+5;
11
12 int n,k;
13 struct seg
14 {
15     int l, r, id;
16     bool operator < (const seg & A) const
17     {
18         return l < A.l;
19     }
20 }p[N];
21
22 int main()
23 {
24     scanf("%d%d",&n,&k);
25     for(int i=1;i<=n;i++) {scanf("%d%d",&p[i].l,&p[i].r);p[i].id=i;}
26     sort(p+1,p+1+n);
27     priority_queue<int,vector<int>,greater<int> > Q;
28     int L = 0;
29     int ans = 0;
30     for(int i=1;i<=n;i++)
31     {
32         Q.push(p[i].r);
33         if(Q.size() > k) Q.pop();
34         if(Q.size() == k && ans < Q.top() - p[i].l + 1)
35         {
36             ans = Q.top() - p[i].l + 1;
37             L = p[i].l;
38         }
39     }
40     if(ans == 0)
41     {
42         puts("0");
43         int first = 0;
44         for(int i=1;i<=k;i++)
45         {
46             if(first) printf(" ");
47             else first = 1;
48             printf("%d",p[i].id);
49         }
50         puts("");
51     }
52     else
53     {
54         printf("%d\n",ans);
55         int first = 0;
56         for(int i=1;i<=n && k>0;i++)
57         {
58             int l = p[i].l, r = p[i].r;
59             if(l<=L && L+ans-1<=r)
60             {
61                 if(first) printf(" ");
62                 else first = 1;
63                 printf("%d",p[i].id);
64                 k--;
65             }
66         }
67         puts("");
68     }
69     return 0;
70 }

  另外,输出方案的方式也值得注意一下。

时间: 2024-10-12 18:14:42

CodeForces 754D Fedor and coupons ——(k段线段最大交集)的相关文章

CodeForces 754D Fedor and coupons (优先队列)

题意:给定n个优惠券,每张都有一定的优惠区间,然后要选k张,保证k张共同的优惠区间最大. 析:先把所有的优惠券按左端点排序,然后维护一个容量为k的优先队列,每次更新优先队列中的最小值,和当前的右端点, 之间的距离.优先队列只要存储右端点就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <

cf754 754D - Fedor and coupons

2个多小时,弱智了..(连A都做不对,就不要做D了(迷)) 1 #include<bits/stdc++.h> 2 #define lowbit(x) x&(-x) 3 #define LL long long 4 #define N 100005 5 #define M 1000005 6 #define mod 2147483648LL 7 #define inf 0x7ffffffff 8 using namespace std; 9 inline int ra() 10 { 1

codeforces 446C DZY Loves Fibonacci Numbers 数论+线段树成段更新

DZY Loves Fibonacci Numbers Time Limit:4000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2014-07-14) Description In mathematical terms, the sequence Fn of Fibonacci numbers is defi

CodeForces 52C Circular RMQ(区间循环线段树,区间更新,区间求和)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://codeforces.com/problemset/problem/52/C You are given circular array a0,?a1,?...,?an?-?1. There are two types of operations with it: inc(lf,?rg,?v) - this operation increases each element on the segm

Codeforces 467D Fedor and Essay(bfs)

题目链接:Codeforces 467D Fedor and Essay 题目大意:给定一个含n个单词的文本,然后给定m种变换,要求变换后r的个数尽量少,长度尽量短,不区分大小写. 解题思路:bfs,将每个单词处理成长度以及r的个数,然后从最优的开始更新即可,类似dp. #include <cstdio> #include <cstring> #include <map> #include <string> #include <vector> #

HDU 4902 Nice boat 成段线段树

操作1 的时候标记deng[rt]表示下面一段数都是与当前节点的值相同 下次操作2时直接对有deng标记的节点gcd更新 (可能还可以更简单) #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <malloc.h> #include <ctype.h> #include <math.h> #incl

Codeforces Beta Round #12 D. Ball (线段树)

题目大意: n个女性中,如果有一个女性的三维比这个女性的三维都大,这个女性就要自杀.问要自杀多少个. 思路分析: 先按照第一维排序. 然后离散化第二维,用第二维的下标建树,树上的值是第三维,更新的时候取最大值. 注意是按照第一维度从大到小进入线段树. 而且还要严格递增. 所以处理第一维度比较大小的时候要分开处理,要把相同的先判断,再更新入树. 那么如何判断这个女性是否自杀. 首先,你知道第一维度是从大到小的,所以先进树了的节点的第一维度一定更大. 再次,我们考虑第二维度,我们去树上第二维度下标大

codeforces754D Fedor and coupons

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description All our characters have hobbies. The same is true for Fedor. He enjoys shopping in the neighboring supermarket. The

Codeforces 750E New Year and Old Subsequence - 线段树 - 动态规划

A string t is called nice if a string "2017" occurs in t as a subsequence but a string "2016" doesn't occur in t as a subsequence. For example, strings "203434107" and "9220617" are nice, while strings "20016&q