Intervals
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 25777 | Accepted: 9868 |
Description
You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn.
Write a program that:
reads the number of intervals, their end points and integers c1, ..., cn from the standard input,
computes the minimal size of a set Z of integers which has at least ci common elements with interval [ai, bi], for each i=1,2,...,n,
writes the answer to the standard output.
Write a program that:
reads the number of intervals, their end points and integers c1, ..., cn from the standard input,
computes the minimal size of a set Z of integers which has at least ci common elements with interval [ai, bi], for each i=1,2,...,n,
writes the answer to the standard output.
Input
The first line of the input contains an integer n (1 <= n <= 50000) -- the number of intervals. The following n lines describe the intervals. The (i+1)-th line of the input contains three integers ai, bi and ci separated by single spaces and such that 0 <= ai <= bi <= 50000 and 1 <= ci <= bi - ai+1.
Output
The output contains exactly one integer equal to the minimal size of set Z sharing at least ci elements with interval [ai, bi], for each i=1,2,...,n.
Sample Input
5 3 7 3 8 10 3 6 8 1 1 3 1 10 11 1
Sample Output
6
Source
题意:给出n个[ a,b ]和c,找出一个最小的集合Z的个数
让s[i]代表这个区间元素的个数
s[7]-s[3]>=3
则s[7]>=s[3]+3 转化成最长路 u=3 v=7 w=3;
注意s[i+1]-s[i]>=0 s[i+1]-s[i]<=1
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
#define N 51234
#define inf 0x3f3f3f3f
struct node
{
int v,w,next;
}eg[N*3];
int minn,maxn,top;
int dist[N],v[N],head[N];
void add(int u,int v,int w)
{
eg[top].v=v;
eg[top].w=w;
eg[top].next=head[u];
head[u]=top++;
}
void spfa()
{
memset(v,0,sizeof(v));
memset(dist,-inf,sizeof(dist));
dist[minn]=0;
queue<int>q;
q.push(minn);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=eg[i].next)
{
int t=dist[u]+eg[i].w;
if(dist[eg[i].v]<t)
{
dist[eg[i].v]=t;
if(!v[eg[i].v])
{
q.push(eg[i].v);
}
}
}
}
}
int main()
{
int u,v,w,n,i,j;
top=0;
scanf("%d",&n);
memset(head,-1,sizeof(head));
minn=inf;maxn=-inf;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&u,&v,&w);
if(u-1<minn) minn=u-1;
if(v+1>maxn)maxn=v+1;
add(u-1,v,w);
}
for(i=minn;i<maxn;i++)
{
add(i,i+1,0);
add(i+1,i,-1);
}
spfa();
printf("%d\n",dist[maxn]);
return 0;
}