2016 UESTC Training for Data Structures O - 卿学姐种美丽的花 CDOJ 1344 线段树/树状数组

本文介绍了一种使用线段树和懒惰传播解决区间更新及单点查询问题的方法。通过维护节点更新次数和差分信息,实现高效查询与更新操作。

O - 卿学姐种美丽的花

给一个区间,等差数列更新,单点查询

我们可以开一个线段树记录这个点被更新的次数,然后因为是区间更新,所以我们需要一个lazylazy表示这个区间的被更新的数列的首项是多少,还有一个cnt,表示公差,因为两个数列加和到一起时,公差也会相加,所以就是这样了,然后lazy下放的时候,也是计算下两个子区间的首端点的位置是多少,相当于把这个数列分为两个子数列

然后我们就可以发现,叶子节点的lazy就是这个点被更新的数,然后再加上叶子节点初始的值,就是更新后的值啦,然后就可以了,因为N1e6,线段树5W+KB的内存就卡过去了,哦,对,还有最后那个取模,因为答案不会爆long long,所以long long存,最后输出的时候模(膜)一下就行。

另:题解貌似给的是树状数组


代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define mod 772235
#define ll long long
#define maxn 1000005
#define lid (id<<1)
#define rid ((id<<1)|1)
long long a[maxn];
int N, Q;
struct segtree
{
	int l, r;
	//long long sum;
	ll lazy, cnt;
}tr[maxn * 4];
void bulid(int id, int l, int r)
{
	tr[id].l = l; tr[id].r = r;
	if (l == r)
	{
		return;
	}
	int mid = (l + r) >> 1;
	bulid(lid, l, mid);
	bulid(rid, mid + 1, r);
	//tr[id].sum = tr[lid].sum + tr[rid].sum;
}
void push_down(int id)
{
	if (tr[id].lazy != 0)
	{
		//printf("push_down id %d ", id);
		tr[lid].cnt += tr[id].cnt, tr[rid].cnt += tr[id].cnt;
		int mid = tr[lid].r;
		ll v = tr[id].lazy;
		//printf("%lld ", v);
		//tr[lid].sum += (ll)(2 * v - (tr[lid].r - tr[lid].l)*tr[lid].cnt)*(ll)(tr[lid].r - tr[lid].l + 1) / 2;
		tr[lid].lazy += v;
		v = tr[id].lazy - (mid + 1 - tr[id].l)*tr[id].cnt;
		//printf("%lld\n", v);
		//tr[rid].sum += (ll)(2 * v - (tr[rid].r - tr[rid].l)*tr[rid].cnt)*(ll)(tr[rid].r - tr[rid].l + 1) / 2;
		tr[rid].lazy += v;
		tr[id].lazy = 0;
		//printf("cnt %lld cnt %lld\n", tr[lid].cnt, tr[rid].cnt);
		tr[id].cnt = 0;
	}
}
void update(int id, int l, int r, long long v)
{
	if (l == tr[id].l&&tr[id].r == r)
	{
		tr[id].lazy += v;
		tr[id].cnt++;
		//tr[id].sum += (ll)(2 * v - (r - l)*tr[id].cnt)*(ll)(r - l + 1) / 2;
		return;
	}
	push_down(id);
	int mid = (tr[id].l + tr[id].r) >> 1;
	if (r <= mid) update(lid, l, r, v);
	else if (l > mid) update(rid, l, r, v);
	else
	{
		update(lid, l, mid, v);
		update(rid, mid + 1, r, v - (mid + 1 - l));
	}
	//tr[id].sum = tr[lid].sum + tr[rid].sum;
}
long long query(int id, int l, int r)
{
	if (l == tr[id].l&&r == tr[id].r) return tr[id].lazy;
	push_down(id);
	int mid = (tr[id].l + tr[id].r) >> 1;
	if (r <= mid) return query(lid, l, r);
	else if (l > mid) return query(rid, l, r);
	else return query(lid, l, mid) + query(rid, mid + 1, r);
}
int main()
{
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	scanf("%d%d", &N, &Q);
	for (int i = 1; i <= N; ++i)
		scanf("%lld", &a[i]);
	bulid(1, 1, N);
	/*for (int j = 1; j <= 30; ++j)
		printf("%d  %d %d %lld %lld\n", j, tr[j].l, tr[j].r, tr[j].lazy, tr[j].cnt);
	printf("\n");*/ 
	int f, x, y, l, r;
	ll ans;
	for (int i = 0; i < Q; ++i)
	{
		scanf("%d", &f);
		if (f == 1)
		{
			scanf("%d%d", &x, &y);
			l = x;
			r = min(x + y - 1, N);
			update(1, l, r, y);
			//printf("update %d %d %d\n", l, r, y);
		}
		else if (f == 2)
		{
			scanf("%d", &x);
			ans = (query(1, x, x)+a[x]) % mod;
			printf("%lld\n", ans);
		}
		/*for (int j = 1; j <= 30; ++j)
			printf("%d  %d %d %lld %lld\n", j, tr[j].l, tr[j].r, tr[j].lazy, tr[j].cnt);
		printf("\n");*/ 
	}
	/*for (int j = 1; j <= 30; ++j)
		printf("%d  %d %d %lld %lld\n", j, tr[j].l, tr[j].r, tr[j].lazy, tr[j].cnt);
	printf("\n");*/ 
	//system("pause");
	//while (1);
	return 0;
}

