Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

路过的大牛帮忙看下,如何优化···

Posted by angeldust at 2012-03-24 21:54:45 on Problem 3695
暴力1400MS+,二维线段树死活TLE,优化了一下午还是TLE.暴力代码在HDU上跑800多MS,二维线段树在HDU上面交是1200MS+,所以这边跑的话预估时间是2500MS左右。实在是不知道怎么优化了,先贴TLE的码放着,以后有空再回来继续优化

#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <map>
#include <string>
#include <string.h>
#include <queue>
#include <set>
using namespace std;
const int N=39;
const int BGCOLOR=1<<20;
int mpy[40],mpx[40],ans[BGCOLOR];
pair<int,int> a[40];
int Y,X,X1,X2,Yidx,Xidx,mask;
struct rectangles
{
	pair<int,int> p1,p2;
}rec[20];
struct node
{
	int color1,has1,color2[2*N-1],has2[2*N-1];
}tree[2*N-1],*p;
int inline getidx(int s,int t)
{
	return s+t|s!=t;
}
bool inline cmp(const pair<double,int> &a,const pair<double,int> &b)
{
	return a.first<b.first;
}
void OperateX(int l,int r,int s,int t)
{
	int nowidx=getidx(l,r);
	p->has2[nowidx]|=mask;
	if(l==s&&r==t)
	{
		p->color2[nowidx]|=mask;
		return;
	}
	int mid=l+r>>1;
	if(p->color2[nowidx]&BGCOLOR)
	{
		int lch=getidx(l,mid),rch=getidx(mid+1,r);
		p->color2[lch]=p->color2[rch]=BGCOLOR;
		p->color2[nowidx]-=BGCOLOR;
		p->has2[lch]=p->has2[rch]=0;
	}
	if(s<=mid)
	{
		if(t<=mid) OperateX(l,mid,s,t);
		else
		{
			OperateX(l,mid,s,mid);
			OperateX(mid+1,r,mid+1,t);
		}
	}
	else OperateX(mid+1,r,s,t);
}
void OperateY(int l,int r,int s,int t)
{
	int nowidx=getidx(l,r);
	tree[nowidx].has1|=mask;
	if(l==s&&r==t)
	{
		if(tree[nowidx].color1>0)
		{
			if(tree[nowidx].color1==BGCOLOR) tree[nowidx].color1=mask;
			else tree[nowidx].color1|=mask;
			p=&tree[nowidx];
			OperateX(0,X-1,X1,X2);
			return;
		}
	}
	int mid=l+r>>1;
	if(tree[nowidx].color1>0)
	{
		int lch=getidx(l,mid),rch=getidx(mid+1,r);
		if(tree[nowidx].color1!=BGCOLOR)
		{
			memcpy(tree[lch].color2,tree[nowidx].color2,2*X-1<<2);
			memcpy(tree[rch].color2,tree[nowidx].color2,2*X-1<<2);
			memcpy(tree[lch].has2,tree[nowidx].has2,2*X-1<<2);
			memcpy(tree[rch].has2,tree[nowidx].has2,2*X-1<<2);
			tree[lch].has1=tree[rch].has1=tree[nowidx].has1;
		}
		else
		{
			tree[lch].color2[Xidx]=tree[rch].color2[Xidx]=BGCOLOR;
			tree[lch].has1=tree[rch].has1=tree[lch].has2[Xidx]=tree[rch].has2[Xidx]=0;
		}
		tree[lch].color1=tree[rch].color1=tree[nowidx].color1;
		tree[nowidx].color1=0;
	}
	if(s<=mid)
	{
		if(t<=mid) OperateY(l,mid,s,t);
		else
		{
			OperateY(l,mid,s,mid);
			OperateY(mid+1,r,mid+1,t);
		}
	}
	else OperateY(mid+1,r,s,t);
}
int QueryX(int l,int r)
{
	int nowidx=getidx(l,r);
	if(!(p->has2[nowidx]&mask)) return 0;
	if(p->color2[nowidx]&mask) return mpx[r+1]-mpx[l];
	int mid=l+r>>1;
	return QueryX(l,mid)+QueryX(mid+1,r);
}
int QueryY(int l,int r)
{
	int nowidx=getidx(l,r);
	if(!(tree[nowidx].has1&mask)) return 0;
	if(tree[nowidx].color1>0)
	{    
		p=&tree[nowidx];
		return (mpy[r+1]-mpy[l])*QueryX(0,X-1);
	}
	int mid=l+r>>1;
	return QueryY(l,mid)+QueryY(mid+1,r);
}
int main()
{
	int n,m,cas=0,tmp;
	while(scanf("%d %d",&n,&m)&&n)
	{
		for(int i=0;i<n;i++)
		{
			scanf("%d %d %d %d",&a[i].first,&mpy[i],&a[i+n].first,&mpy[i+n]);
			a[i].second=i+1; a[i+n].second=-i-1;
		}
		sort(a,a+2*n,cmp);
		X=1; mpx[0]=a[0].first;
		for(int i=0;i<n<<1;i++)
		{
			if(a[i].first!=mpx[X-1]) mpx[X++]=a[i].first;
			if(a[i].second>0) rec[a[i].second-1].p1.first=X-1;
			else rec[-a[i].second-1].p2.first=X-2;
		}
		for(int i=0;i<n;i++)
		{
			a[i].first=mpy[i]; a[i+n].first=mpy[i+n];
			a[i].second=i+1; a[i+n].second=-i-1;
		}
		sort(a,a+2*n,cmp);
		Y=1; mpy[0]=a[0].first;
		for(int i=0;i<n<<1;i++)
		{
			if(a[i].first!=mpy[Y-1]) mpy[Y++]=a[i].first;
			if(a[i].second>0) rec[a[i].second-1].p1.second=Y-1;
			else rec[-a[i].second-1].p2.second=Y-2;
		}
		X--; Y--;
		Yidx=getidx(0,Y-1);
		tree[Yidx].color1=BGCOLOR;
		tree[Yidx].has1=0;
		Xidx=getidx(0,X-1);
		tree[Yidx].color2[Xidx]=BGCOLOR;
		tree[Yidx].has2[Xidx]=0;
		mask=1;
		for(int i=0;i<n;i++)
		{
			X1=rec[i].p1.first;
			X2=rec[i].p2.first;
			OperateY(0,Y-1,rec[i].p1.second,rec[i].p2.second);
			mask<<=1;
		}
		memset(ans,0,1<<n+2);
		printf("Case %d:\n",++cas);
		for(int i=1;i<=m;i++)
		{
			scanf("%d",&n);
			mask=0;
			while(n--)
			{
				scanf("%d",&tmp);
				mask|=1<<tmp-1;
			}
			if(!ans[mask]) ans[mask]=QueryY(0,Y-1);
			printf("Query %d: %d\n",i,ans[mask]);
		}
		putchar('\n');
	}
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator