• 题解:ABC320E - Somen Nagashi


    题解:ABC320E - Somen Nagashi

    ·题目

    链接:Atcoder

    链接:洛谷

    ·难度

    算法难度:B。

    思维难度:B。

    调码难度:A。

    综合评价:普及+/提高。

    ·算法

    堆/set。

    ·思路

    我们需要实现以下功能(该容器可以手写堆实现,也可以用set):支持快速插入删除,并能够随时取出所有元素中的最小值。我们用其中一个存储吃完面条回来的人的编号、时间的组合(结构体Info),另一个存储现在队列中存在的人的编号。每次操作将所有时间小于t的“吃完面条回来的人”入队,并将该任务删除,之后将w的面条加到队列中编号最小的人身上,并添加回归任务“这个人在s+t的时间出完面条归队”,然后在队列中删除这个人。最后输出每个人的面条数目即可。

    ·代价

    O(n+m*log(n)),因为set、堆等都有log级别的代价。

    ·细节

    迭代器用法和指针基本相同。

    ·代码

    1. #include
    2. #define N 220000
    3. using namespace std;
    4. struct Info{
    5. long long node,ttime;
    6. bool operator<(Info ot)const{
    7. if(ttime==ot.ttime){
    8. return node
    9. }
    10. return ttime
    11. }
    12. };
    13. setd={};
    14. //回归任务
    15. set<long long>zd={};
    16. //队列信息
    17. long long sum[N]={},m=0,n=0;
    18. //sum就是面条数目
    19. int main(){
    20. scanf("%lld%lld",&n,&m);
    21. for(long long i=1;i<=n;i++){
    22. zd.insert(i);
    23. }
    24. //输入,并记录每个人都在队列中
    25. for(long long i=1;i<=m;i++){
    26. long long s=0,t=0,w=0;
    27. scanf("%lld%lld%lld",&t,&w,&s);
    28. while(d.empty()==false&&d.begin()->ttime<=t){
    29. zd.insert(d.begin()->node);
    30. d.erase(d.begin());
    31. }
    32. //完成需要完成的回归任务
    33. if(zd.empty()==false){
    34. sum[*zd.begin()]+=w;
    35. d.insert({*zd.begin(),t+s});
    36. zd.erase(zd.begin());
    37. }
    38. //如果可以,就让队首的人得到面条离开一段时间
    39. }
    40. for(long long i=1;i<=n;i++){
    41. printf("%lld\n",sum[i]);
    42. }
    43. //输出答案
    44. return 0;
    45. }

    ·注意

    手写堆很长,不推荐。

  • 相关阅读:
    手机便签怎么设置每月18号提醒
    视频直播美颜SDK算法代码解析
    必看!2023年最新MSP开源应用程序指南电子书大揭秘
    第三章:JVM监控及诊断工具-GUI篇
    Unity捏脸工具
    Postman如何导出接口的几种方法?
    Docker(五)—— 镜像原理、容器快照commit
    Vue.js 2 —组件(Component)化编程
    RabbitMQ中方法channel.basicAck的使用说明
    各种排序算法
  • 原文地址:https://blog.csdn.net/sluckystar/article/details/132956962