Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 28852 | Accepted: 11131 |
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 <map> #include <set> #include <stack> #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define eps 1e-15 #define MAXN 50005 #define INF 1000000007 #define MAX(a,b)(a>b?a:b) #define MIN(a,b)(a<b?a:b) int N,n,Max,Min; int head[MAXN],d[MAXN],vis[MAXN]; struct EDG{ int v,w,next; }edge[3*MAXN]; void AddEdge(int u,int v,int w){ edge[N].v=v;edge[N].w=w;edge[N].next=head[u];head[u]=N++; } void SPFA(){ for(int i=Min;i<=Max;i++) d[i]=-INF; d[Min]=0;queue<int>q;q.push(Min); while(!q.empty()){ int x=q.front();q.pop(); vis[x]=0; for(int e=head[x];e!=-1;e=edge[e].next) if(d[edge[e].v]<d[x]+edge[e].w){ d[edge[e].v]=d[x]+edge[e].w; if(!vis[edge[e].v]){ q.push(edge[e].v); vis[edge[e].v]=1; } } } } int main(){ while(scanf("%d", &n)!=EOF){ memset(vis,0,sizeof(vis)); memset(edge,0,sizeof(edge)); memset(head,-1,sizeof(head)); Min=INF;Max=-INF;N=0; for(int i=0;i<n;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); AddEdge(u,v+1,w); Min=MIN(Min,u); Max=MAX(Max,v+1); } for(int i=Min;i<Max;i++){ AddEdge(i,i+1,0); AddEdge(i+1,i,-1); } SPFA(); printf("%d ", d[Max]); } } /* 5 3 7 3 8 10 3 6 8 1 1 3 1 10 11 1 */