posts - 0,comments - 0,trackbacks - 0

线段树或者树状数组,我一开始拿每个点被染的次数建树,结果超时0.04STAT,后来参照大牛的题解,按照每个区间被经过的次数记数,AC。

#include<stdio.h>
typedef 
struct treetype
{
  
long l,r,count;
}treetype;
treetype tree[
100000];
long n,i,a,b,max,x;
long ans[100000];
long v[20000];
void maketree(long i,long l,long r)
{
  
long mid;
  
if (l==r)
  {
    tree[i].l
=tree[i].r=l;
    tree[i].count
=0;
    
return;
  }
  mid
=(l+r)/2;
  tree[i].l
=l;
  tree[i].r
=r;
  tree[i].count
=0;
  maketree(i
*2,l,mid);
  maketree(i
*2+1,mid+1,r);
}
void insert(long i,long a,long b,long z)
{
  
long l,r,mid;
  l
=tree[i].l;r=tree[i].r;
  
if (z!=-1)
    tree[i].count
=z;
  
if (l==&& r==b)
  {
    
if (tree[i].count!=-1)
      {
        
if (x==a)
          ans[tree[i].count]
++;
        tree[i].count
+=1;
        
return;
      }
  }
  mid
=(l+r)/2;z=tree[i].count;
  
if (b<=mid)
  {
    insert(i
*2,a,b,z);
    
if (z!=-1)
      tree[i
*2+1].count=z;
  }
  
else if (a>mid)
  {
    insert(i
*2+1,a,b,z);
    
if (z!=-1)
      tree[i
*2].count=z;
  }
  
else
  {
    insert(i
*2,a,mid,z);
    insert(i
*2+1,mid+1,b,z);
  }
  
if (tree[i*2].count==-1 || tree[i*2+1].count==-1)
    tree[i].count
=-1;
  
else if (tree[i*2].count==tree[i*2+1].count)
    tree[i].count
=tree[i*2].count;
  
else 
    tree[i].count
=-1;
}
int main()
{
  scanf(
"%ld",&n);
  
for (i=1;i<=n;i++)
  {
    scanf(
"%ld %ld",&v[i],&b);
    
if (max<v[i])
      max
=v[i];
  }
  maketree(
1,0,max);
  
for (i=1;i<=n;i++)
  {
    x
=v[i];
    insert(
1,v[i],max,tree[1].count);
  }
  
for (i=0;i<=n-1;i++)
    printf(
"%ld\n",ans[i]);
}

 

posted on 2011-07-05 22:51 梦转千寻 阅读(156) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理