/// <summary>
/// 整数区间类
/// </summary>
private class Interval
{
private int _start = , _end = ;
public int Start
{
get { return Math.Min(this._start, this._end); }
set { this._start = value; }
}
public int End
{
get { return Math.Max(this._start, this._end); }
set { this._end = value; }
}
public bool Inside(int Value)
{
return (Start <= Value && Value <= End);
}
/// <summary>
/// 区间求并运算,此方法不修改当前实例的值。
/// 若不可合并则返回null,否则返回新的区间。
/// </summary>
/// <param name="OtherInterval">另一个区间</param>
/// <returns>新的区间实例</returns>
public Interval Merge(Interval OtherInterval)
{
if (this.Start - OtherInterval.End > || OtherInterval.Start - this.End > )
{
return null;
}
else
{
return new Interval()
{
Start = Math.Min(this.Start, OtherInterval.Start),
End = Math.Max(this.End, OtherInterval.End)
};
}
}
}
/// <summary>
/// 区间集合类
/// </summary>
private class IntervalCollection
{
public List<Interval> Intervals = new List<Interval>();
/// <summary>
/// 将一个区间并入区间集合中
/// </summary>
/// <param name="Start">开始位置</param>
/// <param name="End">结束位置</param>
public void Add(int Start, int End)
{
this.Add(new Interval() { Start = Start, End = End });
}
/// <summary>
/// 将一个区间并入区间集合中
/// </summary>
/// <param name="NewInterval">需要并入的区间结构</param>
public void Add(Interval NewInterval)
{
Interval MergeInterval = null;
for (int i = ; i < this.Intervals.Count; i++)
{
MergeInterval = this.Intervals[i].Merge(NewInterval);
if (MergeInterval != null)
{
this.Intervals[i] = MergeInterval;
break;
}
}
if (MergeInterval == null)
{
Intervals.Add(NewInterval);
}
}
/// <summary>
/// 检测区间集中是否包含有指定值
/// </summary>
/// <param name="Value">需要查询的数值</param>
/// <returns>包含返回true,否则返回false</returns>
public bool Inside(int Value)
{
foreach (Interval Inter in Intervals)
{
if (Inter.Inside(Value) == true)
{
return true;
}
}
return false;
}
/// <summary>
/// 将区间集的转换为字符串
/// </summary>
/// <typeparam name="T">转换类型</typeparam>
/// <param name="CompleteSet">全集,当序列化后若长度过长则用以求取补集</param>
/// <returns>返回转换后的字符串</returns>
public string ToString<T>(string CompleteSet = null)
{
StringBuilder Str = new StringBuilder("[");
foreach (Interval Inter in Intervals)
{
if (Inter.Start == Inter.End)
{
dynamic Vs = (object)Inter.Start;
Str.Append((T)Vs);
}
else if (Inter.End - Inter.Start == )
{
dynamic Vs = (object)Inter.Start;
dynamic Ve = (object)Inter.End;
Str.Append((T)Vs).Append((T)Ve);
}
else
{
dynamic Vs = (object)Inter.Start;
dynamic Ve = (object)Inter.End;
Str.AppendFormat("{0}-{1}", (T)Vs, (T)Ve);
}
}
Str.Append("]");
if (Str[] == '^')
{
Str = Str.Replace("^", "\\^", , );
}
// 求取补集以试图缩小代码长度
if (Str.Length >= && CompleteSet != null)
{
StringBuilder Complement = new StringBuilder("[^");
foreach (char c in CompleteSet)
{
if (this.Inside(c) == false)
{
Complement.Append(c);
}
}
Complement.Append("]");
if (Complement.Length <= Str.Length)
{
return Complement.ToString();
}
}
return Str.ToString();
}
}

