【每日一题】蚯蚓 题解

蚯蚓

https://ac.nowcoder.com/acm/problem/16430

Description

图片说明

Solution

难点在于题目太长了,输出也很麻烦。需要注意到 , 用优先队列每次找最大值显然是不可行的,需要寻找 的做法。对于一个数字 ,如果按照题目将它分成 , 如果 , 那么满足
基于以上性质,可以开三个队列,分别有:

  • 原来的蚯蚓
  • 分割出来的蚯蚓
  • 分割出来的蚯蚓

那么只要原来的蚯蚓具有单调性,每次只需要找这三个队列的最大值即可
至于每次都要增加的长度,我们可以先不加上,等到取出来的时候在加 , 放回去的时候注意要减去

Code

#pragma GCC optimize(3)
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;

const int N = 2e5 + 5;
const int mod = 1e9 + 7;

queue<ll> q[3];
ll a[N];
int main() {
  ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  ll n, m, u, v, qq, t; cin >> n >> m >> qq >> u >> v >> t;
  for(int i = 1; i <= n; i++) cin >> a[i];
  sort(a + 1, a + 1 + n);
  for(int i = n; i >= 1; i--) q[0].push(a[i]);
  for(int i = 1; i <= m; i++) {
    ll maxz = -1e18, pos = -1;
    for(int j = 0; j < 3; j++) {
      if(q[j].size() && q[j].front() > maxz) {
        maxz = q[j].front();
        pos = j;
      }
    }
    q[pos].pop();
    maxz += (i - 1) * qq; 
    ll x = maxz * u / v, y = maxz - x;
    if((i % t == 0)) cout << maxz << ' ';
    q[1].push(x - i * qq), q[2].push(y - i * qq);
  }
  cout << "\n";
  int cnt = 1;
  while(q[0].size() || q[1].size() || q[2].size()) {
    ll p = -1e18, pos = -1;
    for(int j = 0; j < 3; j++) {
      if(q[j].size() && q[j].front() > p) {
        pos = j;
        p = q[j].front();
      }
    }
    q[pos].pop();
    if(cnt % t == 0) {
      cout << p + m * qq << ' ';
    }
    cnt++;
  }
  cout << "\n";
  return 0;
}
Kurisu与牛客的每日一题 文章被收录于专栏

每日一题

全部评论
请问我可以纵向切吗
点赞 回复 分享
发布于 2022-07-22 16:54

相关推荐

头像 会员标识
11-27 17:08
已编辑
牛客_产品运营部_私域运营
腾讯 普通offer 24k~26k * 15,年包在36w~39w左右。
点赞 评论 收藏
分享
霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
巧克力1:双选会不如教室宣讲会
点赞 评论 收藏
分享
评论
9
1
分享
牛客网
牛客企业服务