用C#实现对MSSqlServer数据库的增删改查---DAL层
说明:本人完成的工作是对传感器--超声波物位计进行硬件集成,上位机通过串口接收传感器数据并将其存到数据库中;在DAL层实现对数据库的增删改查,其中包含两个数据表分别是WaterLevelSet表和WaterLevelRecord表,以下代码即是完成对两张表进行数据操作。
/*----------------------------------------------------------------
// Copyright (C) 2013 *************
// 版权所有。
//
// 文件名:WaterLevelDao.cs
// 文件功能描述:定义水位计设置信息相关的数据访问对象
//
// 创建标识:2013-9-22
//
// 修改标识:2013-9-23
// 修改描述:添加GetAllWaterLevelSetInfo,AddWaterLevelSetInfo,
//ModifyWaterLevelSetInfo,DelWaterLevelSetInfo等方法
//
// 修改标识:2013-9-24
// 修改描述:修改可空字段的数据绑定
//修改标识:2013-9-26
// 修改描述:修改AddWaterLevelSet,去掉SELECT @@IDENTITY
//
//----------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMOS.Model.Device;
using System.Data.SqlClient;
using System.Data; namespace SMOS.DAL.Device
{
public class WaterLevelSetDao
{
/// <summary>
/// 根据设备ID获取水位计设置信息
/// </summary>
/// <param name="deviceID"></param>
/// <returns>水位计设置信息</returns>
public WaterLevelSetInfo GetWaterLevelSetInfo(int deviceID)
{
string sql =
@"select t.DeviceID,t.BaseLevel,t.Remark,t.Port,
t.BaudRate,t.DataBites,t.ParityBit,t.StopBits,t.AcquisitionInterval,
t.ConnectType,t.CreateBy,t.CreateTime,t.UpdateBy,t.UpdateTime
from dbo.WaterLevelSet t(nolock)
where t.DeviceID=@DeviceID"; IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = deviceID}
}; WaterLevelSetInfo entity = null;
DataSet ds = DBHelper.ExecuteDataset(sql,paras.ToArray()); if (ds == null || ds.Tables.Count <= || ds.Tables[].Rows.Count <= )
return entity;
return DataRowBinding(ds.Tables[].Rows[]);
}
/// <summary>
/// 获取所有水位计设置信息
/// </summary>
/// <returns>水位计设置列表</returns>
public IList<WaterLevelSetInfo> GetAllWaterLevelSetInfo()
{
string sql =
@"select t.DeviceID,t.BaseLevel,t.Remark,t.Port,
t.BaudRate,t.DataBites,t.ParityBit,t.StopBits,t.AcquisitionInterval,
t.ConnectType,t.CreateBy,t.CreateTime,t.UpdateBy,t.UpdateTime
from dbo.WaterLevelSet t(nolock)
where 1=1";
IList<WaterLevelSetInfo> lstWaterLevelSetInfo = new List<WaterLevelSetInfo>();
DataSet ds = DBHelper.ExecuteDataset(sql);
if (ds == null || ds.Tables.Count <= )
return lstWaterLevelSetInfo;
foreach (DataRow dr in ds.Tables[].Rows)
{
WaterLevelSetInfo entity = DataRowBinding(dr);
if (entity != null)
lstWaterLevelSetInfo.Add(entity);
}
return lstWaterLevelSetInfo;
}
/// <summary>
/// 增加水位计设置信息
/// </summary>
/// <param name="waterLevelSetInfo">水位计设置信息</param>
/// <returns>操作记录数</returns>
public int AddWaterLevelSetInfo(WaterLevelSetInfo waterLevelSetInfo)
{
if (waterLevelSetInfo == null)
{
return ;
}
string sql=
@"INSERT INTO dbo.WaterLevelSet
(DeviceID,BaseLevel,Remark,Port,BaudRate,
DataBites,ParityBit,StopBits,AcquisitionInterval,
ConnectType,CreateBy,CreateTime
)
VALUES
(@DeviceID,@BaseLevel,@Remark,@Port,@BaudRate,
@DataBites,@ParityBit,@StopBits,@AcquisitionInterval,
@ConnectType,@CreateBy,@CreateTime
)";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = waterLevelSetInfo.DeviceID},
new SqlParameter("@BaseLevel",SqlDbType.Decimal){Value = waterLevelSetInfo.BaseLevel},
new SqlParameter("@Remark",SqlDbType.NVarChar,){Value = waterLevelSetInfo.Remark},
new SqlParameter("@Port",SqlDbType.Int){Value = waterLevelSetInfo.Port},
new SqlParameter("@BaudRate",SqlDbType.Int){Value = waterLevelSetInfo.BaudRate},
new SqlParameter("@DataBites",SqlDbType.Int){Value = waterLevelSetInfo.DataBits},
new SqlParameter("@ParityBit",SqlDbType.Int){Value = waterLevelSetInfo.ParityBit},
new SqlParameter("@StopBits",SqlDbType.Int){Value = waterLevelSetInfo.StopBits},
new SqlParameter("@AcquisitionInterval",SqlDbType.Int){Value = waterLevelSetInfo.AcquisitionInterval},
new SqlParameter("@ConnectType",SqlDbType.TinyInt){Value = waterLevelSetInfo.ConnectType.GetHashCode()},
new SqlParameter("@CreateBy",SqlDbType.NVarChar,){Value = Global.GlobalInfo.loginInfo.LoginAccount},
new SqlParameter("@CreateTime",SqlDbType.DateTime){Value = DateTime.Now},
}; return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
/// <summary>
/// 修改水位计设置信息
/// </summary>
/// <param name="waterLevelSetInfo">水位计设置信息</param>
/// <returns>操作记录</returns>
public int ModifyWaterLevelSetInfo(WaterLevelSetInfo waterLevelSetInfo)
{
if (waterLevelSetInfo == null)
{
return ;
}
string sql =
@"UPDATE dbo.WaterLevelSet
SET DeviceID=@DeviceID
,BaseLevel=@BaseLevel
,Remark=@Remark
,Port=@Port
,BaudRate=@BaudRate
,DataBites=@DataBites
,ParityBit=@ParityBit
,StopBits=@StopBits
,AcquisitionInterval=@AcquisitionInterval
,ConnectType=@ConnectType
,UpdateBy=@UpdateBy
,UpdateTime=@UpdateTime
WHERE DeviceID=@DeviceID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = waterLevelSetInfo.DeviceID},
new SqlParameter("@BaseLevel",SqlDbType.Decimal){Value = waterLevelSetInfo.BaseLevel},
new SqlParameter("@Remark",SqlDbType.NVarChar,){Value = waterLevelSetInfo.Remark},
new SqlParameter("@Port",SqlDbType.Int){Value = waterLevelSetInfo.Port},
new SqlParameter("@BaudRate",SqlDbType.Int){Value = waterLevelSetInfo.BaudRate},
new SqlParameter("@DataBites",SqlDbType.Int){Value = waterLevelSetInfo.DataBits},
new SqlParameter("@ParityBit",SqlDbType.Int){Value = waterLevelSetInfo.ParityBit},
new SqlParameter("@StopBits",SqlDbType.Int){Value = waterLevelSetInfo.StopBits},
new SqlParameter("@AcquisitionInterval",SqlDbType.Int){Value = waterLevelSetInfo.AcquisitionInterval},
new SqlParameter("@ConnectType",SqlDbType.TinyInt){Value = waterLevelSetInfo.ConnectType.GetHashCode()},
new SqlParameter("@UpdateBy",SqlDbType.NVarChar,){Value = Global.GlobalInfo.loginInfo.LoginAccount},
new SqlParameter("@UpdateTime",SqlDbType.DateTime){Value = DateTime.Now},
};
return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
/// <summary>
/// 删除水位计设置信息
/// </summary>
/// <param name="waterLevelSetInfo">水位计设置信息</param>
/// <returns>操作记录</returns>
public int DelWaterLevelSetInfo(WaterLevelSetInfo waterLevelSetInfo)
{
if (waterLevelSetInfo == null)
{
return ;
}
string sql =
@"DELETE FROM dbo.WaterLevelSet
WHERE DeviceID = @DeviceID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = waterLevelSetInfo.DeviceID },
}; return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
#region 数据绑定
private WaterLevelSetInfo DataRowBinding(DataRow dr)
{
if (dr == null)
{
return null;
} WaterLevelSetInfo entity = new WaterLevelSetInfo();
entity.DeviceID = Convert.ToInt32(dr["DeviceID"]);
entity.BaseLevel = Convert.ToDecimal(dr["BaseLevel"]); if (dr["Remark"] != DBNull.Value)
{
entity.Remark = dr["Remark"].ToString();
}
else
{
entity.Remark = string.Empty;
}
entity.Port = Convert.ToInt32(dr["Port"]);
entity.BaudRate = Convert.ToInt32(dr["BaudRate"]);
if (dr["DataBites"] != DBNull.Value)
{
entity.DataBits = Convert.ToInt32(dr["DataBites"]);
}
if (dr["ParityBit"] != DBNull.Value)
{
entity.ParityBit = Convert.ToInt32(dr["ParityBit"]);
}
if (dr["StopBits"] != DBNull.Value)
{
entity.StopBits = Convert.ToInt32(dr["StopBits"]);
}
if (dr["AcquisitionInterval"] != DBNull.Value)
{
entity.AcquisitionInterval = Convert.ToInt32(dr["AcquisitionInterval"]);
}
if (dr["ConnectType"] != DBNull.Value)
{
entity.ConnectType = SMOS.Model.Eunm.ConvertToEnum<SMOS.Model.Eunm.DeviceConnectType>(dr["ConnectType"]);
}
if (dr["CreateBy"] != DBNull.Value)
{
entity.CreateBy = dr["CreateBy"].ToString();
}
else
{
entity.CreateBy = string.Empty;
}
entity.CreateTime = Convert.ToDateTime(dr["CreateTime"]);
if (dr["UpdateBy"] != DBNull.Value)
{
entity.UpdateBy = dr["UpdateBy"].ToString();
}
else
{
entity.UpdateBy = string.Empty;
}
if (dr["UpdateTime"] != DBNull.Value)
{
entity.UpdateTime = Convert.ToDateTime(dr["UpdateTime"]);
}
return entity;
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMOS.Model.Device;
using System.Data.SqlClient;
using System.Data; namespace SMOS.DAL.Device
{
public class WaterLevelRecordDao
{
/// <summary>
/// 查出水位计记录信息的最后一条记录
/// </summary>
/// <param name="deviceID">设备ID</param>
/// <returns>操作记录</returns>
public WaterLevelRecordInfo GetLastWaterLevelRecordInfo(int deviceID)
{
string sql =
@"select top 1
t.RecordID,t.DeviceID,t.MeasuredLevel,t.RecordTime,
t.CreateBy,t.CreateTime,t.Remark
from dbo.WaterLevelRecord t(nolock)
where t.DeviceID=@DeviceID
order by t.CreateTime desc"; IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = deviceID}
}; WaterLevelRecordInfo entity = null;
DataSet ds = DBHelper.ExecuteDataset(sql, paras.ToArray()); if (ds == null || ds.Tables.Count <= || ds.Tables[].Rows.Count <= )
{
return entity;
}
return DataRowBinding(ds.Tables[].Rows[]); }
/// <summary>
/// 查询水位计的记录信息
/// </summary>
/// <param name="deviceID">设备ID</param>
/// <returns>记录信息</returns>
public IList<WaterLevelRecordInfo> GetWaterLevelRecordInfos(int deviceID)
{
string sql =
@"select t.RecordID,t.DeviceID,t.MeasuredLevel,t.RecordTime,
t.CreateBy,t.CreateTime,t.UpdateBy,t.UpdateTime,t.Remark
from dbo.WaterLevelRecord t(nolock)
where t.DeviceID=@DeviceID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = deviceID}
};
IList<WaterLevelRecordInfo> lstWaterLevelRecordInfo = new List<WaterLevelRecordInfo>();
DataSet ds = DBHelper.ExecuteDataset(sql, paras.ToArray()); if (ds == null || ds.Tables.Count <= )
return lstWaterLevelRecordInfo;
foreach (DataRow dr in ds.Tables[].Rows)
{
WaterLevelRecordInfo entity = DataRowBinding(dr);
if (entity != null)
{
lstWaterLevelRecordInfo.Add(entity);
}
}
return lstWaterLevelRecordInfo;
}
/// <summary>
/// 分时间查出水位计相应记录信息
/// </summary>
/// <param name="deviceID">设备ID</param>
/// <param name="startTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <returns>记录信息</returns>
public IList<WaterLevelRecordInfo> GetWaterLevelRecordInfos(int deviceID, DateTime startTime, DateTime endTime)
{
string sql =
@"select t.RecordID,t.DeviceID,t.MeasuredLevel,t.RecordTime,
t.CreateBy,t.CreateTime,t.Remark
from dbo.WaterLevelRecord t(nolock)
where t.DeviceID=@DeviceID and RecordTime between @startTime and @endTime";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = deviceID},
new SqlParameter("@startTime",SqlDbType.DateTime){Value = startTime },
new SqlParameter("@endTime",SqlDbType.DateTime){Value = endTime }
};
IList<WaterLevelRecordInfo> lstWaterLevelRecordInfos = new List<WaterLevelRecordInfo>();
DataSet ds = DBHelper.ExecuteDataset(sql, paras.ToArray());
if (ds == null || ds.Tables.Count <= )
{
return lstWaterLevelRecordInfos;
}
foreach (DataRow dr in ds.Tables[].Rows)
{
WaterLevelRecordInfo entity = DataRowBinding(dr);
if (entity != null)
{
lstWaterLevelRecordInfos.Add(entity);
}
}
return lstWaterLevelRecordInfos;
}
/// <summary>
/// 增加水位计记录信息
/// </summary>
/// <param name="recordInfo">水位计记录信息</param>
/// <returns>操作记录</returns>
public int AddWaterLevelRecordInfo(WaterLevelRecordInfo recordInfo)
{
if (recordInfo == null)
{
return ;
}
string sql =
@"INSERT INTO dbo.WaterLevelRecord
(DeviceID,MeasuredLevel,RecordTime,
CreateBy,CreateTime,Remark
)
VALUES
(@DeviceID,@MeasuredLevel,@RecordTime,
@CreateBy,@CreateTime,@Remark
)
SELECT @@IDENTITY";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = recordInfo.DeviceID},
new SqlParameter("@MeasuredLevel",SqlDbType.Decimal){Value = recordInfo.MeasuredLevel},
new SqlParameter("@RecordTime",SqlDbType.DateTime){Value = recordInfo.RecordTime},
new SqlParameter("@CreateTime",SqlDbType.DateTime){Value = DateTime.Now},
new SqlParameter("@CreateBy",SqlDbType.NVarChar,){Value = Global.GlobalInfo.loginInfo.LoginAccount},
new SqlParameter("@Remark",SqlDbType.NChar,){Value = recordInfo.Remark},
};
object ret = DBHelper.ExecuteScalar(sql, paras.ToArray());//返回非表类查询结果,自增的ID
if (ret != null && int.Parse(ret.ToString()) >= )
{
return int.Parse(ret.ToString());
}
return ;
}
/// <summary>
/// 更新水位计记录
/// </summary>
/// <param name="recordInfo">水位计记录信息</param>
/// <returns>操作记录</returns>
public int ModifyWaterLevelRecordInfo(WaterLevelRecordInfo recordInfo)
{
if (recordInfo == null)
{
return ;
}
string sql =
@"UPDATE dbo.WaterLevelRecord
SET DeviceID=@DeviceID
,MeasuredLevel=@MeasuredLevel
,RecordTime=@RecordTime
,UpdateBy=@UpdateBy
,UpdateTime=@UpdateTime
,Remark=@Remark
WHERE RecordID=@RecordID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@RecordID",SqlDbType.Int){Value = recordInfo.RecordID},
new SqlParameter("@DeviceID",SqlDbType.Int){Value = recordInfo.DeviceID},
new SqlParameter("@MeasuredLevel",SqlDbType.Decimal){Value = recordInfo.MeasuredLevel},
new SqlParameter("@RecordTime",SqlDbType.DateTime){Value = recordInfo.RecordTime},
new SqlParameter("@UpdateTime",SqlDbType.DateTime){Value = DateTime.Now},
new SqlParameter("@UpdateBy",SqlDbType.NVarChar,){Value = Global.GlobalInfo.loginInfo.LoginAccount},
new SqlParameter("@Remark",SqlDbType.NVarChar,){Value = recordInfo.Remark},
};
return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
/// <summary>
/// 删除水位计记录信息
/// </summary>
/// <param name="recordInfo">水位计记录信息</param>
/// <returns>操作记录</returns>
public int DelWaterLevelRecordInfo(WaterLevelRecordInfo recordInfo)
{
if (recordInfo == null)
{
return ;
}
string sql =
@"DELETE FROM dbo.WaterLevelRecord
WHERE RecordID=@RecordID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@RecordID",SqlDbType.Int){Value = recordInfo.RecordID },
}; return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
#region 数据绑定
private WaterLevelRecordInfo DataRowBinding(DataRow dr)
{
if (dr == null)
{
return null;
}
WaterLevelRecordInfo entity = new WaterLevelRecordInfo();
entity.DeviceID = Convert.ToInt32(dr["DeviceID"]);
entity.MeasuredLevel=Convert.ToDecimal(dr["MeasuredLevel"]);
if (dr["Remark"] != DBNull.Value)
{
entity.Remark = dr["Remark"].ToString();
}
else
{
entity.Remark = string.Empty;
}
entity.RecordTime = Convert.ToDateTime(dr["RecordTime"]);
if (dr["CreateBy"] != DBNull.Value)
{
entity.CreateBy= dr["CreateBy"].ToString();
}
else
{
entity.CreateBy = string.Empty;
}
entity.CreateTime = Convert.ToDateTime(dr["CreateTime"]);
if (dr["UpdateBy"] != DBNull.Value)
{
entity.UpdateBy = dr["UpdateBy"].ToString();
}
else
{
entity.UpdateBy = string.Empty;
}
if (dr["UpdateTime"] != DBNull.Value)
{
entity.UpdateTime = Convert.ToDateTime(dr["UpdateTime"]);
} return entity;
}
#endregion
}
}
若需转载请标明出处或链接http://www.cnblogs.com/EaIE099/,本人初入职场,对编程也是一个菜鸟,只想把自己所学点滴记录下来,如有不合理的地方希望各位高手多多指点,非常感谢!
用C#实现对MSSqlServer数据库的增删改查---DAL层的更多相关文章
- 用C#实现对MSSqlServer数据库的增删改查---Server层(WaterLevelRecordServer.cs、DeviceRecordServer.cs)
抛开现实的残酷与无奈,对技术孜孜不倦的追求,从专注到执着,从疯狂到忘我,始终坚信代码可以改变世界,更能改变自己的人生. WaterLevelRecordServer.cs using System; ...
- 用C#实现对MSSqlServer数据库的增删改查---Server层(WaterLevelSetServer.cs、DeviceSetServer.cs)
在Server层定义WaterLevelSetServer和WaterLevelRecordServer两个子类,分别继承DeviceSetServer和DeviceRecordServer. usi ...
- SQLite帮助类SQlitehelper 实现对SQLite数据的增删改查
public class SQLiteHelper { public const string sConn = "Data Source=" + @"path" ...
- python web.py操作mysql数据库,实现对数据库的增删改查操作
使用web.py框架,实现对mysql数据库的增删改查操作: 该示例代码中连接的是本地数据库testdb,user表,表结构比较简单,只有两个字段:mobile和passwd,类型均为字符型 实际应用 ...
- Java操作数据库实现"增删改查"
本文主要讲解JDBC操作数据库 主要实现对MySql数据库的"增删改查" 综合概述: JDBC的常用类和接口 一 DriverManager类 DriverManage类 ...
- ThinkPHP实现对数据库的增删改查
好久都没有更新博客了,之前老师布置的任务总算是现在可以说告一段落了,今天趁老师还没提出其他要求来更新一篇博客. 今天我想记录的是我之前做项目,自己所理解的ThinkPHP对数据库的增删改查. 首先要说 ...
- Android学习---数据库的增删改查(sqlite CRUD)
上一篇文章介绍了sqlite数据库的创建,以及数据的访问,本文将主要介绍数据库的增删改查. 下面直接看代码: MyDBHelper.java(创建数据库,添加一列phone) package com. ...
- Android 系统API实现数据库的增删改查和SQLite3工具的使用
在<Android SQL语句实现数据库的增删改查>中介绍了使用sql语句来实现数据库的增删改查操作,本文介绍Android 系统API实现数据库的增删改查和SQLite3工具的使用. 系 ...
- Android SQL语句实现数据库的增删改查
本文介绍android中的数据库的增删改查 复习sql语法: * 增 insert into info (name,phone) values ('wuyudong','111') * 删 delet ...
随机推荐
- postman优缺点
postman优缺点分析 优点:门槛低,上手快 优点: 脚本语言是js 优点:自带各种代码模块 优点:跨平台 优点: 免费版就已经非常强大了,支持http,https协议 优点:有命令行版本,newm ...
- 【Linux】无法将 Ethernet0 连接到虚拟网络“VMnet8”
Linux安装centos之后,可能会出现ipconfig命令之后没有看到eth0信息,只有lo.log日志包的错为:无法将 Ethernet0 连接到虚拟网络“VMnet8” 解决办法有: 1.在虚 ...
- BZOJ3811 玛里苟斯(线性基+概率期望)
k=1的话非常好做,每个有1的位都有一半可能性提供贡献.由组合数的一些性质非常容易证明. k=2的话,平方的式子展开可以发现要计算的是每一对位提供的贡献,于是需要计算每一对位被同时选中的概率.找出所有 ...
- C++解析(15):二阶构造模式
0.目录 1.构造函数与半成品对象 2.二阶构造 3.小结 1.构造函数与半成品对象 关于构造函数: 类的构造函数用于对象的初始化 构造函数与类同名并且没有返回值 构造函数在对象定义时自动被调用 问题 ...
- jsp - redirect重定向 / forward转发
redirect:请求重定向: 客户端行为,本质上为2次请求,地址栏改变,前一次请求对象不保存, 所以请求携带的数据会丢失. 举例:你去银行办事(forward.jsp),结果告诉你少带了东西,你得先 ...
- 【HDU4689】Derangement(动态规划)
[HDU4689]Derangement(动态规划) 题面 Vjudge 给定一个\(+-\)组成的字符串,长度为\(n\). 如果第\(i\)位是\(+\),那么\(p_i>i\),否则\(p ...
- 【BZOJ2653】Middle(主席树)
[BZOJ2653]Middle(主席树) 题面 BZOJ 洛谷 Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你 ...
- Active Directory中获取域管理员权限的攻击方法
Active Directory中获取域管理员权限的攻击方法 译:by backlion 0x00 前言 攻击者可以通过多种方式在Active Directory中获得域管理员权限, ...
- bzoj3748 Kwadraty
Claris 当然是要用来%的 但是,,其他dalao,,比如JL的红太阳commonc.题解能不能稍微加几句话,蒟蒻看不懂啊. 在这里解释一下,Claris的题解.(因为我弱,想了半天才明白,所以觉 ...
- 【分块】【P2801】教主的魔法
Description 给你一个长度为 \(n\) 的序列,要求资瓷区间加,查询区间大于等于 \(k\) 的数的个数 Input 第一行是 \(n~,~Q\) 代表序列长度和操作个数 下面一行代表序列 ...