Intervals
You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn.
Write a program that:
> reads the number of intervals, their endpoints 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 <= 50 000) - 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 <= 50 000 and 1 <= ci <= bi - ai + 1.
Process to the end of file.
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
恩,题意大致是,集合Z中在区间[3,7]中的元素个数不少于3个,Si为集合中从0到i的个数,则可以变化为S2-S7<=-3 等等都这样变化,然后在加上1=>Si-S(i-1)>=0,继续建边,然后求St-S0>=ans S0-St<=-ans最后即是-dis[0]求最短路
#include <iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define maxn 50050
#define inf 0x3f3f3f3f
using namespace std;
struct Edge
{
int f,t,p,next;
};
Edge edge[maxn*4];
int cnt;
int head[maxn];
void init()
{
cnt=0;
memset(head,-1,sizeof(head));
}
void add(int f,int t,int p)
{
edge[cnt].f=f;
edge[cnt].t=t;
edge[cnt].p=p;
edge[cnt].next=head[f];
head[f]=cnt++;
}
void spfa(int n)
{
queue<int>q;
int dis[maxn];
bool vis[maxn];
memset(vis,false,sizeof(vis));
memset(dis,inf,sizeof(dis));
dis[n]=0;
vis[n]=true;
q.push(n);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].t;
if(dis[v]>dis[u]+edge[i].p)
{
dis[v]=dis[u]+edge[i].p;
if(!vis[v])
{
q.push(v);
vis[v]=true;
}
}
}
}
printf("%d\n",-dis[0]);
}
int main()
{
int n,a,b,c,t;
while(~scanf("%d",&n))
{
t=0;
init();
while(n--)
{
scanf("%d%d%d",&a,&b,&c);
add(b,a-1,-c);
t=max(t,b);
}
for(int i=1;i<=t;++i)
{
add(i,i-1,0);
add(i-1,i,1);
}
spfa(t);
}
return 0;
}