hdu 1556(线段树)

点击打开链接


自己的第一个线段树。。。

按小boss写的。。。


#include"stdio.h"
#include"string.h"
#include"stdlib.h"
struct tree
{
	int x,y,mid;
	int count;
}A[300001];

void creat(int x,int y,int k)
{
	A[k].x=x;
	A[k].y=y;
	A[k].mid=(x+y)/2;
	A[k].count=0;
	if(x==y)return ;
	creat(x,A[k].mid,2*k);
	creat(A[k].mid+1,y,2*k+1);
}

void insert(int x,int y,int k)
{
	if(A[k].x==x&&A[k].y==y)
	{
		A[k].count++;return;
	}

	if(x>A[k].mid)insert(x,y,2*k+1);
	else if(y<=A[k].mid)insert(x,y,2*k);
	else
	{
		insert(x,A[k].mid,2*k);
		insert(A[k].mid+1,y,2*k+1);
	}
	
}

int ans;
void search(int t,int k)
{
	ans+=A[k].count;

	if(A[k].x==A[k].y&&A[k].x==t)return ;

	if(t<=A[k].mid)search(t,2*k);
	else search(t,2*k+1);
}

int main()
{
	int n,i;
	int a,b;
	while(scanf("%d",&n)!=-1&&n)
	{
		creat(1,n,1);
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&a,&b);
			insert(a,b,1);
		}
		for(i=1;i<n;i++)
		{
			ans=0;
			search(i,1);
			printf("%d ",ans);
		}
		ans=0;
		search(i,1);
		printf("%d\n",ans);
	}
	return 0;
}

非线段树,大神啊!


#include"stdio.h"
#include"string.h"
int main()
{
    int n;
    int a,b,m,i;
    int A[100001];
    while(scanf("%d",&n)!=-1&&n)
    {
        memset(A,0,sizeof(A));
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            A[a]++;A[b+1]--;
        }
        m=0;
        for(i=1;i<n;i++)
        {
            m+=A[i];
            printf("%d ",m);
        }
        printf("%d\n",m+A[n]);
    }
    return 0;
}




你可能感兴趣的:(线段树,HDU)