【分块】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( ...
随机推荐
- django自己搭建的博客
1.博客地址: http://jiangtao4.pythonanywhere.com/ 2.后台可以发布笔记,可以翻页,数据存在MySQL里面 3.GitHub地址: https://github. ...
- Java中Class<T>与Class<?>的区别
E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ? - 表示不确定 ...
- HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTup
Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.t ...
- Sass、Ruby、Nodejs、gulp
1.Sass文件就是普通的文本文件,不过其文件后缀名有两种,一种为“.sass”:另一种为“.scss”.我们一般用“.scss”就好,至于这两种文件扩展名的区别在于“.sass”是Sass语言文件的 ...
- Kali 1.0 / 2.0 安装中文输入法(谷歌pinyin + 其他)
1.kali默认是没有中午输入法的,需要自己安装一下 2.首先我们先获取root权限 dnt@HackerKali:~$ su密码: 3.安装中文输入法(apt-get 指令不会的同学可以学习一下基础 ...
- [vue-router] Failed to resolve async component default: Error: Loading chunk 0 failed.
在整合laravel5.4 和vue2.1的时候遇到一个奇怪的问题 Uncaught SyntaxError: Unexpected token < Error: Loading chunk 0 ...
- Linux curl命令【curl】
命令:curl 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具 ...
- Linux2.6.32内核笔记(5)在应用程序中移植使用内核链表【转】
转自:http://blog.csdn.net/Deep_l_zh/article/details/48392935 版权声明:本文为博主原创文章,未经博主允许不得转载. 摘要:将内核链表移植到应用程 ...
- chromium源代码下载(Win7x64+VS2013sp2, 39.0.2132.2)
chromium源代码下载(Win7x64+VS2013sp2, 39.0.2132.2) http://www.aichengxu.com/diannao/1000251.htm 前后折腾了四天,当 ...
- 2.docker容器
docker run 镜像,生成镜像容器,并运行 有以下参数 --name="new name",为容器指定一个新名字 -d:后台运行容器,返回容器id,即启动守护式容器 -i:以 ...