题解见 : http://blog.csdn.net/iamzky/article/details/41088151

ORZ ZKY

2个懒标记:是否翻转,覆盖成了什么。

怎么处理一个块上有两个标记的情况呢?

若该块原来没有任何标记,或要打的标记和原本的标记种类相同,则直接打上标记;

若已有翻转标记,再覆盖时则先清除翻转标记,再打上覆盖标记;

若已有覆盖标记,再翻转时,则直接将覆盖标记取反。

So 某个块上同时只会有1个标记。

P.S.分块此题挺快的……

 #include<cstdio>
#include<cstring>
using namespace std;
#define sz 370
const int n=;
char op[],cl,cr;
int x,y,num[],l[sz],r[sz],cov[sz],sum;
bool a[],spin[sz],goal;
void makeblock()
{
for(sum=;sum*sz<n;++sum)
{
l[sum]=r[sum-]+; r[sum]=sum*sz;
for(int i=l[sum];i<=r[sum];++i) num[i]=sum;
}
l[sum]=r[sum-]+; r[sum]=n;
for(int i=l[sum];i<=r[sum];++i) num[i]=sum;
memset(cov,-,sizeof(cov));
}
void pushdown(const int &p)
{
if(cov[p]!=-)
{
for(int i=l[p];i<=r[p];i++) a[i]=cov[p];
cov[p]=-;
}
else if(spin[p])
{
for(int i=l[p];i<=r[p];i++) a[i]^=;
spin[p]=;
}
}
void update(const int &L,const int &R,const bool &sym)
{
pushdown(num[L]); pushdown(num[R]);
if(num[L]==num[R]) {for(int i=L;i<=R;++i) a[i]=sym;}
else
{
for(int i=L;i<=r[num[L]];++i) a[i]=sym;
for(int i=l[num[R]];i<=R;++i) a[i]=sym;
for(int i=num[L]+;i<num[R];++i) {spin[i]=; cov[i]=sym;}
}
}
void rotate(const int &L,const int &R)
{
pushdown(num[L]); pushdown(num[R]);
if(num[L]==num[R]) {for(int i=L;i<=R;++i) a[i]^=;}
else
{
for(int i=L;i<=r[num[L]];++i) a[i]^=;
for(int i=l[num[R]];i<=R;++i) a[i]^=;
for(int i=num[L]+;i<num[R];++i)
if(cov[i]==-) spin[i]^=;
else cov[i]^=;
}
}
int Ma(const int &v,const char &c)
{
if(c=='['||c==']') return (v<<);
else if(c=='(') return (v<<)+;
else return (v<<)-;
}
int main()
{
makeblock();
while(scanf("%s %c%d,%d%c",op,&cl,&x,&y,&cr)!=EOF)
{
if(op[]=='U') update(Ma(x,cl),Ma(y,cr),);
else if(op[]=='I')
{
if(x) update(,Ma(x,cl)-,);
if(y!=) update(Ma(y,cr)+,<<,);
}
else if(op[]=='D') update(Ma(x,cl),Ma(y,cr),);
else if(op[]=='C')
{
rotate(Ma(x,cl),Ma(y,cr));
if(x) update(,Ma(x,cl)-,);
if(y!=) update(Ma(y,cr)+,<<,);
}
else rotate(Ma(x,cl),Ma(y,cr));
}
int head=;
for(int i=;i<=sum;++i) pushdown(i);
for(int i=;i<=n;++i)
{
if(((!i) && a[i]) || (a[i] && (!a[i-]))) head=i;
if((i==n && a[i]) || (a[i] && (!a[i+])))
{
goal=;
if(head&) putchar('(');
else putchar('[');
printf("%d,",head>>);
if(i&) {printf("%d",i+>>); putchar(')');}
else {printf("%d",i>>); putchar(']');}
putchar(' ');
}
}
if(!goal) puts("empty set");
return ;
}

