【每日一题】蚯蚓 题解

蚯蚓

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

相关推荐

拒绝无效加班的小师弟很中意你:求职意向没有,年龄、课程冗余信息可以删掉,需要提升项目经历。排版需要修改。
点赞 评论 收藏
分享
10-28 14:42
门头沟学院 Java
watermelon1124:因为嵌入式炸了
点赞 评论 收藏
分享
评论
9
1
分享
牛客网
牛客企业服务