题目链接:http://poj.org/problem?id=2528

来一点转的线段树精髓:

1、 线段树是二叉树,且必定是平衡二叉树,但不一定是完全二叉树。

2、 对于区间[a,b],令mid=(a+b)/2,则其左子树为[a,mid],右子树为[mid+1,b],当a==b时,该区间为线段树的叶子,无需继续往下划分。

3、 线段树虽然不是完全二叉树,但是可以用完全二叉树的方式去构造并存储它,只是最后一层可能存在某些叶子与叶子之间出现“空叶子”,这个无需理会,同样给空叶子按顺序编号,在遍历线段树时当判断到a==b时就认为到了叶子,“空叶子”永远也不会遍历到。

4、 之所以要用完全二叉树的方式去存储线段树,是为了提高在插入线段和搜索时的效率。用p*2,p*2+1的索引方式检索p的左右子树要比指针快得多。

5、线段树的精髓是,能不往下搜索,就不要往下搜索,尽可能利用子树的根的信息去获取整棵子树的信息。如果在插入线段或检索特征值时,每次都非要搜索到叶子,还不如直接建一棵普通树更来得方便。

主动思考,一开始用简单hash判断染色,可自己总是扯不上线段树去。

后来明白了思路,每次判断染色时便把左右区间修改为i(即第几次修改..)   【显然这样才能利用线段树的优势啊】

可离散化又出了点问题,学到一招用二分离散化,自己以前学到的那个离散化就是排好序后分别赋值i++,可距离大于1的时候+1就不好处理了,

顺便看ACRush以及别人的各种回忆录,以及在暑假做的某些题,二分或者二分的思路真的应用非常非常广,OK!

在我看来线段最精髓的地方就是pushdown,只有在查询或Update有交集的时候才会更新。。

还有一个很重要的地方就是数组开的大小,为确保自己在内存允许的情况尽量开大。

自己分析的时候难免有错。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
const int maxn=11111;
int col[maxn*16];//这地方必须乘的系数得万分注意
int li[maxn<<2];
int ri[maxn<<2];
bool hash[maxn<<2];//..
int ans=0;
int x[maxn<<2];
int y[maxn<<2];
void Pushdown(int rt)
{
if(col[rt]!=-1)
{
col[rt<<1]=col[rt<<1|1]=col[rt];
col[rt]=-1;
}
}
void update(int ql,int qr,int ch,int rt,int l,int r)
{
if(ql<=l&&qr>=r)
{
col[rt]=ch;
return;
}
Pushdown(rt);
int m=(l+r)>>1;
if(ql<=m)
update(ql,qr,ch,lson);
if(qr>m)
update(ql,qr,ch,rson);
}
void query(int ql,int qr,int rt,int l,int r)
{
if(col[rt]!=-1)
{
if(hash[col[rt]]==false)//曾错在这地方 一种颜色的统计一次就够了。
{
ans++;
hash[col[rt]]=true;
}
col[rt]=-1;
return;
}
if(l==r) return;//要这一步其实是必须的 特殊情况是考虑分叉
Pushdown(rt);//这一步应该有或没有都能AC。
int m=(l+r)>>1;
if(ql<=m)
query(ql,qr,lson);
if(qr>m)
query(ql,qr,rson);
}
int Bin(int ans,int x[],int l,int r)
{
while(l<r)
{
int m=(l+r)>>1;
if(x[m]==ans)
return m;
if(ans<=x[m])
r=m-1;
else l=m+1;
}
return l;
}
int main()
{
int case_num;
scanf("%d",&case_num);
while(case_num--)
{
ans=0;
memset(col,-1,sizeof(col));
memset(hash,false,sizeof(hash));
int n;
scanf("%d",&n);
int cnt=1;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&li[i],&ri[i]);
x[cnt++]=li[i];
x[cnt++]=ri[i];
}
//离散化。 应该又学到一招  不一定靠id 使用二分
sort(x+1,x+cnt);
int mm=cnt;
for(int i=2;i<cnt;i++)
{
if((x[i]-x[i-1])>1)
x[mm++]=x[i-1]++;
}
sort(x+1,x+mm);
int tt=2;
y[1]=x[1];
for(int i=2;i<mm;i++)
{
if(x[i]!=x[i-1])
y[tt++]=x[i];
}
for(int i=1;i<=n;i++)
{
int l=Bin(li[i],y,1,tt-1);
int r=Bin(ri[i],y,1,tt-1);
update(l,r,i,1,1,tt-1);
}
query(1,tt-1,1,1,tt-1);
printf("%d\n",ans);
}
return 0;
}

