咸鱼睡觉觉
Time Limit: 1000 MS Memory Limit: 64 MB
咸鱼
要睡觉觉了!
但那群咕咕
有点烦。
咸鱼
决定要赶走一些咕咕
,使得他们不要这么吵。
那kk只咕咕
们排成了一列。
咸鱼
做出了nn个决定,第ii个决定是要在第aiai只咕咕
到第bibi只咕咕
之间至少赶走其中cici只咕咕
。
但咸鱼
又不想那么狠心,所以希望你能帮帮他,决定最少移走多少只咕咕
可以满足咸鱼
的所有要求。
Input
第一行两个整数kk nn,表示有kk只咕咕,咸鱼做出了nn个决定(1≤k≤500001≤k≤50000,1≤n≤500001≤n≤50000)。
接下来nn行,每行三个数aiai bibi cici(1≤ai≤bi≤k1≤ai≤bi≤k, 0≤ci≤bi−ai+10≤ci≤bi−ai+1),含义如上文。
Output
输出一个整数,表示至少要赶走多少只咕咕
Sample input and output
Sample Input | Sample Output |
---|---|
3 3 1 1 1 2 2 1 3 3 0 | 2 |
Hint
赶走第11只和第22只咕咕
!
Source
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);
}