U:把区间[l,r]覆盖成1
I:把[-∞,l)(r,∞]覆盖成0    
D:把区间[l,r]覆盖成0
C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换
S:[l,r]区间0/1互换

因为普通的线段树实际处理的并非真正的区间,而是一系列点,相当于处理一个向量。这个问题需要处理的是真正的区间,所以应该有一个主导思想就是,把区间点化!不知哪位大牛搞了一个倍增区间出来,实在佩服!对于待处理区间[a,b](暂时不考虑开闭),对其边界均乘2。若区间左开则对左界值+1,若区间右开,则对右界-1!

如:[2,3]会倍增为[4,6],[2,3)会倍增为[4,5],(2,3]会倍增为[5,6],(2,3)将倍增为[5,5],我们这时可以看到,对于普通线段树无法处理的线段如(x,x+1)将被点化为[2*x+1,2*x+1]!这个问题得到比较完美的解决

最后把查找出来的区间逆向倍增操作一下,就可以得到实际的区间以及起开闭情况!

#include<stdio.h>
#include<algorithm>
#include<string.h>

using namespace std;

#define MAXN1 65545<<1
#define MAXN  65535<<1

],col[MAXN<<];

void FXOR(int a)
{
    )
        x[a]^=;
    else
        col[a]^=;
}
void push_down(int a)
{
    )
    {
        x[a<<]=x[a<<|]=x[a];
        col[a<<]=col[a<<|]=;
        x[a]=-;
    }
    if(col[a])
    {
        FXOR(a<<);
        FXOR(a<<|);
        col[a]=;
    }
}

void update(char val,int l,int r,int a1,int b1,int a)
{
    if(l>=a1&&b1>=r)
    {
        if(val=='U')
        {
            x[a]=;
            col[a]=;
        }
        else if(val=='D')
        {
            x[a]=;
            col[a]=;
        }
        else if(val=='S'||val=='C')
            FXOR(a);
        return ;
    }
    push_down(a);
    ;
    if(a1<=mid)
        update(val,l,mid,a1,b1,a<<);
    else if(val=='I'||val=='C')
        x[a<<]=col[a<<]=;
    if(b1>mid)
        update(val,mid+,r,a1,b1,a<<|);
    else if(val=='I'||val=='C')
        x[a<<|]=col[a<<|]=;
}
bool vis[MAXN1];
void Query(int l,int r,int a)
{
    )
    {
        for(int i=l;i<=r;i++)
            vis[i]=;
        return ;
    }
    )
        return ;
    if(l==r)
        return ;
    push_down(a);
    ;
    Query(l,mid,a<<);
    Query(mid+,r,a<<|);
}
int main()
{
    x[]=col[]=;
    char a,a1,a2,b;
    int l,r;
    while(scanf("%c %c%d,%d%c%c",&a,&a1,&l,&r,&a2,&b)!=EOF)
    {
        l<<=;
        r<<=;
        if(a1=='(')
            l++;
        if(a2==')')
            r--;
        if(l>r)
            continue;
        update(a,,MAXN,l,r,);
    }
    Query(,MAXN,);
    ,e;
    ;
    ;i<=MAXN;i++)
    {
        if(vis[i])
        {
            )
                s=i;
            e=i;
        }
        else
        {
            )
            {
                if(flag)printf(" ");
                printf(?,(e+)>>,e&?')':']');
                s=-;
                flag=;
            }
        }
    }
    if(!flag)
        printf("empty set");

    ;
}

线段树 poj3225的更多相关文章

  1. [转载]完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...

  2. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  3. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  4. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  5. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  6. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  7. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  8. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  9. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

随机推荐

  1. linux系统无法启动解决方案

    windows和linux双系统一般先安装Windows,分两个主分区,把Linux安装在另外的主分区上.Linux编译内核,添加NTFS分区支持,然后Mount NTFS 分区即可访问Windows ...

  2. Qt Creator 常用快捷键

    多行注释模式                                                                                            Ct ...

  3. Android android:gravity属性介绍及效果图

    转自: http://blog.csdn.net/aminfo/article/details/7784229 Android:gravity的属性官方说明如下: public static fina ...

  4. Elasticsearch集群中处理大型日志流的几个常用概念

    之前对于CDN的日志处理模型是从logstash agent==>>redis==>>logstash index==>>elasticsearch==>&g ...

  5. Zepto源码注释

    /* Zepto v1.0-1-ga3cab6c - polyfill zepto detect event ajax form fx - zeptojs.com/license */ ;(funct ...

  6. textile

    textile 编辑   Textile是一个人性化的Web文本生成器,以简洁的方式提供HTML标签功能. 目录 1内容 ▪ 短语修饰符 ▪ 块修饰符 ▪ 链接 ▪ 属性 ▪ 排列 ▪ 表格 ▪ 图像 ...

  7. undefined index : HTTP_RAW_POST_DATA

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  8. C# Winfrom小黄鸡功能调用

    最近研究微信公众平台,搭建了一个微信聊天机器人,调用小黄鸡的公众接口,实现在线和小黄鸡聊天的功能. 接口调用不是很麻烦,不过是php版本,所以研究了一下C#的功能模块, Winfrom版 后台界面代码 ...

  9. struts文件上传拦截器maximumSize设置文件大小不起作用

    <interceptor-ref name="fileUpload">                <param name="allowedTypes ...

  10. Asp.net MVC 如何向webform一样在IIS里添加虚拟目录

    相信很多用webform的程序猿都习惯性的使用虚拟目录的形式来对一个程序添加新的功能,那么在mvc下该如何来弄呢? 首先得有一个项目基层的项目,然后我们在这个项目的基础上新增一个功能模块,例如信息发布 ...