源码下载地址: https://pan.quark.cn/s/a4b39357ea24 谷歌公司设计了一款无费用且具备开源特性的网络浏览器,名为Chrome,因其卓越的速度、稳定性和安全性而广受赞誉。该浏览器运用了前沿的Web渲染引擎Blink以及JavaScript引擎V8,旨在保障网页载入与脚本运行的卓越效能。为应对无网络环境下的Chrome安装需求,特别准备了离线安装包。此压缩文件内含32位与64位两种规格的Chrome浏览器离线安装方案,具体文件名分别为"chromedev_x64-v68.0.3423.2.exe"与"chromedev_x86-v68.0.3423.2.exe"。在文件命名中,"x64"标识64位版本,适用于64位操作系统平台,而"x86"则对应32位版本,适配32位操作系统。文件名中的"v68.0.3423.2"代表Chrome的一个特定版本号,各版本可能涵盖安全补丁、性能改进或新增功能。与32位Chrome相比,64位版本具备如下长处:能够处理更多内存容量,从而提升多任务作业能力;针对现代硬件的优化使其运行更为迅猛;64位版本更具备高级别的安全防护,能更周全地抵御恶意软件的侵袭。尽管如此,32位版本对于仍在使用32位操作系统的用户,或是在系统资源需求不高的场景下,依然适用。在部署Chrome浏览器时,用户需依据其个人计算机的操作系统平台,挑选匹配的版本进行安装。通过双击相应的.exe文件,安装流程将自动启动,一般包含接受使用许可、确定安装路径及构建桌面快捷方式等环节。若在安装阶段遭遇难题,可参照提示信息或联系技术支援获取协助,同时该压缩文件发布者亦表明欢迎用户以留言形式反映问题。Chrome浏览器的主要特质涵盖:直观的用户界面设计...
内容概要:本文围绕直驱式永磁同步电机(PMSM)矢量控制系统的建模与仿真展开研究,基于Simulink平台构建了完整的控制系统仿真模型,涵盖了电机本体数学建模、三相/两相坐标变换(Clarke/Park变换)、磁场定向控制(FOC)、电流环与速度环双闭环PID控制策略、空间矢量脉宽调制(SVPWM)技术以及转速调节器设计等核心技术环节。通过仿真实验验证了该控制策略在动态响应速度、稳态运行精度及抗负载扰动能力方面的优良性能,充分体现了矢量控制在实现电机高性能调速中的优势,为永磁同步电机在工业驱动、新能源汽车和高端装备制造等领域的实际应用提供了可靠的理论依据与技术支撑。; 适合人群:具备电机学、电力电子技术和自动控制原理基础知识的电气工程、自动化、机电一体化等相关专业的研究生、高校教师、科研人员,以及从事电机驱动系统、新能源汽车电驱、工业自动化设备研发的工程技术人员。; 使用场景及目标:①深入理解永磁同步电机矢量控制的基本原理与实现机制;②掌握在Simulink中搭建高精度电机控制系统仿真模型的方法与技巧;③为电机控制算法的设计、优化与参数整定提供高效的仿真验证平台;④服务于高校课程设计、毕业课题研究、科研项目前期验证及企业产品开发中的控制策略测试。; 阅读建议:建议结合经典电机控制教材进行对照学习,重点关注各功能模块间的信号流向、反馈机制与参数耦合关系,动手复现并调试仿真模型,通过改变PI参数、负载条件和给定转速等方式观察系统响应,从而深入掌握控制策略的内在逻辑与性能优化方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值