POJ2528线段树基础
開始就直接用延迟标记搞了下。最后发现内存肯定会爆了。数据太大了。
问了瓜神,原来应该用离散化来做这题,详细见凝视
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;
#define INF 0xfffffff
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 444444
int col[maxn<<2];
int l[maxn],r[maxn];
int q[maxn],q1[maxn],vis[maxn],hash[maxn];
void pushdown(int rt)
{
if(col[rt])
{
col[rt<<1]=col[rt<<1|1]=col[rt];
col[rt]=0;
}
}
void build(int l,int r,int rt)
{
col[rt]=0;
if(l==r) return ;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void update(int L,int R,int cha,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
col[rt]=cha;
return ;
}
pushdown(rt);
int m=(l+r)>>1;
if(L<=m) update(L,R,cha,lson);
if(R>m) update(L,R,cha,rson);
}
void query(int l,int r,int rt)
{
if(col[rt])//假设某张海报存在。将这张海报标记一下
{
hash[col[rt]]=1;
return ;
}
int m=(l+r)>>1;
query(lson);
query(rson);
}
int bsearch(int key,int *a,int len)//二分查找
{
int l=0,r=len-1;
while(l<=len)
{
int m=(l+r)>>1;
if(a[m]==key) return m+1;
else if(a[m]>key) r=m-1;
else l=m+1;
}
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
memset(hash,0,sizeof(hash));
scanf("%d",&n);
int ans=0,ans1=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&l[i],&r[i]);
q[ans++]=l[i];q[ans++]=r[i];
}
sort(q,q+ans);
for(int i=0;i<ans-1;i++)
{
if(q[i]==q[i+1]) vis[i+1]=1;
}
for(int i=0;i<ans;i++)//将原来浪费的空间又一次利用,减少树的大小
{
if(!vis[i]) q1[ans1++]=q[i];
}
for(int i=1;i<=n;i++)//找到如今树中各点的位置
{
l[i]=bsearch(l[i],q1,ans1);
r[i]=bsearch(r[i],q1,ans1);
}
build(1,ans1,1);//建树
for(int i=1;i<=n;i++)
{
update(l[i],r[i],i,1,ans1,1);
}
query(1,ans1,1);
int tot=0;
for(int i=1;i<=n;i++)//统计海报的张数
{
if(hash[i]) tot++;
}
printf("%d\n",tot);
}
return 0;
}
POJ2528线段树基础的更多相关文章
- Poj 3246 Balanced Lineup(线段树基础)
依旧是线段树基础题 询问区间的最大值和最小值之差,只有询问,没有插入删除.继续理解基础线段树 #include <iostream> #include <algorithm> ...
- poj-2528线段树练习
title: poj-2528线段树练习 date: 2018-10-13 13:45:09 tags: acm 刷题 categories: ACM-线段树 概述 这道题坑了我好久啊啊啊啊,,,, ...
- P1198 [JSOI2008]最大数(线段树基础)
P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: ...
- HDU 1754 I Hate It(线段树基础应用)
基础线段树 #include<iostream> #include<cstdio> #include<cstring> using namespace std; # ...
- 线段树基础模板&&扫描线
线段树的单点更新+区间求和 hdu1166敌兵布阵 Input 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N<=),表示敌人有N个工兵营地 ,接下来有N个正整数,第i个正整 ...
- poj2528(线段树+离散化)Mayor's posters
2016-08-15 题意:一面墙,往上面贴海报,后面贴的可以覆盖前面贴的.问最后能看见几种海报. 思路:可以理解成往墙上涂颜色,最后能看见几种颜色(下面就是以涂色来讲的).这面墙长度为1~1000 ...
- POJ2528+线段树
见代码. /* 线段树+Lazy 题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度. 现在往墙上贴N张海报,每张海报的宽度是任意的,但是必定是单位宽度的整数倍,且<=1QW. 后贴的海 ...
- POJ2528 线段树的区间操作
首先应该对该[0,10000000]进行离散化 即先将点集进行排序,然后从小到大缩小其中的间距,使得最后点数不会超过2*n 然后就是线段树操作 只需进行染色,然后最后用nlgn进行一个个查询颜色记录即 ...
- POJ 2777 线段树基础题
题意: 给你一个长度为N的线段数,一开始每个树的颜色都是1,然后有2个操作. 第一个操作,将区间[a , b ]的颜色换成c. 第二个操作,输出区间[a , b ]不同颜色的总数. 直接线段树搞之.不 ...
随机推荐
- C语言的本质(26)——C标准库之数值字符串转换
C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. #include <stdlib.h> int atoi(const char *nptr); a ...
- libevent evbuffer bug
今天发现 libevent 2.0.22 一个坑爹的bug,导致消息混乱.查找问题浪费一天,复现代码如下 #include <event2/buffer.h> #include <s ...
- matlab---边缘之sobel简单实例
最近在项目中需要做一些图像边缘检测的工作,但是由于之前没接触过图像处理的相关知识,所以只得 在matlab里面对一些图像处理函数挨个挨个的试着用.在用的过程中在慢慢的明白了一些简单的图像处 理方法. ...
- skynet-源码分析1:目录下的文件整理
skynet是c和lua结合的一个开源游戏引擎,是云风所写,对我等屌丝来说,是很好的参考 先整理一下文件结构,然后再慢慢深入 主目录下有10个目录,105个文件, 具体包含的情况,我简单画了个图,明天 ...
- IOS 开展 分别制定了iphone 和 ipad 好? 或开发一个 Universal好?
最近因为工作的需要,.因为时间短的开发周期 开发的需要 积 至iphone 和 ipad 台 执行 优势的版本号 1.安装包,轻松管理,分布 2.您下载iphone,ipad 会自己主动下载 3.审核 ...
- java的静态代理
解决这个问题:在多个模块要插入一段功能,比方,在不同业务处理模块中,都须要检查用户是否登录,假设不使用代理的话,每添加一个模块,就须要添加非常多代码. 比方,除了推断是否登录,假设还须要添加一个记录日 ...
- shell编程001
1.shell中如何进行算术计算 A=1; B=2 (1)let C=$A+$B (2)C=$[$A+$B] (3)C=$(($A+$B)) (4)C=`expr $A + $B` (注意运算符前 ...
- Struts学习之ValueStack学习
1. 数据传输背后机制:ValueStack(值栈) 在这一切的背后,是因为有了ValueStack(值栈)! ValueStack基础:OGNL OGNL是Struts2中使用的一种表达式语言,它可 ...
- jQuery二级联动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 使用device.js检测设备并实现不同设备展示不同网页
现在很多时候会用@media来控制页面在不同分辨率的设备商展示不同效果,但是有些时候想在直接在PC上展示一个做好的页面,在mobile展示另一个页面.这个时候可以借助device.js来检测设备,然后 ...