整数区间及区间集合(C#实现)的更多相关文章

  1. pandas处理时间序列(2):DatetimeIndex、索引和选择、含有重复索引的时间序列、日期范围与频率和移位、时间区间和区间算术

    一.时间序列基础 1. 时间戳索引DatetimeIndex 生成20个DatetimeIndex from datetime import datetime dates = pd.date_rang ...

  2. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  3. [用CDQ分治解决区间加&区间求和]【习作】

    [前言] 作为一个什么数据结构都不会只会CDQ分治和分块的蒟蒻,面对区间加&区间求和这么难的问题,怎么可能会写线段树呢 于是,用CDQ分治解决区间加&区间求和这篇习作应运而生 [Par ...

  4. 线段树 区间开方区间求和 & 区间赋值、加、查询

    本文同步发表于 https://www.zybuluo.com/Gary-Ying/note/1288518 线段树的小应用 -- 维护区间开方区间求和 题目传送门 约定: sum(i,j) 表示区间 ...

  5. 树状数组区间加法&区间求和操作

    树状数组区间加法&区间求和操作 一般的树状数组解决区间加&单点询问并不复杂 但是要解决区间求和... 我们假设原数组是\(\{a_i\}\),差分数组\(\{d_i=a_i-a_{i- ...

  6. HDU.1689 Just a Hook (线段树 区间替换 区间总和)

    HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...

  7. hdu 1698 线段树 区间更新 区间求和

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. 「模板」 线段树——区间乘 && 区间加 && 区间求和

    「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...

  9. HDU 3397 Sequence operation(区间合并 + 区间更新)

    题目链接:pid=3397">http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给定n个数,由0,1构成.共同拥有5种操作. 每一个操 ...

随机推荐

  1. What's DB2 模式?

    近期负责一个银行方面的项目,需要用到DB2实现多数据库版本切换.初步接触DB2,对于它的管理工具(IBM DATA STUDIO)虽然与ORACLE\MSSQL大同小异,但还是有些东西不一样的.比如什 ...

  2. SQL SERVER while循环

    在SQL数据库中,可以通过WHILE实现循环,下面就将为您介绍SQL循环执行while控制,希望对您提升WHILE的使用水平能够有些帮助. WHILE Boolean_expression    { ...

  3. 拥抱模块化的JavaScript

    前言 我们再一次被计算机的名词.概念笼罩. Backbone.Emberjs.Spinejs.Batmanjs 等MVC框架侵袭而来.CommonJS.AMD.NodeJS.RequireJS.Sea ...

  4. 如何在PSD中准确切出图片

    步骤如下: 1.Ctrl+alt+鼠标滚轮 放大图片,按住H键拖动图片选取位置: 2.选择“移动工具” (勾选“自动选择”,“图层”): 3.选中后,选择图层,右击,选择“转换为智能对象”: 4.使用 ...

  5. DOM&SAX解析XML

    在上一篇随笔中分析了xml以及它的两种验证方式.我们有了xml,但是里面的内容要怎么才能得到呢?如果得不到的话,那么还是没用的,解析xml的方式主要有DOM跟SAX,其中DOM是W3C官方的解析方式, ...

  6. createjs 下雪 实例

    demo:  http://output.jsbin.com/davixatona <!DOCTYPE html> <html> <head> <meta c ...

  7. ubuntu 之旅 —— eclipse没有菜单栏

    1. 新建一个eclipse.sh文件,加入如下内容,下面的路径是elcipse的路径 export UBUNTU_MENUPROXY=0 /home/wangdeshui/eclipse/eclip ...

  8. Linux 消息队列编程

    消息队列.信号量以及共享内存被称作 XSI IPC,它们均来自system V的IPC功能,因此具有许多共性. 键和标识符: 内核中的每一种IPC结构(比如信号量.消息队列.共享内存)都用一个非负整数 ...

  9. predis如何实现phpredis的pconnect方法

    predis和phpredis都是redis的php客户端,区别可以看这里,这里不赘述. phpredis是php扩展,由C语言编写,诞生较早,很多PHPer都熟悉. predis是用PHP语言编写, ...

  10. php中遇到include_path='.;C:\php5\pear'的错误

    所有面页,包括空白的都会报类似下面的错误. Warning: Unknown: failed to open stream: No such file or directory in Unknown  ...