您的位置:首页 > 其它

Zoj 3581 离散化

2011-07-25 15:40 239 查看
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4383
题意很简单:有两根一样长(1000W)的绳子,第一条绳子有n1(10W)个区间的缺陷,第二条绳子有n2(10W)个区间的缺陷,两条绳子粘在一起,求只有一次缺陷的最长区间~
比赛的时候分析直接暴力肯定会超时 O_O,然后觉得肯定要用线段树+离散化,可惜线段树不会写,于是放弃了*_*赛后别人说纯暴力就能过,还不信,特地去写了一下。

#include<stdio.h>
#include<string.h>
const int MAXN = 10000001;
int flag[MAXN];
int max_len(int n)
{
int re =0,num;
for(int i=0;i<n;)
{
num = 0;
while(flag[i]==1)
{
num++;
i++;
}
if(num>re)
re = num;
i++;
}
return re;
}
int main()
{
int n,n1,n2,x,y;
while(scanf("%d%d%d",&n,&n1,&n2)!=EOF)
{
memset(flag,0,sizeof(flag));
int t = n1+n2;
for(int i=0;i<t;i++)
{
scanf("%d%d",&x,&y);
for(int j=x;j<=y;j++)
flag[j]++;
}
printf("%d\n",max_len(n));
}
return 0;
}
其实仔细分析了一下,若数据保证输入的区间不会重复的话,赋值+查找最多复杂度也才是3000W,额。。当时傻了。。
直接暴力交了之后是600ms,于是觉得可以离散化。时间是300多。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=100001;
struct node
{
int x,y;
}oo[2*maxn],que[4*maxn];
int tt[4*maxn],flag[4*maxn];
int deal(int n)
{
int i,re=0;
que[re].x = tt[0];
que[re++].y = tt[0];
for(i=1;i<n;i++)
{
if(tt[i]-tt[i-1]>1)
{
que[re].x = tt[i-1] + 1;
que[re++].y = tt[i] -1;
}
que[re].x = tt[i];
que[re++].y = tt[i];
}
return re;
}
int search(int val,int len)
{
int l,r,mid;
l = 0;
r = len;
while(l<=r)
{
mid = ((l+r)>>1);
if(que[mid].x == val)
return mid;
else if(que[mid].x >val)
r = mid - 1;
else
l = mid + 1;
}
return -1;
}
void sum(int a)
{
int i,re=0,num;
for(i=0;i<a;)
{
num = 0;
while(flag[i] == 1)
{
num += (que[i].y - que[i].x +1);
i++;
}
if(num>re)
re = num;
i++;
}
printf("%d\n",re);
}
int main()
{
int m,n1,n2,i,num;
while(scanf("%d%d%d",&m,&n1,&n2)!=EOF)
{
int tmp = n1+n2;
num=0;
for(i=0;i<tmp;i++)
{
scanf("%d%d",&oo[i].x,&oo[i].y);
tt[num++] = oo[i].x;
tt[num++] = oo[i].y;
}
sort(tt,tt+num);
int cnt = unique(tt,tt+num)-tt;//tt中不相同点的个数
int a = deal(cnt);//对tt中的点进行坐标离散化后区间个数
memset(flag,false,sizeof(flag));
for(i=0;i<tmp;i++)//赋值
{
int l = search(oo[i].x,a);
int r = search(oo[i].y,a);
for(int j=l;j<=r;j++)
flag[j]++;
}
sum(a);//统计
}
return 0;
}
其实我觉得若是没有那个区间不重复的条件的话,这两种方法应该都会超,队员写了线段树+离散化,一直MLE,可能写搓了,求线段树+离散化!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: