博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SSL-ZYC 2645 线段树练习题二
阅读量:5300 次
发布时间:2019-06-14

本文共 1681 字,大约阅读时间需要 5 分钟。

题目大意:

从左往右,从前往后给出n条颜色不同的线段,求最后能看见的线段数量。


思路:

线段树

tree[x]的用处与 的用处基本相同,但是tree[x].cover表示的是tree[x].l与tree[x].r之间的线段颜色(没有线段或有多种颜色就为0)

代码的区别就在于插入,建树和计算基本没变化。


代码:

#include 
#include
using namespace std;int n,m,color[300001],x,y,sum;struct N{ int l,r,cover;}tree[300001];void make(int x) //建树{ if (tree[x].r-tree[x].l<=1) return; tree[x*2].l=tree[x].l; tree[x*2].r=(tree[x].l+tree[x].r)/2; tree[x*2+1].l=(tree[x].l+tree[x].r)/2; tree[x*2+1].r=tree[x].r; make(x*2); make(x*2+1);}void insert(int x,int col,int l,int r){ if (tree[x].cover==col) return; //这一段已经是要涂的颜色就退出,不必再涂。 if (l==tree[x].l&&r==tree[x].r) //找到这一段 { tree[x].cover=col; return; } if (tree[x].cover>0) //这一段已经涂了其他颜色 { tree[x*2].cover=tree[x*2+1].cover=tree[x].cover; //儿子的颜色为该段的颜色 tree[x].cover=0; //这段有多种颜色,赋值为0 } int mid=(tree[x].l+tree[x].r)/2; if (mid>=r) //完全在左边 { insert(x*2,col,l,r); return; } if (mid<=l) //完全在右边 { insert(x*2+1,col,l,r); return; } insert(x*2,col,l,mid); insert(x*2+1,col,mid,r); //两边都有} void count(int x){ if (tree[x].cover>0&&color[tree[x].cover]==0) //没有计算过这种颜色 { color[tree[x].cover]=1; sum++; return; } if (tree[x].cover>0) return; if (tree[x].r<=tree[x].l+1) return; count(x*2); count(x*2+1);}int main(){ scanf("%d%d",&m,&n); tree[1].l=1; tree[1].r=m; make(1); //建树 for (int i=1;i<=n;i++) { scanf("%d%d",&x,&y); insert(1,i,x,y); //插入 } count(1); printf("%d\n",sum); return 0;}

转载于:https://www.cnblogs.com/hello-tomorrow/p/9313070.html

你可能感兴趣的文章
LINQ 入门
查看>>
不变集合 NSSet
查看>>
标准C程序设计七---54
查看>>
《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---47
查看>>
Hibernate=====HQL实用技术
查看>>
Silverlight中使用MVVM(3)
查看>>
oracle 11g空表导不出问题
查看>>
phpstudy 下开启openssl
查看>>
spring源码下载及转入ECLIPSE
查看>>
JavaScript学习
查看>>
haproxy实现mysql slave负载均衡
查看>>
Ansible基础配置与常用模块使用
查看>>
C++中的inLine函数
查看>>
Linux内存管理
查看>>
Trie树-可持久化
查看>>
用C#读取txt文件的方法(转)
查看>>
python note 08 文件操作
查看>>
[机器学习]回归--Decision Tree Regression
查看>>
Direct2D教程(外篇)环境配置
查看>>
2016-10-14
查看>>