【分块】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( ...
随机推荐
- API网关Kong部署和使用文档
KONG安装使用说明 系统版本:ubuntu14 1.下载安装包 $ wget https://github.com/Mashape/kong/releases/download/0.8.3/kong ...
- Windows Socket 编程_ 简单的服务器/客户端程序
转载自:http://blog.csdn.net/neicole/article/details/7459021 一.程序运行效果图 二.程序源代码 三.程序设计相关基础知识 1.计算机网络 2 ...
- [hdu 1398]简单dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1398 看到网上的题解都是说母函数……为什么我觉得就是一个dp就好了,dp[i][j]表示只用前i种硬币 ...
- POJ1182:食物链(并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 94930 Accepted: 28666 Description ...
- 用Hibernate实现分页查询
分页查询就是把数据库中某张表的记录数进行分页查询,在做分页查询时会有一个Page类,下面是一个Page类,我对其做了详细的注解: package com.entity; /** * @author:秦 ...
- Prepare and Deploy Windows Server 2016 Active Directory Federation Services
https://docs.microsoft.com/en-us/windows/security/identity-protection/hello-for-business/hello-key-t ...
- 51Nod 1081前缀和
#include <iostream> #include <stdio.h> using namespace std; ]; ]; int main() { int n; ci ...
- 校内训练0609 problem c
[题目大意] 给一棵树,求有多少条路径满足总和-最大值 是P的倍数 n<=10^5, P<=10^7 [题解] 一看就是点分治嘛 不考虑子树合并,考虑poj1741的做法,每次考虑经过重心 ...
- 密码框JPasswordField 的使用
JPasswordField的主要方法为setEchoChar(char c),其中的字符C为回显字符. package first; import javax.swing.*; import jav ...
- Oracle基础 01 表空间 tablespace
--查看表空间 select * from dba_tablespaces; select * from v$tablespace; select * from dba_data_files; --查 ...