#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#define inf 0x7fffffff
using namespace std;
const int maxn=600+10;
const int M = 999999;
int n,m,from,to;
int d[maxn];
struct node
{
int v,flow;
int next;
}edge[M*2];
int head[maxn],edgenum;
void add(int u,int v,int flow)
{
edge[edgenum].v=v ;edge[edgenum].flow=flow ;
edge[edgenum].next=head[u];
head[u]=edgenum++;
edge[edgenum].v=u ;edge[edgenum].flow=0;
edge[edgenum].next=head[v];
head[v]=edgenum++;
}
int bfs()
{
memset(d,0,sizeof(d));
d[from]=1;
queue<int> Q;
Q.push(from);
while (!Q.empty())
{
int u=Q.front() ;Q.pop() ;
for (int i=head[u] ;i!=-1 ;i=edge[i].next)
{
int v=edge[i].v;
if (!d[v] && edge[i].flow>0)
{
d[v]=d[u]+1;
Q.push(v);
if (v==to) return 1;
}
}
}
return 0;
}
int dfs(int u,int flow)
{
if (u==to || flow==0) return flow;
int cap=flow;
for (int i=head[u] ;i!=-1 ;i=edge[i].next)
{
int v=edge[i].v;
if (d[v]==d[u]+1 && edge[i].flow>0)
{
int x=dfs(v,min(cap,edge[i].flow));
edge[i].flow -= x;
edge[i^1].flow += x;
cap -= x;
if (cap==0) return flow;
}
}
return flow-cap;
}
int dinic()
{
int sum=0;
while (bfs()) sum += dfs(from,inf);
return sum;
}
int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
memset(head,-1,sizeof(head));
edgenum=0;
int s[222],q[222],e[222],t[222];
int time[maxn],cnt=1;
memset(time,0,sizeof(time));
int sum=0;
for (int i=1 ;i<=n ;i++)
{
scanf("%d%d%d%d",&s[i],&q[i],&e[i],&t[i]);
sum += q[i]*t[i];
time[cnt++]=s[i];
time[cnt++]=e[i];
}
sort(time+1,time+cnt);
int c=0;
for (int i=1 ;i<cnt ;i++)
{
if (time[c] != time[i])
time[++c]=time[i];
}
from=n+c+1;
to=from+1;
for (int i=1 ;i<=n ;i++)
add(from,i,q[i]*t[i]);
for (int i=1 ;i<=c ;i++)
{
add(n+i,to,m*(time[i]-time[i-1]));
for (int j=1 ;j<=n ;j++)
{
if (s[j]<=time[i-1] && time[i]<=e[j])
add(j,n+i,inf);
}
}
if (sum==dinic()) printf("Yes\n");
else printf("No\n");
}
return 0;
}
tjut 2883
最新推荐文章于 2017-09-03 18:29:42 发布