蚯蚓

蚯蚓

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

题解:
这个题真的是停麻烦的,一不看题就要忘记干什么。。。
首先这些个蚯蚓的长度是不断增加的(所有蚯蚓都在增加),所以在处理的过程中,先把增加的长度省去,只处理未增加长度。
如果用优先队列复杂度就是O(m*logn) 这样的时间复杂度必然超时。
看了看网上的题解,哦豁然开朗。
用三个队列即可实现
证明如下:
如果a>=b
那么
a * p > = b * p
a - a * > = b - b * p
又因为他们之间同时增加长度,所以可以证明三个队列的单调性。
之后按照题目的要求来进行输入输出即可。

代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <unordered_map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <cctype>
#include<iomanip>
//#define int long long
#define endl '\n'
using namespace std;
const int maxn = 1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
using namespace std;
ll arr[maxn];
queue<ll> a,b,c;

int main(){
    ll n,m,q,u,v,t;
    cin>>n>>m>>q>>u>>v>>t;
    for(int i=0;i<n;i++){
        scanf("%lld",&arr[i]);
    }
    sort(arr,arr+n,greater<ll>());
    for(int i=0;i<n;i++){
        a.push(arr[i]);
    }
    for(int i=1;i<=m;i++){
        ll imax=MinN,flag;
        if(!a.empty())  if(a.front()>imax) imax=a.front(),flag=1;
        if(!b.empty())  if(b.front()>imax) imax=b.front(),flag=2;
        if(!c.empty())  if(c.front()>imax) imax=c.front(),flag=3;

        if(flag==1) a.pop();
        else if(flag==2) b.pop();
        else c.pop();

        imax+=(i-1)*q;
        ll x=imax*u/v;
        ll y=imax-x;

        if(!(i%t)) printf("%lld ",imax);
        b.push(x-i*q);c.push(y-i*q);
    }
    cout<<endl;
    ll cnt=1;
    while(true){
        ll imax=MinN,flag;
        if(a.empty()&&b.empty()&&c.empty()) break;
        if(!a.empty())  if(a.front()>imax) imax=a.front(),flag=1;
        if(!b.empty())  if(b.front()>imax) imax=b.front(),flag=2;
        if(!c.empty())  if(c.front()>imax) imax=c.front(),flag=3;

        if(flag==1) a.pop();
        else if(flag==2) b.pop();
        else c.pop();
        if(cnt%t==0) printf("%lld ",imax+m*q);
        cnt++;
    }
    return 0;
}







题解 文章被收录于专栏

主要写一些题目的题解

全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
牛客722552937号:新锐之星有点坑爹,特别是对男的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务