zoukankan      html  css  js  c++  java
  • [2018南京预赛]Lpl and Energy-saving Lamps

    一、题面

    样例输入:

    5 4
    3 10 5 2 7
    10
    5 1 4 8 7 2 3 6 4 7

    样例输出:

    4 0
    1 1
    3 6
    5 1
    5 1
    2 0
    3 2
    4 4
    3 6
    5 1

    二、思路

    关键词:线段树

    这道题最难就难在看题吧。。。也许ACM的魅力之一便在于此——面对若干道题,你不知每一道题的难度是高是低,只能耐心地读清题面,审清题意,理清思路,方可知其是否在能力范围内以及预估耗时。考试过程中,我基本靠board来判断题目难度,清北大佬们先AC了哪些我就先做哪些。。。然而这道题似乎他们也不太愿意读题?其实际难度我觉得可能还要低于其他几道更早被A的题目。

    题目大意是:现每个月提供m个灯泡,每次选出第一个小于当前灯泡数的房间,更换好该房间的灯泡,直至不存在这样的房间,则进入下个月。给出若干次月份数,求这几个月内能更换多少个房间的灯泡,以及剩余灯泡数。注意:当所有房间更换完之后,将不再提供灯泡!

    n <= 10 ^ 5, d[p] <= 10 ^ 5,暴搜不可行。题目核心无非是求最早出现的小于k的数,可以用线段树维护每一段的最小值,再进行单点修改。水的一批。

    三、代码

     1 #include <cstdio>
     2 #define MAXN 100005
     3 #define INF 0x3f3f3f3f
     4 
     5 int n, m, T, a[MAXN], x, t[MAXN << 2], k, l[MAXN], r[MAXN], q, mx, tot;
     6 
     7 int max(int a, int b) {
     8     return a > b ? a : b;
     9 }
    10 
    11 int min(int a, int b) {
    12     return a < b ? a : b;
    13 }
    14 
    15 void build(int o, int l, int r) {
    16     if (l == r) {
    17         scanf("%d", &x), t[o] = x;
    18         return;
    19     }
    20     int m = (l + r) >> 1;
    21     build(o << 1, l, m), build(o << 1 | 1, m + 1, r);
    22     t[o] = min(t[o << 1], t[o << 1 | 1]);
    23 }
    24 
    25 int query(int o, int l, int r) {
    26     if (l == r) return l;
    27     int m = (l + r) >> 1;
    28     if (t[o] > k) return 0;
    29     return t[o << 1] <= k ? query(o << 1, l, m) : query(o << 1 | 1, m + 1, r);
    30 }
    31 
    32 void upd(int o, int l, int r) {
    33     if (l == r) {
    34         k -= t[o], t[o] = INF;
    35         return;
    36     }
    37     int m = (l + r) >> 1;
    38     if (q <= m) upd(o << 1, l, m);
    39     else upd(o << 1 | 1, m + 1, r);
    40     t[o] = min(t[o << 1], t[o << 1 | 1]);
    41 }
    42 
    43 void work() {
    44     for (int i = 1; i <= mx; i++) {
    45         if (tot != n) {
    46             k += m;
    47             while (q = query(1, 1, n)) upd(1, 1, n), tot++;
    48         }
    49         l[i] = k, r[i] = tot;
    50     }
    51 }
    52 
    53 int main() {
    54     scanf("%d %d", &n, &m);
    55     build(1, 1, n);
    56     scanf("%d", &T);
    57     for (int i = 1; i <= T; i++) scanf("%d", &a[i]), mx = max(a[i], mx);
    58     work();
    59     for (int i = 1; i <= T; i++) printf("%d %d
    ", r[a[i]], l[a[i]]);
    60     return 0;
    61 } 
  • 相关阅读:
    ”锁“-LockSupport深入浅出
    python利器之切片
    i 是一个修饰符 (搜索不区分大小写)
    react ---- svg(绘图---桑葚图)
    react---后台管理系统推荐(ant disgin)
    vue____后台管理系统搭建(推荐,懒得自己写了)
    H5 -- 简单的 跳转下载APP(自备份留存)
    小程序UI框架推荐----自用备份---colorUI
    H5-----注册 示例
    H5 ---- 地图--周边搜索
  • 原文地址:https://www.cnblogs.com/jinkun113/p/9594182.html
Copyright © 2011-2022 走看看