/// <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. 检测SqlServer服务器IO是否瓶颈

    通过性能监视器监视 Avg. Disk Queue Length   小于2 Avg. Disk sec/Read , Avg. Disk sec/Write  小于10ms 可以用数据收集器定时收集 ...

  2. 带参数的查询防止SQL注入攻击

    把单引号替换成两个单引号,虽然能起到一定的防止SQL注入攻击的作用,但是更为有效的办法是把要拼接的内容做成“参数” SQLCommand支持带参数的查询,也就是说,可以在查询语句中指定参数: 参数的设 ...

  3. UIimageView GIF动画

    1.代码如下 (注释都有) - (void)viewDidLoad { [super viewDidLoad]; UIImageView * bigImageView = [[UIImageView ...

  4. Set集合中的HashSet集合

    HashSet集合的特点:元素是具备唯一性的,每次存储都要先算出哈希值,看有没相同,没有相同的存储到相应的位置,如果相同则再判断存储进来的值是否与被比较的相同,如果相同,则不再存储,不同就存储 pac ...

  5. QT QString转char*,char*转QString;简单明了,看代码。

    //原始QStringQString qs = QString::fromLocal8Bit("我的");std::string strQs = qs.toStdString(); ...

  6. localStorage.ie6.js

    !window.localStorage && function() { window.localStorage = {}; var prefix = 'data-userdata' ...

  7. Net常用资源小集

    Visual Studio——IDEs工具之王,.NET开发者的必备IDE.Visual Studio提供非常强大的启动工具箱,并且还有一些让人惊喜的插件支持.在去年,微软发布了Visual Stud ...

  8. 笔记一:Python的PyDev插件在eclipse上面安装(新的插件地址 location)

    注:部分内容参考网上的,若有侵权,请作者联系我,马上进行删改 安装PyDev: 首先需要去Eclipse官网下载:http://www.eclipse.org/,Eclipse需要JDK支持,如果Ec ...

  9. codeblocks调试(转载)

    单步调试  1)设置断点  在需要设置断点处,右击左边行号,Add breakpoint,则出现一个红色的点(可以同时设置多个,前提是不能在debug的运行模式下). 2)调试运行 Debug-> ...

  10. Safari浏览器的调试

    最近做浏览器兼容的时候发现Safari的脚本调试工具比较难找,因此与大家分享一下 1.找到脚本调试的选项 2.勾选此选项 3.在页面空白处右击打开调试窗口 4.看到下方的调试窗口了 细心的读者会发现, ...