• 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;
    }


  • 相关阅读:
    Spring Bean的生命周期
    使用docker安装虚拟机并打开ssh连接
    查看/设置JVM使用的垃圾收集器
    使用Apollo动态修改线上数据源
    java8之lambda表达式
    Java8之Stream
    @Bean 的用法
    Java中的Filter过滤器
    详解tomcat的连接数与线程池
    什么是ClassLoader
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3202787.html
Copyright © 2020-2023  润新知