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\n",ans);
    return(0);
}

posted @ 2018-07-09 02:01  StarHai  阅读(254)  评论(0编辑  收藏  举报