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

题意:给定n个优惠券,每张都有一定的优惠区间,然后要选k张,保证k张共同的优惠区间最大。

析:先把所有的优惠券按左端点排序,然后维护一个容量为k的优先队列,每次更新优先队列中的最小值,和当前的右端点,

之间的距离。优先队列只要存储右端点就好。

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#include <sstream>
#include <unordered_map>
#include <unordered_set>
#define debug() puts("++++");
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const LL LNF = 1LL << 60;
const double inf = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 3e5 + 5;
const int mod = 2000;
const int dr[] = {-1, 1, 0, 0};
const int dc[] = {0, 0, 1, -1};
const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline bool is_in(int r, int c){
    return r >= 0 && r < n && c >= 0 && c < m;
}
struct Node{
    int l, r, id;
    bool operator < (const Node &p) const{
        return l < p.l;
    }
};
Node a[maxn];

int main(){
    while(scanf("%d %d", &n, &m) == 2){
        for(int i = 0; i < n; ++i){
            scanf("%d %d", &a[i].l, &a[i].r);
            a[i].id = i + 1;
        }
        sort(a, a + n);
        priority_queue<int, vector<int>, greater<int> >pq;
        int ans = 0;
        int t = 0;
        for(int i = 0; i < n; ++i){
            pq.push(a[i].r);
            if(pq.size() > m)  pq.pop();
            int tmp = pq.top() - a[i].l + 1;
            if(pq.size() == m && ans < tmp){
                ans = tmp;
                t = a[i].l;
            }
        }

        printf("%d\n", ans);
        if(!ans){
            printf("1");
            for(int i = 2; i <= m; ++i)  printf(" %d", i);
            continue;
        }
        else{
            int cnt = 0;
            for(int i = 0; i < n && m; ++i) if(a[i].l <= t && a[i].r >= t + ans - 1){
                if(cnt)  putchar(‘ ‘);
                printf("%d", a[i].id);
                --m;
                ++cnt;
            }
        }
        printf("\n");
    }
    return 0;
}
时间: 2024-10-20 00:12:04

CodeForces 754D Fedor and coupons (优先队列)的相关文章

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 <vec

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 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> #

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 - 754D

All our characters have hobbies. The same is true for Fedor. He enjoys shopping in the neighboring supermarket. The goods in the supermarket have unique integer ids. Also, for every integer there is a product with id equal to this integer. Fedor has

Codeforces-754D Fedor and coupons

传送门 给你n(<=3e5)个区间,让你从中选出k(<=n)个,使这些区间的交集长度最大.区间范围[-1e9, 1e9] 要求输出区间长度和选取的区间编号 典型的优先队列问题.先把区间按左值从小到大排序,这样做保证了后面取出来的区间的左值大于先前所有的,然后我门就只需要比较右值了.注意到最终答案的区间是由k个区间交,所以我们要维护k个区间的信息.每次由这k个右值里的最小值来减去k个左值里的最大值再加一去更新答案.由于最后取出的区间的左值最大(排序过),所以我们维护k个右值即可.选取优先队列维护

CodeForces - 948C Producing Snow(优先队列)

题意: n天. 每天你会堆一堆雪,体积为 v[i].每天都有一个温度 t[i] 所有之前堆过的雪在第 i 天体积都会减少 t[i] . 输出每天融化了的雪的体积. 这个题的正解我怎么想都很难理解,但是慢慢理解了. 计算一个 t[i] 的前缀和 sum. 那么到第 j 天时,设第 i 堆雪融化的体积是 V,则 V = min (sum [ j ] - sum[ i-1], v[ i ] ) 所以把 v[ i ] + sum[ i -1] 加入优先队列里,就可以只处理所有当天能化完的雪了. 若 su

Codeforces Gym101234G Dreamoon and NightMarket(优先队列,子集和第k大)

题意: 求子集和第k大,n,k<=1e6 思路: 优先队列经典题目,注意优先队列是默认按从大到小排的 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<stack> #include<queue> #include&l

Codeforces Round #390 (Div. 2) 解题报告

时隔一个月重返coding…… 期末复习了一个月也不亏 倒是都过了…… 就是计组61有点亏 复变68也太低了 其他都还好…… 假期做的第一场cf 三道题 还可以…… 最后room第三 standing383简直人生巅峰…… 看楼上楼下都是两道题的 如果A题不错那么多估计能进前300了吧…… 这场倒是把之前两场的分加回来了 开头不错 这个假期争取紫名~ A.Lesha and array splitting 把给定的数组分割成几个区间 要求各个区间和不能为0 一开始没注意到分割之后的区间重新合成之