【分块】bzoj3226 [Sdoi2008]校门外的区间
题解见 : 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]校门外的区间的更多相关文章
- 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 : ...
- BZOJ3226: [Sdoi2008]校门外的区间
感觉很有趣的题呢. 每个点拆成两个,线段树维护. 不过这题难点其实在输入输出. #include<bits/stdc++.h> #define N (1<<17) #defin ...
- [bzoj3226][Sdoi2008]校门外的区间——线段树
题目 略 题解 直接套黄学长模板. Orz 代码 #include <bits/stdc++.h> using namespace std; #define ll long long #d ...
- bzoj 3226 [Sdoi2008]校门外的区间(线段树)
3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 615 Solved: 227[Submit][Stat ...
- 3226. [SDOI2008]校门外的区间【线段树】
Description 受校门外的树这道经典问题的启发,A君根据基本的离散数学的知识,抽象出5种运算维护集合S(S初始为空)并最终输出S.现在,请你完成这道校门外的树之难度增强版——校门外的区间. ...
- 「BZOJ3226」[Sdoi2008]校门外的区间
题目 首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\) 根据离散数学的基本知识,尝试把五个操作转化成人话 把\([x,y]\)变成\(1\) 把 ...
- BZOJ 3226: [Sdoi2008]校门外的区间
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3226 题意:初始集合S为空.模拟四种集合操作:集合并.交.差.补集并. 思路:区间 ...
- 3226: [Sdoi2008]校门外的区间
链接 思路 bug漫天飞... 维护一颗线段树,支持区间赋值,和区间异或.因为会处理到一些方括号还是圆括号的问题,所以对于每一个下标都乘2,假设中间有一个.5即可,都变成了方括号,输出在处理一下. U ...
- [SDOI2008] 校门外的区间 - 线段树
U T 即将区间 \(T\) 范围赋值为 \(1\) I T 即将区间 \(U - T\) 范围赋值为 \(0\) D T 即将区间 \(T\) 赋值为 \(0\) C T 由于 \(S=T-S=T( ...
随机推荐
- HDU 1203 01背包
I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 牛客多校对抗第6场 A Singing Contest
[20分]标题:A.Singing Contest | 时间限制:1秒 | 内存限制:256MJigglypuff is holding a singing contest. There are 2n ...
- Math.abs为Integer.Min_VALUE返回错误的值
Math.abs为Integer.Min_VALUE返回错误的值 这段代码: System.out.println(Math.abs(Integer.MIN_VALUE)); 回报-2147483 ...
- Qt5 界面中文乱码问题
1.文件所在项目文件 xxx.pro 中添加: QMAKE_CXXFLAGS += -execution-charset:utf- 2.文件以 UTF-8 编码保存 3.添加 utf-8 BOM
- C++开源库,欢迎补充。
转载自:http://blog.csdn.net/kobejayandy/article/details/8681741 C++在"商业应用"方面,曾经是天下第一的开发语言,但这一 ...
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)【转】
概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...
- 【BZOJ】[SDOI2009]HH的项链
[算法]主席树||离线+树状数组 [题解] 主席树经典应用:找区间不同的数字个数. 做法:记录每个数上一次出现的位置last[i],对last建权值线段树,对于区间询问last[i]<L的数字个 ...
- CentOS 7 主机加固手册-上
TIPs: 世界上有一撮人专门研究主机安全加固基线,有兴趣的读者可以到 http://benchmarks.cisecurity.org/ 获取更加详细专业的主机安全基线配置文档.或者到 https: ...
- 3.shell位置参数变量
当我们执行一个shell脚本时,希望可以获取命令行里的参数信息,就可以使用位置参数变量.比如 sh ./a.sh 100 200,就是一个执行shell的命令行,可以在a.sh脚本中获取到参数信息 语 ...
- javascript中判断变量时变量值为 0 的特殊情况
有时候我们在js中会直接判断变量是否存在值,下面列举一些情况: var a = 0; var b = 1; var c = ' '; var d; console.log( a ? 1 : null) ...