poj3225 Help with Intervals

2024-01-28 06:38
文章标签 help intervals poj3225

本文主要是介绍poj3225 Help with Intervals,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        题意:全集是[0,65535],初始集合为空集,进行各种集合运算,区间升序输出最后的集合。

        思路:线段树(区间更新)。把原来的范围扩大一倍来表示开闭区间应该是很容易想到的。关于集合运算,其实把那5中操作提炼一下,可以变成两种操作,一是区间赋值为1(0),二是区间取反。其中区间取反的更新操作我写退化了一次,然后超时了。。正确的做法是用另一个标记记录这个区间有没有被取反。我的线段树风格可能不是那么好看,只写了更新和查询两个函数。。


#include <iostream>    
#include <stdio.h>    
#include <cmath>    
#include <algorithm>    
#include <iomanip>    
#include <cstdlib>    
#include <string.h>     
#include <vector>    
#include <queue>    
#include <stack>    
#include <map>  
#include <set>  
#include <ctype.h>    
#define ll long longusing namespace std;  struct node{int l; int r;bool val;bool flag;bool inv;
};node tree[540000];void build_tree(int n,int l,int r){tree[n].l=l; tree[n].r=r;tree[n].val=0; tree[n].flag=1; tree[n].inv=0;if(l==r)return;int mid=(l+r)/2;build_tree(n*2,l,mid);build_tree(n*2+1,mid+1,r);
}void update(int n,int l,int r,int type ){if(tree[n].l==l&&tree[n].r==r){if(type==1){tree[n].val=1;tree[n].inv=0;tree[n].flag=1;}if(type==0){tree[n].val=0;tree[n].inv=0;tree[n].flag=1;}if(type==2)tree[n].inv^=1;return;}if(tree[n].l==tree[n].r)return;int mid=(tree[n].l+tree[n].r)/2;if(tree[n].flag){update(n*2,tree[n].l,mid,tree[n].val);update(n*2+1,mid+1,tree[n].r,tree[n].val);tree[n].flag=0;}if(tree[n].inv){tree[n*2].inv^=tree[n].inv;tree[n*2+1].inv^=tree[n].inv; tree[n].inv=0;}if(r<=mid){update(n*2,l,r,type);}else{if(l<=mid){update(n*2,l,mid,type);update(n*2+1,mid+1,r,type);}else{update(n*2+1,l,r,type);}}
}bool query(int n,int pos){if(tree[n].flag){if(tree[n].inv)return !tree[n].val;return tree[n].val;}int mid=(tree[n].l+tree[n].r)/2;if(pos<=mid){return tree[n].inv^query(n*2,pos);}else{return tree[n].inv^query(n*2+1,pos);}
}bool output(){bool s=query(1,0);bool fir=1;if(s){fir=0;printf("[0,");}for(int i=1;i<=132000;i++){if(query(1,i)!=s){if(s){printf("%d",i/2);if(i%2){printf("]");}else{printf(")");}}else{if(!fir)printf(" ");fir=0;if(i%2){printf("(");}else{printf("[");}printf("%d,",i/2);}s=!s;}}if(fir)return 0;printf("\n");return 1;
}int main(){char oper,c;build_tree(1,0,132000);while(~scanf("%c ",&oper)){char lb,rb;int ln,rn;scanf("%c%d%c%d%c%c",&lb,&ln,&c,&rn,&rb,&c);ln=ln*2; if(lb=='(')ln++;rn=rn*2; if(rb==')')rn--;if(ln>rn)continue;if(oper=='U'){update(1,ln,rn,1);}else if(oper=='I'){update(1,0,ln-1,0);update(1,rn+1,132000,0);}else if(oper=='D'){update(1,ln,rn,0);}else if(oper=='C'){update(1,0,ln-1,0);update(1,rn+1,132000,0);update(1,ln,rn,2);}else if(oper=='S'){update(1,ln,rn,2);}	}if(!output()){printf("empty set\n");}return 0;
}


这篇关于poj3225 Help with Intervals的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652783

相关文章

HDU 1712 ACboy needs your help (分组背包)

OJ题目:click here~~ 题意分析:分组背包入门题。N个课程,最多可使用M天的时间。给出i课程用j天所获得的profit 。 求最多使用M天的最大profit。对课程i ,1--M天的profit 只能选一个,或者不选。也就是说有的课程不上也没有关系。明显的分组背包。 AC_CODE int x[101][101];int main(){int n , m;while(c

默默的学python——两个重要的函数dir()、help()

一、dir()函数 dir()函数在Python中用于返回一个对象的所有属性和方法的列表,当你对一个函数使用dir()时,它会返回函数对象的所有可访问的属性和方法的名字列表。 具体的说,dir()函数获取的内容包括: 1.特殊方法和魔法方法 如 call、code、defaults、doc、globals、__name__等,这些方法和属性是函数对象的一部分,提供了对函数元数据的访问。

第一个golang项目增加help指令并调整指令模式

第一个golang项目增加help指令并调整指令模式 调整指令模式增加help指令减少了配置文件的解析读取次数新指令模式打包并运行 上一篇文章 调整指令模式 version指令修改为-v和-versionreplace指令修改为-r和-replacedir参数修改为-d和 -directory package commandsimport ("flag""fmt""lo

leetcode 刷题之路 32 Merge Intervals

Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18]. 给定一组整数对代表的区间,合并重合的区间。 我的做法是首先以区间的起始位置为基准进行排序,遍历排序后的

Help is needed for Dexter

原文请访问我的博客   http://xiaoshig.sinaapp.com/ Description Problem H Help is needed for Dexter Time Limit: 3 Second   Dexter is tired of Dee Dee. So he decided to keep Dee Dee busy

Command line option syntax error.type Command /? for help

电脑装思维导图的时候,报错显示“Command line option syntax error.Type Command /? for help.”就查了一下,原来是系统没有C++2005,需要安装,就上网下载了一个vcredist_x86.exe,但是双击安装,仍然出现这个错误。 没办法,接着上网查吧,是什么原因呢?网上说是因为该文件安装不支持中文安装路径,然后我就把文件夹改成了英文名称

【LeetCode】Merge Intervals Insert Interval

1、Merge Intervals Total Accepted: 6989 Total Submissions: 34958 My Submissions Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8,10],[15,18],

Help with Intervals 线段树并查集

Time Limit: 6000MS Memory Limit: 131072KTotal Submissions: 9784 Accepted: 2320Case Time Limit: 2000MS Description

npm error network ‘proxy‘ config is set properly. See: ‘npm help config‘

使用" npm install " 或者 "  npm i " 初始化项目依赖失败 npm error network 'proxy' config is set properly. See: 'npm help config' 出现这样的解决方法如下:  1.查看代理 //代理npm config get proxy //缓存npm config get npm confi