首先应该对该【0,10000000】进行离散化

即先将点集进行排序,然后从小到大缩小其中的间距,使得最后点数不会超过2*n

然后就是线段树操作

只需进行染色,然后最后用nlgn进行一个个查询颜色记录即可

#include<cstdio>

#include<cstring>
int color[20005*4],a[20005],p[20005],l[10005],r[10005],pd[10005],i,j,k,n,t,length;
void qs(int x,int y){
    int i=x,j=y,k=a[(x+y)/2],t;
    do{
        while(a[i]<k) i++;
        while(a[j]>k) j--;
        if(i<=j){
            t=a[i];a[i]=a[j];a[j]=t;
            t=p[i];p[i]=p[j];p[j]=t;
            i++;j--;
        }
    }while(i<j);
    if(i<y) qs(i,y);
    if(x<j) qs(x,j);
}
void build(int x,int y,int rt){
    color[rt]=0;
    if(x>=y) return;
    int m=(x+y)/2;
    build(x,m,2*rt);
    build(m+1,y,2*rt+1);
}
void PushDown(int rt){
    if(color[rt]!=0){
        color[rt*2]=color[rt*2+1]=color[rt];
        color[rt]=0;
    }
}
void update(int x,int y,int rt){
    if(l[k]<=x&&r[k]>=y){
        color[rt]=k;
        return;
    }
    PushDown(rt);
    int m=(x+y)/2;
    if(l[k]<=m) update(x,m,rt*2);
    if(r[k]>m) update(m+1,y,rt*2+1);
}
int query(int x,int y,int rt){
    if(color[rt]!=0){
        if(!pd[color[rt]]) {
            pd[color[rt]]=1;
            return 1;
        }
        else return 0;
    }
    if(x==y) return 0;
    int m=(x+y)/2;
    return(query(x,m,rt*2)+query(m+1,y,rt*2+1));
}
int main()
{
    scanf("%d",&t);
    while(t--){
        memset(pd,0,sizeof(pd));
        scanf("%d",&n);
        for(i=1;i<=n;i++){
            scanf("%d%d",&a[2*i-1],&a[2*i]);
            p[2*i-1]=2*i-1;
            p[2*i]=2*i;
        }
        qs(1,2*n);
        length=1;
        for(i=1;i<=2*n;i++){
            if(p[i]%2==0)
                r[p[i]/2]=length;
            else
                l[(p[i]+1)/2]=length;
            if(a[i]!=a[i+1]) length++;
        }
        build(1,length,1);
        for(k=1;k<=n;k++)
            update(1,length,1);
        printf("%d\n",query(1,length,1));
    }
    return 0;
}

POJ2528 线段树的区间操作的更多相关文章

  1. poj-2528线段树练习

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

  2. Codeforces Round #222 (Div. 1) D. Developing Game 线段树有效区间合并

    D. Developing Game   Pavel is going to make a game of his dream. However, he knows that he can't mak ...

  3. hiho一下20周 线段树的区间修改

    线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了 ...

  4. hihoCode 1078 : 线段树的区间修改

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  5. UVA 12436-Rip Van Winkle's Code(线段树的区间更新)

    题意: long long data[250001]; void A( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = da ...

  6. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  7. hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  8. 线段树(区间树)之区间染色和4n推导过程

    前言 线段树(区间树)是什么呢?有了二叉树.二分搜索树,线段树又是干什么的呢?最经典的线段树问题:区间染色:正如它的名字而言,主要解决区间的问题 一.线段树说明 1.什么是线段树? 线段树首先是二叉树 ...

  9. HDU 1698 just a hook 线段树,区间定值,求和

    Just a Hook Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1 ...

随机推荐

  1. 类似FirePhp的Chrome.php 调试php

    之前一直用firephp来调试php,主要受限Firefox启动太慢,研究了下chromephp; 写了个简单的判断模版: <?php /** * @Author: Klaus * @Date: ...

  2. [PHP]set_time_limit — 设置脚本最大执行时间

    (PHP 4, PHP 5) set_time_limit — 设置脚本最大执行时间 说明 void set_time_limit ( int $seconds ) 设置允许脚本运行的时间,单位为秒. ...

  3. php入门引言

    php开发者要具备的一些要求: [1]html常用标签的基础知识 [2]html+css布局的基础知识 [3]了解php开发环境 [4]了解php标签和扩展名 1.php标签是撒??? <?ph ...

  4. 用python实现了一下:甲乙两人互猜数字(数理逻辑)

    今天在园子里看到博客:超难面试题:甲乙两人互猜数字(数理逻辑).然后琢磨了半天,写了个Python程序实现算法,我得出来的结果是1,6或1,8或35,42的组合, 不知道是否正确,请高人指点? 下面列 ...

  5. [旧博客]Python 第一天总结

    语法部分: 3**4 表示3的四次方 -1**3 结果是-1 raw_input 输入文本 input 输入值,input 3*3 结果为9 pow(5,5) 等于 5*5 abs(-1.8) 等于 ...

  6. C# 将Datatable作为参数,传入存储过程

    //创建一个静态方法 public static DataSet fnInsertSingleUser(DataTable v_dt, params string[] param) { try { S ...

  7. 安装Nuget上常用的包的命令

    起因: Nuget图形化操作界面各种卡顿,或者有时干脆就连不上了.所以用命令还是很必须的. 常用命令: 安装 Entity Framework : PM> Install-Package Ent ...

  8. Js 处理将时间转换 “年-月-日”

    将时间  \/Date(1432828800000+0800)\/"  转换成:“年-月-日” //时间转换function ChangeDateFormat(val) {    if (v ...

  9. ios9新特性概述

    1.iPad的分屏功能很重要. 开发者对iPad的分屏功能感到兴奋,并认为其对苹果未来非常重要.电子邮件信息应用Hop创始人艾瑞兹·皮洛索夫(Erez Pilosof)认为,如果苹果如传闻中那样决定推 ...

  10. Oracle 常用操作

    修改数据库表名:rename [old-table] to [new-table]; while循环添加测试数据: declare     i int:=1;     begin     while ...