博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树之离散化
阅读量:5129 次
发布时间:2019-06-13

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

离散化是将有用的信息提取出来,在区间很大的时候,用直接用线段树肯定会超时,但由于在区间内很大值是没有用到的,只把有用的区间提取出来再用线段数做就方便多了。

1 #include 
2 #include
3 #include
4 #include
5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 using namespace std; 8 const int MAX = 11111; 9 int col[MAX<<4],li[MAX],ri[MAX],x[MAX*3],ans;10 bool hash[MAX];11 void PushDown(int rt){12 if(col[rt] != -1){13 col[rt<<1] = col[rt<<1|1] = col[rt];14 col[rt] = -1;15 }16 }17 void update(int LL, int RR, int c, int l, int r, int rt){18 if(LL <= l && r <= RR){19 col[rt] = c;20 return;21 }22 PushDown(rt);23 int m = (l+r)>>1;24 if(LL <= m)update(LL,RR,c,lson);25 if(m < RR) update(LL,RR,c,rson);26 }27 void query(int l, int r, int rt){28 if(col[rt] != -1){29 if(!hash[col[rt]])ans++;30 hash[col[rt]] = true;31 return;32 }33 if(l == r)return;34 int m = (l+r)>>1;35 query(lson);36 query(rson);37 }38 int Bin(int key,int len){39 int l = 0, r = len-1;40 while(l <= r){41 int m = (l+r)>>1;42 if(x[m] == key)return m;43 if(x[m] > key)r = m-1;44 else l = m+1;45 }46 return -1;47 }48 int main(){49 int t,n;50 scanf("%d",&t);51 while(t--){52 scanf("%d",&n);53 int nn = 0;54 for(int i = 0; i < n; i ++){55 scanf("%d %d",&li[i],&ri[i]);56 x[nn++] = li[i];x[nn++] = ri[i];57 }58 sort(x,x+nn);59 int m = 1;60 for(int i = 1; i < nn; i ++){61 if(x[i]!=x[i-1])x[m++] = x[i];62 }63 for(int i = m-1; i > 0; i --){64 if(x[i] != x[i-1]+1)x[m++] = x[i-1]+1;65 }66 sort(x,x+m);67 memset(col,-1,sizeof(col));68 for(int i = 0; i < n; i ++){69 int l = Bin(li[i],m);70 int r = Bin(ri[i],m);71 update(l,r,i,0,m,1);72 }73 ans = 0;74 memset(hash,false,sizeof(hash));75 query(0,m,1);76 printf("%d\n",ans);77 }78 return 0;79 }

 

转载于:https://www.cnblogs.com/xingkongyihao/p/7168954.html

你可能感兴趣的文章
grafana授权公司内部邮箱登录 ldap配置
查看>>
treegrid.bootstrap使用说明
查看>>
[Docker]Docker拉取,上传镜像到Harbor仓库
查看>>
javascript 浏览器类型检测
查看>>
nginx 不带www到www域名的重定向
查看>>
记录:Android中StackOverflow的问题
查看>>
导航,头部,CSS基础
查看>>
[草稿]挂载新硬盘
查看>>
[USACO 2017 Feb Gold] Tutorial
查看>>
关于mysql中GROUP_CONCAT函数的使用
查看>>
OD使用教程20 - 调试篇20
查看>>
Java虚拟机(JVM)默认字符集详解
查看>>
Java Servlet 过滤器与 springmvc 拦截器的区别?
查看>>
(tmp >> 8) & 0xff;
查看>>
linux命令之ifconfig详细解释
查看>>
NAT地址转换
查看>>
Nhibernate 过长的字符串报错 dehydration property
查看>>
Deque - leetcode 【双端队列】
查看>>
人物角色群体攻击判定(一)
查看>>
一步步学习微软InfoPath2010和SP2010--第九章节--使用SharePoint用户配置文件Web service(2)--在事件注册表单上创建表单加载规则...
查看>>