Intervals
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 18204 | Accepted: 6822 |
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
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxv=50005;
const int maxe=150015;
const int oo=1000000000;
inline int min(int a,int b)
{
return a<b?a:b;
}
inline int max(int a,int b)
{
return a>b?a:b;
}
struct node{
int w,to,next;
}e[maxe];
queue<int>q;
int dis[maxv],cnt[maxv],head[maxv],ver,edge,start,end;
bool vis[maxv];
void init()
{
for(int i=0;i<maxv;i++)
head[i]=-1,cnt[i]=0;
edge=0;
while(!q.empty()) q.pop();
}
void add(int u,int v,int c)
{
e[edge].to=v,e[edge].w=c,e[edge].next=head[u],head[u]=edge++;
}
bool spfa()
{
int to,i;
for(i=start;i<=end;i++)
dis[i]=(i==start?0:-oo);
memset(vis,0,sizeof(vis));
q.push(start);
vis[start]=1;
cnt[start]=1;
while(!q.empty())
{
int tmp=q.front();
q.pop();
for(i=head[tmp];i!=-1;i=e[i].next)
{
if(dis[tmp]+e[i].w>dis[to=e[i].to])
{
dis[to]=dis[tmp]+e[i].w;
if(!vis[to])
{
vis[to]=1;
q.push(to);
cnt[to]++;
if(cnt[to]>ver){
cout<<to<<endl;
while(!q.empty()) q.pop();
return false;
}
}
}
}
vis[tmp]=0;
}
return true;
}
int main()
{
int n,a,b,c;
while(cin>>n)
{
init();
end=-oo,start=oo;
while(n--)
{
cin>>a>>b>>c;
end=max(end,b+1);
start=min(start,a);
add(a,b+1,c);
}
for(int i=start;i<end;i++)
{
add(i,i+1,0);
add(i+1,i,-1);
}
ver=end-start+1;
if(spfa())
cout<<dis[end]-dis[start]<<endl;
else cout<<"ERROR"<<endl;
}
return 0;
}