华师一附中OI组

标题: NOIP 2016 D2T2 蚯蚓 [打印本页]

作者: 胡雨菲菲    时间: 2018-6-12 16:18
标题: NOIP 2016 D2T2 蚯蚓
本题中,我们将用符号 LcJ 表示对 c 向下取整,例如: L3.0J = L3.1J = L3.9J = 3 。 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去 请神刀手来帮他们消灭蚯蚓。
蛐蛐国里现在共有 n 只蚯蚓( n 为正整数)。 每只蚯蚓拥有长度,我们设第 i 只匠 蚓的长度为 ai ( i = 1, 2, … , n ),并保证所有的长度都是非负整数(即:可能存在长度为 0 的蚯蚓)。
每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选 一个)将其切成两半。 神刀手切开蚯蚓的位置由常数 p (是满足 0 < p < 1 的有理数) 决定,设这只蚯蚓长度为 x ,神刀手会将其切成两只长度分别为 LpxJ 和 x − LpxJ 的匠 蚓。特殊地,如果这两个数的其中一个等于 0 ,则这个长度为 0 的蚯蚓也会被保留。此 外,除了刚刚产生的两只新蚯蚓,其余蚯蚓的长度都会增加q(是一个非负整常数)。
蛐蛐国王知道这样不是长久之计,因为蚯蚓不仅会越来越多,还会越来越长。蛐蛐国王决定求助于一位有着洪荒之力的神秘人物,但是救兵还需要 m 秒才能到来… … ( m 为非负整数)
蛐蛐国王希望知道这 m 秒内的战况。 具体来说,他希望知道: • m 秒内,每一秒被切断的蚯蚓被切断前的长度(有 m 个数): • m 秒后,所有蚯蚓的长度(有 n + m 个数)。 蛐蛐国王当然知道怎么做啦! 但是他想考考你… …

作者: 胡雨菲菲    时间: 2018-6-12 16:18
堆会超时,用三个队列即可
  1. #include <cstdio>
  2. #include <queue>
  3. #include <algorithm>
  4. typedef long long LL;
  5. const int N = 100010;
  6. const LL INF = 1ll << 62;
  7. std::queue<LL> a;
  8. std::queue<LL> b;
  9. std::queue<LL> c;

  10. int m, n, v, u, k, q;
  11. LL d[N], delta;

  12. inline void geta(LL &t) {
  13.     t = a.front();
  14.     a.pop();
  15.     return;
  16. }
  17. inline void getb(LL &t) {
  18.     t = b.front();
  19.     b.pop();
  20.     return;
  21. }
  22. inline void getc(LL &t) {
  23.     t = c.front();
  24.     c.pop();
  25.     return;
  26. }

  27. int main() {
  28.     scanf("%d%d%d%d%d%d", &n, &m, &q, &u, &v, &k);
  29.     for(int i = 1; i <= n; i++) {
  30.         scanf("%lld", &d[i]);
  31.     }
  32.     std::sort(d + 1, d + n + 1);
  33.     for(int i = n; i >= 1; i--) {
  34.         a.push(d[i]);
  35.     }
  36.     for(int i = 1; i <= m; i++) {
  37.         LL t;
  38.         if(b.empty() && c.empty()) {
  39.             geta(t);
  40.         }
  41.         else if(a.empty()) {
  42.             if(b.front() >= c.front()) {
  43.                 getb(t);
  44.             }
  45.             else {
  46.                 getc(t);
  47.             }
  48.         }
  49.         else {
  50.             if(a.front() >= b.front() && a.front() >= c.front()) {
  51.                 geta(t);
  52.             }
  53.             else if(b.front() >= c.front()) {
  54.                 getb(t);
  55.             }
  56.             else {
  57.                 getc(t);
  58.             }
  59.         }
  60.         t += delta;
  61.         if(i % k == 0) {
  62.             printf("%lld ", t);
  63.         }
  64.         LL t1 = t * u / v;
  65.         LL t2 = t - t1;
  66.         delta += q;
  67.         t1 -= delta;
  68.         t2 -= delta;
  69.         b.push(t1);
  70.         c.push(t2);
  71.     }
  72.     puts("");
  73.     a.push(-INF);
  74.     b.push(-INF);
  75.     c.push(-INF);
  76.     for(int i = 1; i <= m + n; i++) {
  77.         LL t;
  78.         if(a.front() >= b.front() && a.front() >= c.front()) {
  79.             geta(t);
  80.         }
  81.         else if(b.front() >= c.front()) {
  82.             getb(t);
  83.         }
  84.         else {
  85.             getc(t);
  86.         }
  87.         if(i % k == 0) {
  88.             printf("%lld ", t + delta);
  89.         }
  90.     }
  91.     return 0;
  92. }
复制代码





欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2