【UVA12299 RMQ with Shifts】

本文探讨了线段树数据结构的应用,特别是在处理数组的单点修改和区间查询问题上。通过具体实例,展示了如何使用线段树进行高效的数据更新和查询操作,包括构建树、节点修改和区间查询等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【Analysis】

这题其实在考输入吧,其他好像不难,shiftshiftshift就用线段树的单点修改即可

【Code】

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>

typedef long long I64;

using namespace std;

inline int read() {
	int ret=0;bool flag=0;char c=getchar();
	while((c<'0')|(c>'9')) flag ^= !(c^'-'),c=getchar();
	while((c>='0')&(c<='9')) ret=(ret<<3)+(ret<<1)+(c^'0'),c=getchar();
	return flag?-ret:ret;
}

inline void Put(char * s) { puts(s); }
inline void Put(char c) { Put(&c); }
inline void Put(I64 x) { char c[25]={0}; sprintf(c,"%lld",x); Put(c); }
inline void Put(int x) { Put(x|(I64)0); }

const int M = 1e5 + 11;
const int INF = 0x3f3f3f3f;

namespace segment_tree
{
	int _min[M<<2],n,m,num[M],s[M],shift[M];
	
	inline void build_tree(int k,int l,int r)
	{
		if(l == r)
		{
			_min[k] = num[l];
			return ;
		}
		int mid = l + r >> 1;
		build_tree(k<<1,l,mid);
		build_tree(k<<1|1,mid + 1,r);
		_min[k] = min(_min[k<<1],_min[k<<1|1]);
	}
	
	inline void Modify(int k,int l,int r,int pos,int _num)
	{
		if(l == r)
		{
			_min[k] = _num;
			return ;
		}
		int mid = l + r >> 1;
		int lson = k<<1,rson = k<<1|1;
		if(pos <= mid) Modify(lson,l,mid,pos,_num);
		else Modify(rson,mid + 1,r,pos,_num);
		_min [k]= min(_min[lson],_min[rson]);
	}
	
	inline int query(int k,int l,int r,int x,int y)
	{
		if((x <= l)&(y >= r)) return _min[k];
		int lson = k<<1,rson = k<<1|1;
		int mid = l + r >> 1;
		int ans = INF;
		if(x <= mid) ans = min(query(lson,l,mid,x,y),ans);
		if(y > mid) ans = min(ans,query(rson,mid + 1,r,x,y));
		return ans;
	}
	
	inline int get_number(char* op)
	{
		int len = strlen(op + 1);
		int dex = 1;
		
		bool flag=0;
		s[dex] = 0;
		
		for(int i = 1;i <= len; i++)
		{
			if(op[i]>='0'&&(op[i]<='9'))
			{
				s[dex] = (s[dex]<<3) + (s[dex]<<1) + op[i] - '0';
				flag = 1;
			}
			else if(flag) s[++dex] = 0;
		}
	//	for(int i = 0;i < dex; i++) printf("%d ",s[i]);
	//	puts("");
		return dex - 1;
        
    //这里是处理字符串的输入
	}
	
	inline void solve()
	{
		char op[55]={0};
		
		scanf("%s",op + 1);
		int dex = get_number(op);
		if(op[1] == 's')
		{
			for(int i = 1;i <= dex; i++)
				shift[i] = num[s[i]];
			
			for(int i = 1;i <= dex; i++)
			{
				if(i + 1 <= dex)
					num[s[i]] = shift[i + 1];
				else 
					num[s[i]] = shift[1];
				Modify(1,1,n,s[i],num[s[i]]);
			}
		}
		else
			Put(query(1,1,n,s[1],s[2]));
	}
	
	inline void Init()
	{
		while(~scanf("%d%d",&n,&m))
		{
			for(int i = 1;i <= n; i++)
				num[i] = read();
			build_tree(1,1,n);
			while(m--)
				solve();
		}
	}
}

using namespace segment_tree;

int main(void)
{
	Init();
	return 0;
}
/*
7 10
6 2 4 8 5 1 4
query(1,7)
shift(2,4,5,7)
query(1,7)
shift(2,3)
query(3,7)
query(3,5)
*/
内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值