【分块】bzoj3226 [Sdoi2008]校门外的区间的更多相关文章

  1. BZOJ3226[Sdoi2008]校门外的区间 题解

    题目大意: 有5种运算维护集合S(S初始为空)并最终输出S. 5种运算如下: U T  S∪T I T S∩T D T  S-T C T T-S S T S⊕T 基本集合运算如下: A∪B {x : ...

  2. BZOJ3226: [Sdoi2008]校门外的区间

    感觉很有趣的题呢. 每个点拆成两个,线段树维护. 不过这题难点其实在输入输出. #include<bits/stdc++.h> #define N (1<<17) #defin ...

  3. [bzoj3226][Sdoi2008]校门外的区间——线段树

    题目 略 题解 直接套黄学长模板. Orz 代码 #include <bits/stdc++.h> using namespace std; #define ll long long #d ...

  4. bzoj 3226 [Sdoi2008]校门外的区间(线段树)

    3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 615  Solved: 227[Submit][Stat ...

  5. 3226. [SDOI2008]校门外的区间【线段树】

    Description   受校门外的树这道经典问题的启发,A君根据基本的离散数学的知识,抽象出5种运算维护集合S(S初始为空)并最终输出S.现在,请你完成这道校门外的树之难度增强版——校门外的区间. ...

  6. 「BZOJ3226」[Sdoi2008]校门外的区间

    题目 首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\) 根据离散数学的基本知识,尝试把五个操作转化成人话 把\([x,y]\)变成\(1\) 把 ...

  7. BZOJ 3226: [Sdoi2008]校门外的区间

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3226 题意:初始集合S为空.模拟四种集合操作:集合并.交.差.补集并. 思路:区间 ...

  8. 3226: [Sdoi2008]校门外的区间

    链接 思路 bug漫天飞... 维护一颗线段树,支持区间赋值,和区间异或.因为会处理到一些方括号还是圆括号的问题,所以对于每一个下标都乘2,假设中间有一个.5即可,都变成了方括号,输出在处理一下. U ...

  9. [SDOI2008] 校门外的区间 - 线段树

    U T 即将区间 \(T\) 范围赋值为 \(1\) I T 即将区间 \(U - T\) 范围赋值为 \(0\) D T 即将区间 \(T\) 赋值为 \(0\) C T 由于 \(S=T-S=T( ...

随机推荐

  1. Bash 实例,第二部分

    我们先看一下处理命令行自变量的简单技巧,然后再看看 bash 基本编程结构. 接收自变量 在 介绍性文章 中的样本程序中,我们使用环境变量 "$1" 来引用第一个命令行自变量.类似 ...

  2. 通过设置nginx的client_max_body_size解决nginx+php上传大文件的问题

    通过设置nginx的client_max_body_size解决nginx+php上传大文件的问题:用nginx来做webserver的时,上传大文件时需要特别注意client_max_body_si ...

  3. BigDecimal精度问题

    介绍 1.商业计算使用BigDecimal. 2.使用参数为String的构造函数. 3.BigDecimal都是不可变的,每一步的运算时,都会产生一个新的对象.所以在做加减乘除后千万要保存操作后的值 ...

  4. Spring - IoC(7): 延迟实例化

    默认情况下,Spring IoC 容器启动后,在初始化过程中,会以单例模式创建并配置所有使用 singleton 定义的 Bean 的实例.通常情况下,提前实例化 Bean 是可取的,因为这样在配置中 ...

  5. 我喜欢的4个VS扩展吧

    原文发布时间为:2011-06-09 -- 来源于本人的百度文章 [由搬家工具导入]

  6. karma和jasmine的测试(包括angular测试)

    本篇博客主要就是针对现在日新月异的技术和快速开发,测试被很多人忽略,其实在开发中如何保证代码的质量以及逻辑的完整性,测试显得十分重要,本文就是负责karma+jasmine来测试. 1.搭建测试的环境 ...

  7. setInterval的使用和停用

    var res = self.setInterval(function(){ if(typeof(UE.getEditor('editor').body.innerHTML) != "und ...

  8. go开发

    我开发中一直用这一段 //for debuggingfunc printPretty(v interface{}, mark string) (err error) { fmt.Printf(&quo ...

  9. camera摄像原理之三:色温和自动白平衡【转】

    转自:http://blog.csdn.net/ghostyu/article/details/7912863 色温的定义:将黑体从绝对零度开始加温,温度每升高一度称为1开氏度(用字母K表示),当温度 ...

  10. 【 Python 】函数的参数

    一.默认参数: 默认参数可以简化函数的调用,设置默认参数时,有几点要注意: 1,必选参数在前,默认参数在后,否则python的解释器会报错. 2,如何设置默认参数. 当函数有多个参数时,把变化大的参数 ...