HDOJ 题目1384 Intervals(差分约束)
2015-01-15 00:03
369 查看
Intervals
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3029 Accepted Submission(s): 1117
Problem 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 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
Author
1384
Recommend
Eddy | We have carefully selected several similar problems for you: 1529 1534 1535 3592 3666
题目大意:
在每个区间[ai,bi]上至少选择ci个元素,构成一个集合S,使集合S中的元素最少;
分析:f(a) 表示在区间 [0,a] 上选择了一些元素;
则:f(b)-f(a-1)>=ci;
0<=f(a)-f(a-1)<=1;
ac代码
#include<stdio.h> #include<string.h> #include<string> #include<queue> #include<iostream> #define INF 0xfffffff using namespace std; int head[500500],vis[500500],dis[500500],id,l,r; struct s { int to,w,next; }node[500050]; void add(int u,int v,int w) { node[id].w=w; node[id].to=v; node[id].next=head[u]; head[u]=id++; } void spfa() { int i,u,v; queue<int>q; for(i=l;i<=r;i++) { dis[i]=INF; vis[i]=0; } q.push(r); dis[r]=0; vis[r]=1; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(i=head[u];i!=-1;i=node[i].next) { int v=node[i].to; int temp=dis[u]+node[i].w; if(temp<dis[v]) { dis[v]=temp; if(!vis[v]) { q.push(v); vis[v]=1; } } } } } int main() { int n; while(scanf("%d",&n)!=EOF) { int i; l=INF; r=0; memset(head,-1,sizeof(head)); id=0; for(i=0;i<n;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(b+1,a,-c); if(a<l) l=a; if(b>r) r=b; } r++; for(i=l;i<r;i++) { add(i+1,i,0); add(i,i+1,1); } spfa(); printf("%d\n",-dis[l]); } }
相关文章推荐
- hdoj 1384 Intervals 【差分约束基础题目】
- 【差分约束】 HDOJ 1384 Intervals
- hdoj--1384--Intervals(差分约束)
- hdoj--1384--Intervals(差分约束)
- hdu 1384 Intervals (差分约束)
- HDU 1384 Intervals (差分约束)
- 差分约束详解,详解!!!hdoj 1384
- hdu 1384 Intervals (差分约束)
- HDOJ 题目1531King(差分约束)
- HDU 1384 Intervals 差分约束
- HDU 1384 && POJ 1201--Intervals 【基础差分约束】
- HDU 1384 Intervals(差分约束)
- HDOJ题目3440 House Man(差分约束)
- HDOJ题目3440 House Man(差分约束)
- hdu 1384 Intervals (差分约束)
- HDU 1384 Intervals 差分约束
- hdu 1384 Intervals (差分约束)
- hdu 1384 Intervals 差分约束 解题报告
- HDU 1384 Intervals【差分约束-SPFA】
- Hdu1384-Intervals(差分约束)