现在的位置: 首页 > 综合 > 正文

Poi2001 区间和

2018年01月14日 ⁄ 综合 ⁄ 共 1267字 ⁄ 字号 评论关闭

如有错误,请留言提醒,不要坑到小朋友

Description

有n个给定的闭区间[a(i),b(i)],i=1,2,.....n。这些区间的和也许被另外一个称之为pairwise的不交叉的闭区间集所代表。我们的任务是用最小的区间个数找到这种替代,然后将其按照升序写入输出文件。我们说区间[a,b]与[c,d]符合升序,仅当条件a<=b<c<=d成立。
 
任务 
编写一程序 
1、从文件PRZ.IN中读入此连续区间的描叙; 
2、求出满足以上条件的pairwise非交叉区间集; 
3、求出的区间集按照升序写入文件PRZ.OUT。 

输入 

输入文件的第一行为整数n,它表示区间的个数,3<=n<=50000。在第i+1(1<=i<=n)行的俩个整数a(i)y与b(i)是对区间[a(i),b(i)]的描述,中间用空格隔开,分别表示这个区间的开始和结束,1<=a(i)<=b(i)<=1000000。 

输出 
输出文件应含有所有求出的pairwise非交叉区间集。它的每一行都对应描述着一区间----由俩整数组成,中间用空格隔开,分别表示这个区间的开始和结束。同时,此区间集应是按序写入的。 

样例输入 

5 6 
1 4 
10 10 
6 9 
8 10 

样例输出 
1 4 
5 10 

这题就是裸差分,不解释。。学习差分传送门http://zh.wikipedia.org/wiki/%E5%B7%AE%E5%88%86

#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#define maxn 1100000
using namespace std;
inline int read(){
	int tmp=0;char ch;
	while(ch=getchar())if('0'<=ch&&ch<='9')break;
	for(;'0'<=ch&&ch<='9';ch=getchar())tmp=tmp*10+ch-'0';
	return tmp;
}
int cha[maxn],r,now[maxn],n;
bool cover[maxn],ing;
int main(){
	n=read();
	for(int i=1;i<=n;i++){
		int a=read(),b=read();
		cha[a]+=1;cha[b]-=1;cover[a]=1;
		r=max(b+1,r);
	}
	for(int i=1;i<=r;i++){
		now[i]=now[i-1]+cha[i];
	//	printf("%d %d\n",now[i],i);
	}
	for(int i=1;i<=r;i++)if(now[i-1]&&!now[i])printf("%d\n",i),ing=0;
	else if(!now[i-1]&&now[i])printf("%d ",i),ing=1;
	else if(!ing&&cover[i])printf("%d %d\n",i,i);
//	system("pause");
}

【上篇】
【下篇】

抱歉!评论已关闭.