• UESTC1961-咸鱼睡觉觉


    咸鱼睡觉觉

    Time Limit: 1000 MS     Memory Limit: 64 MB
    Submit Status

    咸鱼要睡觉觉了!

    但那群咕咕有点烦。

    咸鱼决定要赶走一些咕咕,使得他们不要这么吵。

    kk咕咕们排成了一列。

    咸鱼做出了nn个决定,第ii个决定是要在第aiai咕咕到第bibi咕咕之间至少赶走其中cici咕咕

    咸鱼又不想那么狠心,所以希望你能帮帮他,决定最少移走多少只咕咕可以满足咸鱼的所有要求。

    Input

    第一行两个整数kk nn,表示有kk只咕咕,咸鱼做出了nn个决定(1k500001≤k≤50000,1n500001≤n≤50000)。

    接下来nn行,每行三个数aiai bibi cici1aibik1≤ai≤bi≤k0cibiai+10≤ci≤bi−ai+1),含义如上文。

    Output

    输出一个整数,表示至少要赶走多少只咕咕

    Sample input and output

    Sample InputSample Output
    3 3
    1 1 1
    2 2 1
    3 3 0
    2

    Hint

    赶走第11只和第22咕咕

    Source

    2018 UESTC ACM Training for Graph Theory

    UESTC Online Judge

    Copyright (C) 2012 - 2018 Ruins He(@ruinshe), Jianjin Fan(@pfctgeorge) and Yun Li(@mzry1992). Project home

    Any Problem, Please Report On Issues Page.

    AC代码为:

    #include<bits/stdc++.h>
    using namespace std;
    struct part
    {
     int ends,data,next;
    };
    int n,k,m,cnt;
    struct part e[1000100];
    int st[300000],vis[200100],que[2000000],dis[300000],ru[300000];
    void combine(int x,int y,int z)
    {
        cnt+=1;
        e[cnt].ends=y;
        e[cnt].data=z;
        e[cnt].next=st[x];
        st[x]=cnt;
    }


    int spfa(int x)
    {
        int h,t,ii,nown;
        h=0; t=1;
        dis[x]=0;
        vis[x]=1;
        que[1]=x;
        while (h!=t)
        {
            h=(h+1)%1000000;
            nown=que[h];
            ii=st[nown];
            while (ii!=-1)
            {
                if (dis[e[ii].ends]<dis[nown]+e[ii].data)
                {
                    dis[e[ii].ends]=dis[nown]+e[ii].data;
                    if (!vis[e[ii].ends])
                    {
                        vis[e[ii].ends]=1;
                        t=(t+1)%1000000;
                        que[t]=e[ii].ends;
                    }
                }
                ii=e[ii].next;
            }
            vis[nown]=0;
        }
      return(dis[k]);
    }


    int main()
    {
        scanf("%d%d",&k,&n);
        for (int i=0;i<=k;i++)
        {
            st[i]=-1;
                dis[i]=-10000;
                vis[i]=0;
        }
        cnt=0;
        int a,b,c;
        for (int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            combine(a-1,b,c);
        }
        for (int i=1;i<=k;i++)
        {
            combine(i-1,i,0);
            combine(i,i-1,-1);
        }
        for (int i=1;i<=k;i++)
            combine(0,i,0);
         int ans=spfa(0);
            printf("%d ",ans);
        return(0);
    }

  • 相关阅读:
    WinRAR的命令行模式用法介绍
    Linux find命令的用法实践
    Linux服务器磁盘扩展和oracle表空间文件迁移操作记录
    博客园开篇,自己开发的双色球小助手
    解决MySQL安装3306端口占用问题
    html书写行内元素时-tab和换行会在行内元素间引入间距
    FileReader生成图片dataurl的分析
    mysql启动流程
    npm--debug模块
    js之Symbol类型
  • 原文地址:https://www.cnblogs.com/csushl/p/9386780.html
Copyright © 2020-2023  润新知