zoukankan      html  css  js  c++  java
  • Codeforces-754D Fedor and coupons

    传送门

    给你n(<=3e5)个区间,让你从中选出k(<=n)个,使这些区间的交集长度最大。区间范围[-1e9, 1e9]

    要求输出区间长度和选取的区间编号

    典型的优先队列问题。先把区间按左值从小到大排序,这样做保证了后面取出来的区间的左值大于先前所有的,然后我门就只需要比较右值了。注意到最终答案的区间是由k个区间交,所以我们要维护k个区间的信息。每次由这k个右值里的最小值来减去k个左值里的最大值再加一去更新答案。由于最后取出的区间的左值最大(排序过),所以我们维护k个右值即可。选取优先队列维护

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <queue>
     5 #define INF 0x3f3f3f3f
     6 using namespace std;
     7 typedef long long LL;
     8 int N, K;
     9 const int maxn = 3e5 + 10;
    10 struct node {
    11     int left, right, num;
    12 } seg[maxn];
    13 int left, right;
    14 
    15 bool cmp(const node &A, const node &B) {
    16     return A.left < B.left;
    17 }
    18 
    19 int main() {
    20     scanf("%d%d", &N, &K);
    21     for (int i = 0; i < N; i++) {
    22         scanf("%d%d", &seg[i].left, &seg[i].right);
    23         seg[i].num = i + 1;
    24     }
    25      int tmp = 1e9 + 10;;
    26      sort(seg, seg + N, cmp);
    27     priority_queue<int, vector<int>, greater<int> > que;
    28      for (int i = 0; i < K; i++) {
    29          que.push(seg[i].right);
    30          tmp = min(tmp, seg[i].right);
    31      }    
    32      int ans = 0;
    33      if (!(tmp < seg[K - 1].left)) {
    34          ans = tmp - seg[K - 1].left + 1;
    35          left = seg[K - 1].left;
    36          right = tmp;
    37      }
    38      tmp = que.top();
    39      for (int i = K; i < N; i++) {
    40          if (seg[i].right > tmp) {
    41              que.pop();
    42              que.push(seg[i].right);
    43              tmp = que.top();
    44              if (tmp - seg[i].left + 1 > ans) {
    45                  ans = tmp - seg[i].left + 1;
    46                  right = tmp;
    47                  left = seg[i].left;
    48              }
    49          }
    50      }
    51      printf("%d
    ", ans);
    52      if (ans == 0) {
    53          for (int i = 1; i <= K; i++) {
    54              printf("%d%c", i, i == K ? '
    ' : ' ');
    55          }
    56      } else {
    57          for (int i = 0; i < N && K; i++) {
    58              if (seg[i].left <= left && right <= seg[i].right) {
    59                  printf("%d%c", seg[i].num, K == 1 ? '
    ' : ' ');
    60                  --K;
    61              }
    62          }
    63       }
    64     return 0;
    65 }
  • 相关阅读:
    Win7旗舰版中的IIS配置asp.net的运行环境
    选中弹出层中内容
    在windows server 2003中配置ipad測試環境
    TFS 2012 Preview Quickstart
    Windows Azure Quick Start Hello World
    2013总结 和2014期望
    一个简单的.net写日志方法 可能的改进点
    基于Visual Studio的软件生命周期管理和持续交付 (二) 采用成熟度
    关于加班的那些事
    基于Visual Studio的软件生命周期管理和持续交付 (一) 前言
  • 原文地址:https://www.cnblogs.com/xFANx/p/7577280.html
Copyright © 2011-2022 走看看