開始就直接用延迟标记搞了下。最后发现内存肯定会爆了。数据太大了。

问了瓜神,原来应该用离散化来做这题,详细见凝视

#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线段树基础的更多相关文章

  1. Poj 3246 Balanced Lineup(线段树基础)

    依旧是线段树基础题 询问区间的最大值和最小值之差,只有询问,没有插入删除.继续理解基础线段树 #include <iostream> #include <algorithm> ...

  2. poj-2528线段树练习

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

  3. P1198 [JSOI2008]最大数(线段树基础)

    P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: ...

  4. HDU 1754 I Hate It(线段树基础应用)

    基础线段树 #include<iostream> #include<cstdio> #include<cstring> using namespace std; # ...

  5. 线段树基础模板&&扫描线

    线段树的单点更新+区间求和 hdu1166敌兵布阵 Input 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N<=),表示敌人有N个工兵营地 ,接下来有N个正整数,第i个正整 ...

  6. poj2528(线段树+离散化)Mayor's posters

    2016-08-15 题意:一面墙,往上面贴海报,后面贴的可以覆盖前面贴的.问最后能看见几种海报. 思路:可以理解成往墙上涂颜色,最后能看见几种颜色(下面就是以涂色来讲的).这面墙长度为1~1000 ...

  7. POJ2528+线段树

    见代码. /* 线段树+Lazy 题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度. 现在往墙上贴N张海报,每张海报的宽度是任意的,但是必定是单位宽度的整数倍,且<=1QW. 后贴的海 ...

  8. POJ2528 线段树的区间操作

    首先应该对该[0,10000000]进行离散化 即先将点集进行排序,然后从小到大缩小其中的间距,使得最后点数不会超过2*n 然后就是线段树操作 只需进行染色,然后最后用nlgn进行一个个查询颜色记录即 ...

  9. POJ 2777 线段树基础题

    题意: 给你一个长度为N的线段数,一开始每个树的颜色都是1,然后有2个操作. 第一个操作,将区间[a , b ]的颜色换成c. 第二个操作,输出区间[a , b ]不同颜色的总数. 直接线段树搞之.不 ...

随机推荐

  1. 【FSFA 读书笔记】Ch4 Volume Analysis & Cr 5 PC-based Partitions

    Volume Analysis 1. “卷”可以理解为从逻辑上对物理存储设备的重新编制,便于操作系统管理. (A volume is a collection of addressable secto ...

  2. 【JSP实例】指定用户计数器

    不同的用户访问次数是不一样的,因此对于每一个用户的访问次数都要进行统计,以适应需要. 用户登陆的Login.html的源文件: <html> <head> <title& ...

  3. hdu 5606 tree(并查集)

    Problem Description There is a tree(the tree is a connected graph which contains n points and n−1 ed ...

  4. ToString()使用方法

    1.数字转换到字符串格式说明符说明示例输出C货币2.5.ToString("C")¥2.50D十进制数25.ToString("D5")00025E科学型250 ...

  5. Android核心基础(五)

    1.仿网易新闻客户端 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...

  6. 固定表格行列(expression)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  7. java中的302和sendRedirect的区别

    java中有一个sendRedirect函数这个用于跳转到另外一个页面,这个实际上是一个302跳转,但是不完全等同于302跳转 点击(此处)折叠或打开 response.sendRedirect(&q ...

  8. javascript设计模式——Observer

    定义一种一对多的从属关系,当一个目标状态改变,所有他的从属对对象都将收到通知. 1.简单的Observer模式 实现 var Observer = function(){ this.list = [] ...

  9. C# 中的委托和事件详解

    C# 中的委托和事件 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错 ...

  10. 如何将java web项目上线/部署到公网

    关于如何将java web上线,部署到公网,让全世界的人都可以访问的问题. 1.在myeclipse中开发好项目,打包成war格式,不会的同学参考以下 http://zhidao.baidu.com/ ...