zoj 1610 Count the Colors(线段树延迟更新)

所谓的懒操作模板题。

学好acm,英语很重要。做题的时候看不明白题目的意思,我还拉着队友一块儿帮忙分析题意。最后确定了是线段树延迟更新果题。我就欣欣然上手敲了出来。

然后是漫长的段错误。。。。

第一次看见这种错误,还不知道什么意思,在那儿瞎改了好久也没过。最后看了下别人的代码,才知道这个题不管给的n是几,建树都是按0~8000建树。。。。

亏我第一次提交之前还跟yyf商量说这道题的n很奇怪,怎么又两个意思。。。。

我的zoj第一题。

#include<stdio.h>
#include<string.h>
#define N 8005
struct node
{
	int x,y;
	int flag;
}a[N*3];
int mark[N];
void CreatTree(int t,int x,int y)
{
	a[t].x=x;
	a[t].y=y;
	a[t].flag=-1;
	if(x==y)
		return ;
	int temp=t*2;
	int mid=(x+y)/2;
	CreatTree(temp,x,mid);
	CreatTree(temp+1,mid+1,y);
	return ;
}
void InsertTree(int t,int x,int y,int k)
{
	if(a[t].x==x&&a[t].y==y)
	{
		a[t].flag=k;
		return ;
	}	
	int temp=t*2;
	int mid=(a[t].x+a[t].y)/2;
	if(a[t].flag!=-1)
	{
		a[temp].flag=a[t].flag;
		a[temp+1].flag=a[t].flag;
		a[t].flag=-1;
	}
	if(y<=mid)
		InsertTree(temp,x,y,k);
	else if(x>mid)
		InsertTree(temp+1,x,y,k);
	else
	{
		InsertTree(temp,x,mid,k);
		InsertTree(temp+1,mid+1,y,k);
	}
	return ;
}
int FindTree(int t,int x)
{
	if(a[t].x==a[t].y)
		return a[t].flag;
	int temp=t*2;
	int mid=(a[t].x+a[t].y)/2;
	if(a[t].flag!=-1)
	{
		a[temp].flag=a[t].flag;
		a[temp+1].flag=a[t].flag;
		a[t].flag=-1;
	}
	
	if(x<=mid)
		return FindTree(temp,x);
	else
		return FindTree(temp+1,x);
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		CreatTree(1,1,8001);
		int i;
		for(i=1;i<=n;i++)
		{
			int x,y,k;
			scanf("%d%d%d",&x,&y,&k);
			int temp;
			if(x>y)
			{
				temp=x;
				x=y;
				y=temp;
			}
			x++;
			InsertTree(1,x,y,k);
		}
		memset(mark,0,sizeof(mark));
		int t=-1;
		for(i=1;i<=8001;i++)
		{
			int temp;
			temp=FindTree(1,i);
			if(temp==t)
				continue;
			else if(temp!=t&&temp!=-1)
				mark[temp]++;
			t=temp;
		}
		for(i=0;i<=8001;i++)
		{
			if(mark[i]!=0)
				printf("%d %d
",i,mark[i]);
		}
		printf("
");
	}
	return 0;
}


原文地址:https://www.cnblogs.com/jiangu66/p/3202787.html