hdoj1384Intervals【差分约束】
2015-12-31 10:39
295 查看
Intervals
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3556 Accepted Submission(s): 1303
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
题意:给定多个区间[a,b]存在一个集合A在区间[a,b]内至少有c个数在集合A中求A中最少有多少个元素;
设S[i]为集合A在区间0到i中的元素个数则有题意知有在区间[a,b]对集合S中则满足S[b]-S[a-1]>=c;另有0=<S[i]-S[i-1]<=1;
既有S[a-1]-S[b]<=-c;S[i-1]-S[i]<=0;S[i]-S[i-1]<=1;
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #define inf 0x3f3f3f3f using namespace std; const int maxn=50010; struct Node{ int from,to,value; int next; }A[maxn<<2]; int dist[maxn]; bool vis[maxn]; int head[maxn],node; void init(){ node=0; memset(vis,false,sizeof(vis)); memset(head,-1,sizeof(head)); memset(dist,0x3f,sizeof(dist)); } void add(int u,int v,int value){ A[node].from=u; A[node].to=v; A[node].value=value; A[node].next=head[u]; head[u]=node++; } int spfa(int minl,int maxr){ int i,j,k,u; queue<int>Q; dist[maxr]=0; vis[maxr]=true; Q.push(maxr); while(!Q.empty()){ u=Q.front();Q.pop();vis[u]=false; for(k=head[u];k!=-1;k=A[k].next){ int v=A[k].to; if(dist[v]>dist[u]+A[k].value){ dist[v]=dist[u]+A[k].value; if(!vis[v]){ vis[v]=true; Q.push(v); } } } } return -dist[minl-1]; } int main() { int n,i,j,k; while(scanf("%d",&n)!=EOF){ int a,b,c;init(); int minl=inf,maxr=0; for(i=0;i<n;++i){ scanf("%d%d%d",&a,&b,&c); add(b,a-1,-c); minl=min(minl,a); maxr=max(maxr,b); } for(i=minl;i<=maxr;++i){ add(i-1,i,1); add(i,i-1,0); } printf("%d\n",spfa(minl,maxr)); } return 0; }
相关文章推荐
- Redis主从复制安全性
- JAVA线程间协作:wait.notify.notifyAll
- Mac环境下使用android studio jni基础
- JAVA线程间协作:wait.notify.notifyAll
- 首篇博客
- 中文字符串转为long型整数。(输入保证在long的范围内)java实现
- 远程删除FTP端文件
- SpringMVC从Control中响应json数据
- 处理Service的onStartCommand返回值
- android ScrollView滑动时出现的阴影如何去除
- DNS服务器简单架设测试
- Keil4 每次选build 编译(F7)都全部编译的解决办法
- Yii操作cookie
- python socket编程详细介绍
- iOS中Block代码块的使用
- OC 与JS(WebView)交互
- linux内核驱动02-module param
- 使用libpcap库的多线程问题
- 乐视第4代超级电视引领行业风向标
- 上传文件 nginx 413错误