题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3226

题意:初始集合S为空。模拟四种集合操作:集合并、交、差、补集并。

思路:区间有开区间闭区间,首先区间左右都乘以2,这样闭区间在偶数位置,开区间在奇数位置。然后就是区间染色颜色反转两个操作。注意区间染色时,若有反转标记则清除;反转时若有染色标记则直接将染色反转即可。

const int N=70005;

struct node
{
	int L,R;
	int re,color;

	void fill(int c)
	{
		if(re) re=0;
		color=c;
	}

	void reverse()
	{
		if(color!=-1) color^=1;
		else
		{
			re^=1;
		}
	}
};

node a[N<<3];

void build(int t,int L,int R)
{
	a[t].L=L;
	a[t].R=R;
	a[t].color=0;
	a[t].re=0;
	if(L==R) return;
	int M=(L+R)>>1;
	build(t<<1,L,M);
	build(t<<1|1,M+1,R);
}

void pushDown(int t)
{
	if(a[t].L==a[t].R) return;
	if(a[t].color!=-1)
	{
		a[t<<1].fill(a[t].color);
		a[t<<1|1].fill(a[t].color);
		a[t].color=-1;
	}
	if(a[t].re)
	{
		a[t<<1].reverse();
		a[t<<1|1].reverse();
		a[t].re=0;
	}
}

void fill(int t,int L,int R,int c)
{
	if(L>R) return;
	if(a[t].L==L&&a[t].R==R)
	{
		a[t].fill(c);
		return;
	}
	pushDown(t);
	int M=(a[t].L+a[t].R)>>1;
	if(R<=M) fill(t<<1,L,R,c);
	else if(L>M) fill(t<<1|1,L,R,c);
	else
	{
		fill(t<<1,L,M,c);
		fill(t<<1|1,M+1,R,c);
	}
}

void rev(int t,int L,int R)
{
	if(L>R) return;
	if(a[t].L==L&&a[t].R==R)
	{
		a[t].reverse();
		return;
	}
	pushDown(t);
	int M=(a[t].L+a[t].R)>>1;
	if(R<=M) rev(t<<1,L,R);
	else if(L>M) rev(t<<1|1,L,R);
	else
	{
		rev(t<<1,L,M);
		rev(t<<1|1,M+1,R);
	}
};

vector<pair<int,int> > V;

void dfs(int t)
{
	if(a[t].color==1)
	{
		V.pb(MP(a[t].L,a[t].R));
		return;
	}

	if(a[t].color==0) return;
	pushDown(t);
	dfs(t<<1);
	dfs(t<<1|1);
}

int main()
{

	int n=N<<1;
	build(1,0,n);
	char op,ll,rr;
	int l,r;
	while(scanf("%c %c%d,%d%c\n",&op,&ll,&l,&r,&rr)!=-1)
	{
		l<<=1;
		r<<=1;
		if(ll=='(') l++;
		if(rr==')') r--;
		if(op=='U') fill(1,l,r,1);
		else if(op=='I') fill(1,0,l-1,0),fill(1,r+1,n,0);
		else if(op=='D') fill(1,l,r,0);
		else if(op=='C') fill(1,0,l-1,0),fill(1,r+1,n,0),rev(1,l,r);
		else rev(1,l,r);
	}
	dfs(1);
	if(SZ(V)==0)
	{
		puts("empty set");
		return 0;
	}
	int i;
	int tot=SZ(V);
	for(i=0;i<tot-1;i++)
	{
		if(V[i].second+1==V[i+1].first) V[i+1].first=V[i].first;
        else
		{
			if(V[i].first&1) putchar('(');
			else putchar('[');
            printf("%d,%d",V[i].first>>1,V[i].second+1>>1);
            if(V[i].second&1) putchar(')');
            else putchar(']');
            putchar(' ');

        }

	}
	if(V[i].first&1) putchar('(');
	else putchar('[');
	printf("%d,%d",V[i].first>>1,V[i].second+1>>1);
    if(V[i].second&1) putchar(')');
    else putchar(']');
    putchar(' ');
	puts("");
}

BZOJ 3226: [Sdoi2008]校门外的区间的更多相关文章

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

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

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

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

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

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

  4. 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 : ...

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

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

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

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

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

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

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

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

  9. 【分块】bzoj3226 [Sdoi2008]校门外的区间

    题解见 : http://blog.csdn.net/iamzky/article/details/41088151 ORZ ZKY 2个懒标记:是否翻转,覆盖成了什么. 怎么处理一个块上有两个标记的 ...

随机推荐

  1. 夺命雷公狗ThinkPHP项目之----企业网站6之栏目的添加(主要用模型来验证字段)

    我们刚才的控制器已经写好了,那么我们现在就来完成我们的模型, 首先我们在Model目录下创建一个CategoryModel.class.php 代码如下: <?php namespace Adm ...

  2. JFreeChart在制作折线图

    JFreeChart在制作折线图的时候可以使用两种不同的方式 package Line; import java.awt.Color; import java.awt.Font; import org ...

  3. SQL —— 视图

    1. 为什么使用视图 1) 提高数据的安全型,不同权限的用户可以查看数据的不同. 2) 符合用户日常业务逻辑 2. 什么是视图 视图是一种查看数据库中一个或多个表中的数据的方法. 视图是一种虚拟表. ...

  4. java web sql注入测试(1)---概念概述

    在进行java web 测试时,经常会忽略的测试种类就是sql注入测试,这类缺陷造成的原因是开发技术在这方面欠缺的表现,虽然不常见,但一旦有这类缺陷,就很因此对运营的数据造成很多不必要的损失,所以,还 ...

  5. SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划

    我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为 ...

  6. TortoiseSVN,排除不想提交文件的方法(转)

    转自:tortoisesvnsubversionfilebuilddialoglist 下面是英文帮助: 利用TortoiseSVN的修改列表 功能可以实现,在新版本中TortoiseSVN特地预置了 ...

  7. 《HTML5高级程序设计》知识点概要(不涉及详细语法)

    不断更新. 说明:主要记录html5中的一些注意点或知识点,尽量不涉及具体语法信息. 一.CANVAS: 检测: try{ document.createElement("canvas&qu ...

  8. java笔试题: ——将e:/source文件夹下的文件打个zip包后拷贝到f:/文件夹下面

    将e:/source文件夹下的文件打个zip包后拷贝到f:/文件夹下面 import java.io.*; import java.util.zip.ZipEntry; import java.uti ...

  9. Redis的使用完整版

    [Redis基本] 1.redis安装完成后的几个文件: redis-benchmark  性能测试工具(批量写入)./bin/redis-benchmark -n 10000  即可一次性写入100 ...

  10. C#:屏幕显示区域问题

    更改电脑屏幕显示的文字大小后,平面显示区域问题. /// <summary> /// 屏幕显示尺寸 /// </summary> public static Size Revi ...