POJ2528【线段树经典染色。】相关推荐

  1. poj-2528线段树练习

    title: poj-2528线段树练习 date: 2018-10-13 13:45:09 tags: acm 刷题 categories: ACM-线段树 概述 这道题坑了我好久啊啊啊啊,,,, ...

  2. 线段树区间染色 浮水法 学习小记 Poj 2777 + Poj 2528

    复习过的东西必须时常拿来练练,虽说都是水题.... Poj 2777 典型的区间染色问题,貌似我的写法为了不数组越界必须多开一倍的数组空间.....还没有想到解决方法,有机会参考一下别人的写法. Po ...

  3. [ACM] 线段树经典题

    POJ 2528 Mayor's posters m次区间染色,每次染色使用的颜色都不同,颜色可以覆盖,最后询问颜色数量,区间大小n为1e7,m为1e4. 做法一: 使用线段树,区间染色时间复杂度O( ...

  4. 线段树 (经典题目合集)

    目录 1.子段乘积 P3372 [模板]线段树 1(加法线段树) P3373 [模板]线段树 2(乘法线段树) P4145 上帝造题的七分钟2 / 花神游历各国(根号线段树) 1.子段乘积 直接暴力做 ...

  5. poj 2777(线段树+区间染色)

    解题思路:这道题利用了线段树+位运算的思想,由于颜色的种类只有30种,所以int可以存下来,所以我们在线段树的节点里面加上status的状态信息,表示这段区间内的颜色信息,而且我们可以知道,父节点的s ...

  6. POJ2528 线段树+离散化+hash(成段更新)

    题目:Mayor's posters 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要的值来用, ...

  7. poj 2528 线段树离散化+染色

    题目链接 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 92628 Accepted: 2645 ...

  8. poj 2777 Count Color(线段树区区+染色问题)

    题目链接:  poj 2777 Count Color 题目大意:  给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C  a  b  c 把区间[a,b]涂为c色,P  a  b 查 ...

  9. POJ2155 Matrix二维线段树经典题

    题目链接 二维树状数组 1 #include<iostream> 2 #include<math.h> 3 #include<algorithm> 4 #inclu ...

最新文章

  1. Android WebView与ViewPager的滑动冲突分析
  2. 单调谐回路谐振放大器等效电路分析_手把手教你如何分析三极管电路
  3. 基于JAVA+Servlet+JSP+MYSQL的网上心理咨询系统
  4. java 经典免费教程下载
  5. (转)李嘉诚:成功源于花90%时间考虑失败
  6. linux 软件查询,linux安装常用软件和查询基本信息
  7. 如何从Unity商店下载资源?
  8. 吾爱破解专用虚拟机系统不能安装VMwaretools问题!
  9. 从BIM行业看中国工业软件的困境及出路
  10. 《第一篇》二进制部署高可用K8S集群v1.24.2及运维(亲测无坑)
  11. 存储和多屏互动,蜂鸟网的NAS应用解析
  12. 任强-京东智能云服务平台
  13. 微信小程序踩坑指南--回填再造
  14. Spark中广播变量(boardcast)的使用
  15. 到底要怎么做,才能不堵车?
  16. 【uniapp】如何设置单个页面背景颜色
  17. 用SSI设计组合逻辑红绿灯控制电路
  18. html5网页制作实训日志,网页制作实训日志X.doc
  19. 掌上微博android源代码,掌上微博 全能手机
  20. Swift - 第三方图表库Charts使用详解23(雷达图)

热门文章

  1. 首只互联网大数据基因指数发布
  2. 初学者必读VRay 2.0材质设置(7)——使用双面材质
  3. web前端-JavaScript流程控制语句(条件判断,条件分支和循环语句)
  4. CXL Bias Mode (2) - 实现 Bias Mode 的要求
  5. 企业面试题:一个三个数的式子,移动其中一根火柴,使等式成立,用程序或实现(可以用伪码),输出能成立的等式。
  6. 手机九宫格滑锁密码的所有密码组合计算
  7. 大数据里细看苏州旅游新变化
  8. css+动画优化,css3动画性能优化--针对移动端卡顿问题
  9. 有道词典命令行查询工具(Mac/Ubuntu)
  10. 51单片机-1602液晶显示的时钟代码