/// <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. fekit前端代码模块化工具

    fekit是一套前端开发工具,是由去哪儿网开发.目前在github上开源.使用fekit的优点: a.本地开发支持环境:从开发调试到上线,均是前后端工程独立开发.调试.部署,打破了原来前后端揉在一个工 ...

  2. librarynotfoundforlPodsAFNetworking解决放案

    http://www.it165.net/pro/html/201503/36422.html

  3. "Unable to get image data from canvas because the canvas has been tainted by cross-origin data"问题产生原因及解决办法

    一.问题描述: 在支持html5的浏览器中运行javascript脚本,脚本主要是操作网页上的标签canvas,出错的操作为, getImageData(img,……), chrome 下出错信息为: ...

  4. ACM Sdut 2158 Hello World!(数学题,排序) (山东省ACM第一届省赛C题)

    题目描述 We know thatIvan gives Saya three problems to solve (Problem F), and this is the firstproblem. ...

  5. printf 输出格式

    printf 输出格式C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型,其中方括号[]中的项为可选项.各项的意义介绍如下:1.类型类型字符用以表示输出数据的类型,其格式符 ...

  6. 添加标签2 jquery 和JS

    TAG添加标签 做了个方法方便调用 一.JS版本 <!DOCTYPE html> <html lang="en"> <head> <met ...

  7. [CSS]position定位

    CSS position 属性 通过使用 position 属性,我们可以选择 4 种不同类型的定位,这会影响元素框生成的方式. position 属性值的含义: static 元素框正常生成.块级元 ...

  8. 【python之旅】python的基础一

    一.关于模块那些事 python的强大之处在于他有着丰富且强大的标准库和第三方库,很对功能都有相应的python库支持 例如: sys模块: # Author :GU import sys print ...

  9. Socket理解

    简介 本文主要介绍的socket编程的实现相关的内容: 理论 函数 socket 用来创建socket描述符,它唯一标识一个socket int socket(int domain, int type ...

  10. patchca整合Spring MVC生成超炫的验证码

    转载:http://lavasoft.blog.51cto.com/62575/1406947 @Controller public class Login2Controller {     priv ...