第一次接触差分约束系统,现在只是知道了一个差分约束的公式 就是最短路的最终形式 v-u<=w,在最短路求解中 只要是满足条件 if(dis[u]+w<dis[v]) 就将dis[v]的值更新,最后都会满足约束条件 v-u<=w。
题目说[ai, bi]区间内和点集Z至少有ci个共同元素,那也就是说如果我用Si表示区间[0,i]区间内至少有多少个元素的话,那么Sbi - Sai >= ci,这样我们就构造出来了一系列边,权值为ci,但是这远远不够,因为有很多点依然没有相连接起来(也就是从起点可能根本就还没有到终点的路线),此时,我们再看看Si的定义,也不难写出0<=Si - Si-1<=1的限制条件,虽然看上去是没有什么意义的条件,但是如果你也把它构造出一系列的边的话,这样从起点到终点的最短路也就顺理成章的出现了。
我们将上面的限制条件写为同意的形式:
Sai-1 - Sbi <= -ci
Si - Si-1 >= 0
Si-1 - Si >= -1
Intervals
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 26017 | Accepted: 9943 |
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<stdio.h>
#include<string.h>
#include<queue>
#define MAX 512345
#define INF 0x3f3f3f3f
using namespace std;
struct Node
{
int v,w,next;
}arr[MAX];
int head[MAX];
bool vis[MAX];
int dis[MAX];
int minx=INF;
int maxx=-INF;
int n;
int cnt;
void Init()
{
memset(head,-1,sizeof(head));
memset(vis,true,sizeof(vis));
memset(dis,INF,sizeof(dis));
cnt=0;
}
void add(int u,int v,int w)
{
arr[cnt].v=v;
arr[cnt].w=w;
arr[cnt].next=head[u];
head[u]=cnt++;
}
void spfa()
{
dis[maxx]=0;
vis[maxx]=false;
queue<int>que;
que.push(maxx);
int temp;
while(!que.empty())
{
temp=que.front();
que.pop();
vis[temp]=true;
for(int i=head[temp];i!=-1;i=arr[i].next)
{
int xxx=dis[temp]+arr[i].w;
if(dis[arr[i].v]>xxx)
{
dis[arr[i].v]=xxx;
if(vis[arr[i].v])
{
vis[arr[i].v]=false;
que.push(arr[i].v);
}
}
}
}
}
int main()
{
Init();
scanf("%d",&n);
int u,v,w;
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(v+1,u,-w);
if(maxx<v+1)
maxx=v+1;
if(minx>u)
minx=u;
}
for(int i=minx;i<maxx;i++)
{
add(i+1,i,0);
add(i,i+1,1);
}
spfa();
printf("%d\n",-dis[minx]);
return 0;
}