博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3225 Help with Intervals
阅读量:7174 次
发布时间:2019-06-29

本文共 3116 字,大约阅读时间需要 10 分钟。

POJ_3225

    对于开区间还是闭区间的问题,可以把所有的点都乘以2,这样就可以通过偶数端点判断是闭区间,通过奇数端点判断开区间。

    剩下的问题就是用线段树实现区间染色和区间取反的操作了。

#include
#include
#define MAXD 132000 #define N 131070 int tree[4 * MAXD], rev[4 * MAXD], to[4 * MAXD], a[MAXD]; void build(int cur, int x, int y) {
int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; tree[cur] = rev[cur] = 0; to[cur] = -1; if(x == y) return ; build(ls, x, mid); build(rs, mid + 1, y); } void pushdown(int cur) {
int ls = cur << 1, rs = (cur << 1) | 1; if(to[cur] != -1) {
to[ls] = to[rs] = to[cur]; rev[ls] = rev[rs] = 0; tree[ls] = tree[rs] = to[cur]; to[cur] = -1; } if(rev[cur]) {
rev[ls] = (rev[ls] + 1) & 1, rev[rs] = (rev[rs] + 1) & 1; tree[ls] ^= 1, tree[rs] ^= 1; rev[cur] = 0; } } void color(int cur, int x, int y, int s, int t, int c) {
int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; if(x >= s && y <= t) {
tree[cur] = to[cur] = c; rev[cur] = 0; return ; } pushdown(cur); if(mid >= s) color(ls, x, mid, s, t, c); if(mid + 1 <= t) color(rs, mid + 1, y, s, t, c); } void Reverse(int cur, int x, int y, int s, int t) {
int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; if(x >= s && y <= t) {
tree[cur] ^= 1; rev[cur] = (rev[cur] + 1) & 1; return ; } pushdown(cur); if(mid >= s) Reverse(ls, x, mid, s, t); if(mid + 1 <= t) Reverse(rs, mid + 1, y, s, t); } void dfs(int cur, int x, int y) {
int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; if(x == y) {
a[x] = tree[cur]; return ; } pushdown(cur); dfs(ls, x, mid); dfs(rs, mid + 1, y); } void printresult() {
int i, x, y, flag = 0; dfs(1, 0, N); for(i = 0; i <= N; i ++) {
if(a[i]) {
if(flag) printf(" "); else flag = 1; if(i & 1) printf("(%d,", i >> 1); else printf("[%d,", i >> 1); for(; a[i + 1]; i ++); if(i & 1) printf("%d)", (i + 1) >> 1); else printf("%d]", i >> 1); } } if(flag == 0) printf("empty set\n"); printf("\n"); } void solve() {
int x, y; char op[5], b[20]; while(scanf("%s%s", op, b) == 2) {
sscanf(b + 1, "%d,%d", &x, &y); if(b[0] == '(') x = (x << 1) | 1; else x <<= 1; if(b[strlen(b) - 1] == ')') y = (y << 1) - 1; else y <<= 1; if(op[0] == 'U') color(1, 0, N, x, y, 1); else if(op[0] == 'D') color(1, 0, N, x, y, 0); else if(op[0] == 'S') Reverse(1, 0, N, x, y); else if(op[0] == 'C') {
if(x > 0) color(1, 0, N, 0, x - 1, 0); if(y < N) color(1, 0, N, y + 1, N, 0); Reverse(1, 0, N, x, y); } else {
if(x > 0) color(1, 0, N, 0, x - 1, 0); if(y < N) color(1, 0, N, y + 1, N, 0); } } printresult(); } int main() {
build(1, 0, N); solve(); return 0; }

转载地址:http://xlbzm.baihongyu.com/

你可能感兴趣的文章
基于jQuery商品分类选择提交表单代码
查看>>
解读ASP.NET 5 & MVC6系列(4):核心技术与环境配置
查看>>
CDT+Eclipse代码自动提示
查看>>
shell 下执行mysql 命令
查看>>
[PHP] - PDO事务操作
查看>>
完美解决VMware Workstation : Could not open /dev/vmmon: No such file or directory
查看>>
SharePoint 2010用“localhost”方式访问网站,File not found问题处理方式
查看>>
【转】安卓手机有安全模式?安卓4.1安全模式介绍
查看>>
利用bat批处理做启动mongodb脚本
查看>>
C#中一道关于多线程的基础练习题——模拟仓库存销过程
查看>>
杭州驾校模拟考试
查看>>
qmake的使用
查看>>
MySql 命令行
查看>>
浅谈移动端开发页面
查看>>
让你提前知道软件开发(24):C语言和主要特征的历史
查看>>
启动weblogic11g一直提示<141281> <unable to get file lock, will retry ...>
查看>>
UVA 12898 And Or 数学暴力
查看>>
Windows 8(虚拟机环境)安装.NET Framework3.5(includes .NET 2.0 and 3.0)
查看>>
萧墙HTML5手机发展之路(53)——jQueryMobile页面之间的参数传递
查看>>
社会保障系列1《介绍》
查看>>