hdu1556

/*
分析:
    TLE了,改好了头有点儿疼,就睡了,醒的时候提交,ac了- -。
(如果先提交,在睡觉,会不会做个美梦呢~)


    两种方法,一种自然就是线段树了,不详细说了;而另一种呢,
从别人那儿学来的,很巧妙哦~,代码贴下面了,不解释,细细品味
O(∩_∩)O~



                                                 2012-07-07
*/






线段树:
#include"stdio.h"
#include"string.h"


struct segtree
{
	int l,r;
	int mid;
	int count;
}T[300011];


void construct(int l,int r,int k)
{
	T[k].l=l;
	T[k].r=r; 
	T[k].mid=(l+r)>>1;
	T[k].count=0;


	if(l==r)	return ;


	construct(l,T[k].mid,2*k);
	construct(T[k].mid+1,r,2*k+1);
}


void insert(int l,int r,int k)
{
	if(T[k].l==l&&T[k].r==r)	{T[k].count++;return ;}


	if(r<=T[k].mid)		insert(l,r,2*k);
	else if(l>T[k].mid)	insert(l,r,2*k+1);
	else
	{
		insert(l,T[k].mid,2*k);
		insert(T[k].mid+1,r,2*k+1);
	}
}


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


	if(T[k].l==T[k].r&&T[k].l==d)	return ;


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


int main()
{
	int n;
	int i;
	int a,b;


	while(scanf("%d",&n),n)
	{
		construct(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"
int main()
{
    int j,n,i,a,m,b;
    while(scanf("%d",&n),n)
    {
        int c[100001]={0};
        j=n,m=0;
        while(j--)
        {
            scanf("%d %d",&a,&b);
            c[a]++,c[b+1]--;
        }
        for(i=1;i<n;i++)
        {
            m+=c[i];
            printf("%d ",m);
        }
        printf("%d\n",m+c[n]);
    }
    return 0;
}


你可能感兴趣的:(c,search,ini,insert)