刷水题 堆

题目背景

众所周知,熊本熊的洛谷大号是kakakaka。有的时候熊本熊会在洛谷上面刷水题,但是熊本熊并不知道该怎么计划好自己的时间,他想让你来帮他计划一下。

题目大意

熊本熊今天一时兴起想刷n道水题,熊本熊有m个大脑,每个大脑都只能独立工作,也就是说,熊本熊可以在同一时间做m道题。由于熊本熊刷的水题都是topcoder,codeforces,usaco,CCF上最新出的水题,所以在熊本熊刷一道水题时,下一道水题可能还没有出来。又因为熊本熊又不会什么奇技淫巧,所以他完成每一道题都有一个特定的时间。现在熊本熊想知道,对于每一个题目,他完成这道题目的时间。

输入输出格式

输入格式:

第1行:四个整数N,M(1 ≤ n, m ≤5*10^5)

第2~N+1行:每行两个数a,b,分别表示这道题目出版的时间和熊本熊做出这道题所需要的时间(1 ≤ a,b ≤ 10^9)

输出格式:共N行:表示熊本熊完成第i道题目的时间。

例数据

input

3 2
1 5
2 5
3 5

output

6
7
11

数据范围

对于50%的数据 1 ≤ n,m ≤ 10

对于100%的数据 1 ≤ n,m ≤ 5*10^5



一开始看到这题,我是很开心的,因为这题有一个加强版,那题还有一个优先级要考虑,复杂的多。

但我还是把这题给写挂了,只拿了40分。

最后随便改改就对了,所以这题告诉我一定要造组大数据对拍,别以为做过了就自以为是。

这题的思路就不再多加赘述了,很无脑、

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define ll long long
#define il inline
#define db double
using namespace std;
il int gi()
{
    int x=0,y=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘)
    {
        if(ch==‘-‘)
        y=-1;
        ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘)
    {
        x=x*10+ch-‘0‘;
        ch=getchar();
    }
    return x*y;
}
il ll gl()
{
    ll x=0,y=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘)
    {
        if(ch==‘-‘)
        y=-1;
        ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘)
    {
        x=x*10+ch-‘0‘;
        ch=getchar();
    }
    return x*y;
}
struct task
{
    ll begin,remain;
}t[500045];
ll heap[500045];
int size;
il void put(ll x)
{
    heap[++size]=x;
    int now=size,next;
    while(now!=1)
    {
        next=now>>1;
        if(heap[next]<=heap[now])
        break;
        swap(heap[now],heap[next]);
        now=next;
    }
}
il void pop()
{
    heap[1]=heap[size--];
    int now=1,next;
    while(now<<1<=size)
    {
        next=now<<1;
        if(heap[next+1]<heap[next]&&next<size)
        next++;
        if(heap[next]>=heap[now])
        break;
        swap(heap[now],heap[next]);
        now=next;
    }
}
int main()
{
    freopen("water.in","r",stdin);
    freopen("water.out","w",stdout);
    int n=gi(),m=gi();
    for(int i=1;i<=n;i++)
    {
        t[i].begin=gl(),t[i].remain=gl();
        if(size<m)
        {
            ll now=t[i].begin+t[i].remain;
            put(now);
            printf("%lld\n",now);
        }
        else
        if(heap[1]<=t[i].begin)
        {
            ll now=t[i].begin+t[i].remain;
            pop();
            put(now);
            printf("%lld\n",now);
        }
        else
        {
            ll now=heap[1]+t[i].remain;
            pop();
            put(now);
            printf("%lld\n",now);
        }
    }
    return 0;
}
时间: 2024-12-27 05:38:15

刷水题 堆的相关文章

刷水题(二)

今天,我又去刷水题了.水题好多呀!这些题分为N个难度级别,做出第i个难度级别的任意一题都需要a[i]分钟,并获得b[i]点积分.我最多可以刷T分钟水题,问我最多能获得多少积分? [输入] 第一行两个正整数N和T,接下来的N行每行两个正整数数a[i]和b[i]. [输出] 一个数,表示我最多可以获得的积分. [样例输入] 4 50 1 10 3 40 9 130 27 400 [样例输出] 720 题解: 直接上代码(没错,就是这么简单) 1 #include<iostream> 2 using

刷水题(五)

我要两天刷完所有n道水题,做出第i道题能获得a[i]点积分.现在我想要两天获得的积分尽量平均,问最小差多少? [输入] 第一行一个整数n,第二行n个整数,第i个整数a[i]表示做第i道水题获得的积分. [输出] 一个整数,表示两天积分的最小差值. [样例输入] 5 5 8 13 27 14 [样例输出] 3 [输出说明] (8+27)-(5+13+14)=3(积分) 和水题4类似,只不过总时间为所有积分总和的一半.(想想为什么) 1 #include<iostream> 2 using nam

hdu 3342 Legal or Not 拓扑排序判断环。 现在的我,除了刷水题,,还能干什么

Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4960    Accepted Submission(s): 2270 Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is

刷水题可耻

#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cstdlib> #include <cmath> #include <utility> #include <vector> #include <queue> #include <map> #include <

hdu 2149 Public Sale 巴什博弈模型~~我这样刷水题真的好吗~~~

Public Sale Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4914    Accepted Submission(s): 2941 Problem Description 虽然不想,但是现实总归是现实,Lele始终没有逃过退学的命运,因为他没有拿到奖学金.现在等待他的,就是像FarmJohn一样的农田生涯. 要种田得有田才

hdu 1849 Rabbit and Grass 谁都喜欢刷水题。。尼姆博弈

Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2507    Accepted Submission(s): 1888 Problem Description 大学时光是浪漫的,女生是浪漫的,圣诞更是浪漫的,但是Rabbit和Grass这两个大学女生在今年的圣诞节却表现得一点都不浪漫:不去逛商场,不去

【Poj1003】刷水题刷的不亦乐乎

输入一个长度 利用循环计算需要多少张卡片 输出时注意i是从2开始,最后结束时i是多加了个1 所以输出i-2 #include<iostream> using namespace std; int main(){ double l; while(cin>>l && l!=0.0){ double lon=0.0; int i=2; for(;lon<l;i++) lon+=1.0/i; cout<<i-2<<" card(s)\

刷了500道水题是什么体验?

并没有什么卵用. 我马上大二了,大一两学期目测切了1000道水题了,毫无意义. 至今不理解kmp和后缀数组,只会模板.数论和博弈论是什么?能吃吗?只会打表.图论至今不会tarjan,话说dlx是什么?插头dp,这是什么?数据结构还好,经常做高中生的题,可持久化可持久化线段树也能花一下午时间写出来,然而并不会考. 平时做题只刷水题,遇到难题的时候,随手搜题解,看了看,哇,这居然能这么搞!然后抄一遍别人代码,交上去ac. cf一年几乎没缺过,花了大一上半年时间才滚上div1.然而至今紫号一堆,黄名一

POJ2013 Symmetric Order(继续我的水题之路)

[题意简述]:这个题意描述很简单,看输入输出就可以了. [分析]:还是刷水题心情好点~ 不过,不知为什么我的代码,G++过了,而C++却CE. // 748K 16Ms #include<iostream> #include<cstdio> using namespace std; #include<cstring> string cha[26]; string cha1[26],cha2[26]; int main() { int n; int count = 1;