离散化区间和(acwing)

首先解释一下什么叫离散化,离散化就是把大而分散的一段段使用到的稀疏区间,整合映射到连续的一段较小的稠密区间里

就拿上面这题来讲,我们要求区间和肯定要用到前缀和数组。我们观察到 下标是[-1e9,1e9],我们没办法开一个1e9的数组,太大了。

再观察,发现其实最多出现3e5个点(n+2*m),3e5的数组我们是可以开出来的,那我们就只关心已经出现过的点,并这些点的下标进行“重新赋值”。

例如有三个数,下标分别为:2,8,1e8。我们就可以将其下标“重写成1,2,3”,达到节省空间的目的。

我自己喜欢用map进行重写,y总用了二分重写,个人觉得我的比较方便且容易理解一些

vector<PII> add_op;
vector<PII> q_op;
vector<int> alls;
int pre[N],a[N];
int find(int x) {
	//查询x在离散化区间里的位置。
	//返回的是x的下标

	int index = 0;
	int l = 0, r = alls.size() - 1;
	while (l <= r) {
		int mid = (l + r) >> 1;
		if (alls[mid] >= x) {
			r = mid - 1;
			index = mid;
		}
		else {
			l = mid + 1;
		}
	}
	return index + 1;
}
void solve()
{
	int n, m; cin >> n >> m;
	rep(i, 1, n) {
		int x, c; cin >> x >> c;
		add_op.push_back({ x,c });
		alls.push_back(x);
	}

	rep(i, 1, m) {
		int l, r; cin >> l >> r;
		q_op.push_back({ l,r });
		alls.push_back(l);
		alls.push_back(r);
	}

	sort(alls.begin(), alls.end());
	alls.erase(unique(alls.begin(), alls.end()), alls.end());
	 
	for (auto it : add_op) {
		int x = find(it.first);
		a[x] += it.second;
	}

	for (int i = 1; i <= alls.size(); i++) {
		pre[i] = pre[i - 1] + a[i];
	}

	for (auto it : q_op) {
		int l = find(it.first);
		int r = find(it.second);
		cout << pre[r] - pre[l - 1] << endl;
	}

}

y总模板

vector<PII> add_op;
vector<PII> q_op;
vector<int> alls;
int pre[N],a[N];

void solve()
{
	int n, m; cin >> n >> m;
	rep(i, 1, n) {
		int x, c; cin >> x >> c;
		add_op.push_back({ x,c });
		alls.push_back(x);
	}

	rep(i, 1, m) {
		int l, r; cin >> l >> r;
		q_op.push_back({ l,r });
		alls.push_back(l);
		alls.push_back(r);
	}

	sort(alls.begin(), alls.end());
	alls.erase(unique(alls.begin(), alls.end()), alls.end());
	
	unordered_map<int, int> mp;
	int j = 1;
	for (auto it : alls) {
		mp[it] = j++;
	}

	for (auto it : add_op) {
		int index = mp[it.first];
		int val = it.second;
		a[index] += val;
	}

	for (int i = 1; i <= alls.size(); i++) {
		pre[i] = pre[i - 1] + a[i];
	}

	for (auto it : q_op) {
		int l = mp[it.first];
		int r = mp[it.second];
		cout << pre[r] - pre[l - 1] << endl;
	}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PID是一种常用的控制算法,其全称为比例-积分-微分控制(Proportional-Integral-Derivative Control)。它根据控制系统的误差信号,通过比例、积分和微分三个部分的加权组合来产生控制输出,以调节系统的运行状态。 比例(Proportional)部分根据当前误差的大小与设定值之间的差异,产生一个与误差成正比的输出。它可以快速地响应系统的变化,但可能会引起超调或震荡。 积分(Integral)部分根据误差信号在时间上的累积值,产生一个与积分误差成正比的输出。它可以消除系统静态误差,但可能导致系统响应过度调整或不稳定。 微分(Derivative)部分根据误差信号的变化率,产生一个与误差变化率成正比的输出。它可以预测系统的未来变化趋势,使系统更加稳定,但可能会放大高频噪声信号。 离散化PID是将连续时间PID控制算法转换为离散时间域中使用的算法。在实际应用中,往往需要将连续时间模型转换为离散时间模型来进行控制设计和实现。离散化PID通过采样周期将连续时间的PID算法离散化,使其适用于离散时间系统。 离散化PID的实现方式有多种,常见的方法包括Z变换法、欧拉前向差分法和梯形法等。其中,Z变换法是一种常用的离散化方法,它通过对连续时间控制器传递函数进行Z变换,得到离散时间控制器的传递函数,从而实现离散化PID控制。 离散化PID在工业自动化控制中广泛应用,可以实现对离散时间系统的精确控制,提高系统稳定性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值