POJ 2528 (线段树+离散化)

题意:在墙上贴海报,给出每次所贴的区间,问最后能看到几张海报。
思路:线段树,但是所给区间长度最大为1000000,必须离散化处理。
离散化:把所有点按序排列; 去掉重复的点;给间隔大于一的两数之间添加一个数(避免错误);排序;查找出左右区间的位置(即离散化后所对应的数值)
线段树:用模板即可解决(一个变量名写错,调试了一中午,呜呜~~温温好失败)

AC代码:
#include 
#include 
#include 
#include 
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define maxx 10005
int x[maxx<<2],col[maxx<<4],li[maxx],ri[maxx];
bool flag[maxx];
int n,m,ans;
int Bsearch(int key)
{
  int left=0,right=m-1,mid;
  while(left<=right)
  {
   mid=(left+right)>>1;
   if(x[mid]==key) return mid;
   if(x[mid]=r)
  {
    col[rt]=c;
    return;
  }
  pushdown(rt);
  int mid=(l+r)>>1;
  if(left<=mid)
  update(left,right,c,lson);
  if(right>mid)
  update(left,right,c,rson);
}
void query(int l,int r,int rt)
{
   if(col[rt]!=-1)
   {
     if(!flag[col[rt]])
     ans++;
     flag[col[rt]]=1;
     return;
   }
   if(l==r) return;
   int mid=(l+r)>>1;
   query(lson);
   query(rson);
}
int main()
{
  int t;
  scanf("%d",&t);
  while(t--)
  {
	ans=0;
	memset(col,-1,sizeof(col));
	memset(flag,0,sizeof(flag));
    scanf("%d",&n);
    for(int i=0;i=0;i--)
  {
   if(x[i]!=(x[i-1]+1))
   x[m++]=x[i-1]+1;
  }
  sort(x,x+m);

  for(int i=0;i




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