Transformation HDU - 4578 线段树

本文介绍了一种使用线段树和懒惰传播技术来高效处理区间操作和查询的问题解决策略。具体包括了加法、乘法、赋值及求区间内元素的幂次运算。通过递归分解和延迟更新机制,实现了对复杂操作的快速响应。

题解

题目大意 给你一个长度为n的区间 有三种操作
1将区间[l, r]加上c 2将区间[l, r]乘上c 3将区间[l, r]改为c
4为询问 询问区间[l, r]的每个元素的p次方 p只为1、2、3

线段树维护区间元素的1、2、3次方和 lazy三种操作
通过公式(A+c) ^ 2 = A ^ 2 + 2Ac + c ^ 2 和 (A+c) ^ 3 = A ^ 3 + 3A ^ 2c + 3 Ac ^ 2 + c^3维护
lazy标时 如果有set就先将之前的add和mul清零再覆盖
计算s1 s2 s3时需要先乘后加

AC代码

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const int MOD = 1e4 + 7;
const int MAXN = 1e5 + 10;

struct node
{
	int l, r;
	ll s1, s2, s3; //次方和
	ll add, mul, set; //lazy
	void Modify(ll a, ll m, ll s) //修改节点值
	{
		int n = r - l + 1; //区间长度
		if (s) //有set先执行
		{
			s1 = s * n % MOD;
			s2 = s * s % MOD * n % MOD;
			s3 = s * s % MOD * s % MOD * n % MOD;
		}
		s3 = s3 * m % MOD * m % MOD * m % MOD; //先分别乘再分别加 更新顺序321
		s2 = s2 * m % MOD * m % MOD;
		s1 = s1 * m % MOD;
		s3 = (s3 + s2 * a % MOD * 3 % MOD + s1 * a % MOD * a % MOD * 3 % MOD + a * a % MOD * a % MOD * n % MOD) % MOD;
		s2 = (s2 + s1 * a % MOD * 2 % MOD + a * a % MOD * n % MOD) % MOD;
		s1 = (s1 +a * n % MOD) % MOD;
	}
	void Lazy(ll a, ll m, ll s)
	{
		if (s) //set直接将add和mul清除
			add = 0, mul = 1,set = s;
		add = (add * m % MOD + a) % MOD, mul = mul * m % MOD; //add乘mul再加a mul直接乘m
	}
}tre[MAXN * 4];
inline void PushUp(int x)
{
	tre[x].s1 = (tre[x << 1].s1 + tre[x << 1 | 1].s1) % MOD;
	tre[x].s2 = (tre[x << 1].s2 + tre[x << 1 | 1].s2) % MOD;
	tre[x].s3 = (tre[x << 1].s3 + tre[x << 1 | 1].s3) % MOD;
}
inline void PushDown(int x)
{
	if (tre[x].add || tre[x].mul != 1 || tre[x].set)
	{
		tre[x << 1].Modify(tre[x].add, tre[x].mul, tre[x].set);
		tre[x << 1 | 1].Modify(tre[x].add, tre[x].mul, tre[x].set);
		tre[x << 1].Lazy(tre[x].add, tre[x].mul, tre[x].set);
		tre[x << 1 | 1].Lazy(tre[x].add, tre[x].mul, tre[x].set);
		tre[x].add = tre[x].set = 0;
		tre[x].mul = 1;
	}
}
void Build(int x, int l, int r)
{
	tre[x].l = l, tre[x].r = r, tre[x].s1 = tre[x].s2 = tre[x].s3 = tre[x].add = tre[x].set = 0, tre[x].mul = 1;
	if (l == r)
		return;
	else
	{
		int m = l + r >> 1;
		Build(x << 1, l, m);
		Build(x << 1 | 1, m + 1, r);
	}
}
void Update(int x, int pl, int pr, ll a, ll m, ll s)
{
	int l = tre[x].l, r = tre[x].r;
	if (pl <= l && r <= pr)
	{
		tre[x].Lazy(a, m, s);
		tre[x].Modify(a, m, s); //不能用lazy修改
	}
	else
	{
		PushDown(x);
		int mid = l + r >> 1; //m重名
		if (mid >= pl)
			Update(x << 1, pl, pr, a, m, s);
		if (mid < pr)
			Update(x << 1 | 1, pl, pr, a, m, s);
		PushUp(x);
	}
}
ll Query(int x, int pl, int pr, int p) //p次方
{
	int l = tre[x].l, r = tre[x].r;
	if (pl <= l && r <= pr)
	{
		if (p == 1)
			return tre[x].s1;
		if (p == 2)
			return tre[x].s2;
		return tre[x].s3;
	}
	else
	{
		PushDown(x);
		int m = l + r >> 1;
		ll res = 0;
		if (m >= pl)
			res = (res + Query(x << 1, pl, pr, p)) % MOD;
		if (m < pr)
			res = (res + Query(x << 1 | 1, pl, pr, p)) % MOD;
		PushUp(x);
		return res;
	}
}
int main()
{
#ifdef LOCAL
	freopen("C:/input.txt", "r", stdin);
#endif
	int N, M;
	while (cin >> N >> M, N && M)
	{
		Build(1, 1, N);
		int op, x, y, c;
		for (int i = 0; i < M; i++)
		{
			scanf("%d%d%d%d", &op, &x, &y, &c);
			if (op == 1)
				Update(1, x, y, c, 1, 0);
			else if (op == 2)
				Update(1, x, y, 0, c, 0);
			else if (op == 3)
				Update(1, x, y, 0, 1, c);
			else if (op == 4)
				printf("%lld\n", Query(1, x, y, c));
		}
	}

	return 0;
}
<think>嗯,用户需要根据给定的signal_name列表,使用Python生成对应的XML内容。首先,我得仔细看看用户提供的例子。例子中有两个信号名称,每个生成个<I-SIGNAL>块,里面的SHORT-NAME是原名称加上“_Sig”后缀。然后还有DATA-TRANSFORMATIONS和SYSTEM-SIGNAL-REF等部分,结构看起来比较固定。 用户提到了使用signal_pdu_data,可能是指需要根据这些信号名称动态生成XML。可能需要遍历每个信号名称,替换模板中的占位符。比如,将“Event_ADC_RX_VehicleCAN_Service_Event_RawCANDataOfVehicle_1”替换到SHORT-NAME和SYSTEM-SIGNAL-REF中。 接下来要考虑如何构建XML。在Python中,可以使用字符串格式化,或者更安全的XML库,比如xml.etree.ElementTree。但用户提供的示例中XML结构比较复杂,包含多层嵌套和属性,可能用字符串格式化更方便,尤其是当结构固定时。 不过要注意XML的转义,比如特殊字符。但信号名称里可能没有特殊字符,所以暂时可以不用处理。但为了安全,最好还是使用XML库来生成元素,避免手动拼接字符串带来的错误。 不过用户给出的示例是用字符串生成的,可能用户希望直接生成这样的字符串。所以可能需要用Python的字符串格式化,比如用f-string来替换变量。 比如,对于每个signal_name,生成个<I-SIGNAL>块,替换其中的SHORT-NAME,SYSTEM-SIGNAL-REF中的路径,以及DATA-TRANSFORMATION-REF等部分。 观察示例中的结构,发现SYSTEM-SIGNAL-REF的路径是固定的格式,只是替换了信号名称加上“_SysSig”。同样,DATA-TRANSFORMATION-REF的路径是固定的,可能不需要动态变化。 那么,可以创建个模板字符串,将需要替换的部分用变量代替。例如: template = ''' <I-SIGNAL> <SHORT-NAME>{signal_name}_Sig</SHORT-NAME> ... <SYSTEM-SIGNAL-REF DEST="SYSTEM-SIGNAL">/Communication/SystemSignals/{signal_name}_SysSig</SYSTEM-SIGNAL-REF> ... </I-SIGNAL> ''' 然后循环每个signal_name,用format方法填充变量。 另外,用户提供的XML中的其他部分,如TRANSFORMER-REF的路径是固定的,可能不需要修改。因此,模板中的这些部分可以保持不变。 接下来,需要确认signal_pdu_data的作用。用户提到“利用signal_pdu_data”,可能这个变量包含有关信号的其他信息,但问题中没有给出具体结构。可能signal_pdu_data可能包含每个信号的据转换或其它属性,但当前示例中没有使用到这些信息,所以可能暂时不需要处理,只需要根据信号名称生成XML即可。 然后,考虑生成完整的XML结构。每个<I-SIGNAL>块需要被正确缩进,可能需要处理换行和缩进。但用户提供的示例中的缩进可能只是美观,不影响功能,所以生成时保持类似的格式即可。 最后,将所有生成的<I-SIGNAL>块组合起来,可能作为列表中的元素,然后输出为个完整的XML文档,或者按照用户示例中的方式输出多个块。需要确认是否需要将它们包含在父元素中,但用户示例中没有,所以可能直接输出多个<I-SIGNAL>元素。 现在,编写Python代码的大致步骤是: 1. 定义signal_names列表。 2. 遍历每个signal_name,生成对应的XML块。 3. 使用字符串格式化替换变量。 4. 将所有生成的XML块合并。 需要注意的是,XML中的标签如TRANSFORMATION-I-SIGNAL-PROPSS可能存在拼写错误,比如PROPSS可能是PROPS的复,但需要严格按照用户提供的示例来复制,即使有拼写错误。 综上,代码的大致结构可能如下: signal_names = [ ... ] xml_blocks = [] for signal_name in signal_names: block = f'''<I-SIGNAL> <SHORT-NAME>{signal_name}_Sig</SHORT-NAME> <DATA-TRANSFORMATIONS> ... </DATA-TRANSFORMATIONS> <SYSTEM-SIGNAL-REF DEST="SYSTEM-SIGNAL">/Communication/SystemSignals/{signal_name}_SysSig</SYSTEM-SIGNAL-REF> ... </I-SIGNAL>''' xml_blocks.append(block) result = '\n'.join(xml_blocks) 然后输出result。 需要确保每个标签的闭合正确,缩进是否与示例致。可能用户对缩进有要求,所以要注意保持相同的缩进格式。 另外,检查用户示例中的各个路径是否正确,比如DATA-TRANSFORMATION-REF的路径是否固定,如示例中的是“/Communication/DataTransformation/TransformerConfiguration/SOMEIP_V1_E2E_none”,这部分是否需要根据信号不同而变化?在用户示例中,两个信号可能都使用相同的路径,所以在模板中直接写死即可。 因此,最终的Python代码应该能够遍历每个信号名称,生成对应的XML块,替换其中的信号名称部分,其他部分保持不变。</think>根据需求,我们将通过Python代码动态生成符合格式要求的XML内容。以下是分步骤解决方案: **步骤1:定义据模板** ```python signal_pdu_data = [ "Event_ADC_RX_VehicleCAN_Service_Event_RawCANDataOfVehicle_1", "Event_ADC_RX_VehicleCAN_Service_Event_RawCANDataOfVehicle_2" ] xml_template = ''' <I-SIGNAL> <SHORT-NAME>{signal_name}_Sig</SHORT-NAME> <DATA-TRANSFORMATIONS> <DATA-TRANSFORMATION-REF-CONDITIONAL> <DATA-TRANSFORMATION-REF DEST="DATA-TRANSFORMATION">/Communication/DataTransformation/TransformerConfiguration/SOMEIP_V1_E2E_none</DATA-TRANSFORMATION-REF> </DATA-TRANSFORMATION-REF-CONDITIONAL> </DATA-TRANSFORMATIONS> <SYSTEM-SIGNAL-REF DEST="SYSTEM-SIGNAL">/Communication/SystemSignals/{signal_name}_SysSig</SYSTEM-SIGNAL-REF> <TRANSFORMATION-I-SIGNAL-PROPSS> <SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS> <SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS-VARIANTS> <SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS-CONDITIONAL> <CS-ERROR-REACTION>AUTONOMOUS</CS-ERROR-REACTION> <TRANSFORMER-REF DEST="TRANSFORMATION-TECHNOLOGY">/Communication/DataTransformation/TransformerConfiguration/SOMEIPDefaultTransformer_V1</TRANSFORMER-REF> <INTERFACE-VERSION>1</INTERFACE-VERSION> <MESSAGE-TYPE>NOTIFICATION</MESSAGE-TYPE> </SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS-CONDITIONAL> </SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS-VARIANTS> </SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS> </TRANSFORMATION-I-SIGNAL-PROPSS> </I-SIGNAL> ''' ``` **步骤2:创建生成函** ```python def generate_xml_content(signal_names): xml_blocks = [] for name in signal_names: # 替换模板中的占位符 xml_block = xml_template.format(signal_name=name) xml_blocks.append(xml_block.strip()) return '\n\n'.join(xml_blocks) # 添加间隔增强可读性 ``` **步骤3:执行生成** ```python final_xml = generate_xml_content(signal_pdu_data) print(final_xml) # 实际使用时根据需要写入文件 ``` **生成结果示例**(包含两个完整I-SIGNAL节点): ```xml <I-SIGNAL> <SHORT-NAME>Event_ADC_RX_VehicleCAN_Service_Event_RawCANDataOfVehicle_1_Sig</SHORT-NAME> <DATA-TRANSFORMATIONS> <DATA-TRANSFORMATION-REF-CONDITIONAL> <DATA-TRANSFORMATION-REF DEST="DATA-TRANSFORMATION">/Communication/DataTransformation/TransformerConfiguration/SOMEIP_V1_E2E_none</DATA-TRANSFORMATION-REF> </DATA-TRANSFORMATION-REF-CONDITIONAL> </DATA-TRANSFORMATIONS> <SYSTEM-SIGNAL-REF DEST="SYSTEM-SIGNAL">/Communication/SystemSignals/Event_ADC_RX_VehicleCAN_Service_Event_RawCANDataOfVehicle_1_SysSig</SYSTEM-SIGNAL-REF> <TRANSFORMATION-I-SIGNAL-PROPSS> <SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS> <SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS-VARIANTS> <SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS-CONDITIONAL> <CS-ERROR-REACTION>AUTONOMOUS</CS-ERROR-REACTION> <TRANSFORMER-REF DEST="TRANSFORMATION-TECHNOLOGY">/Communication/DataTransformation/TransformerConfiguration/SOMEIPDefaultTransformer_V1</TRANSFORMER-REF> <INTERFACE-VERSION>1</INTERFACE-VERSION> <MESSAGE-TYPE>NOTIFICATION</MESSAGE-TYPE> </SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS-CONDITIONAL> </SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS-VARIANTS> </SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS> </TRANSFORMATION-I-SIGNAL-PROPSS> </I-SIGNAL> <I-SIGNAL> <SHORT-NAME>Event_ADC_RX_VehicleCAN_Service_Event_RawCANDataOfVehicle_2_Sig</SHORT-NAME> <DATA-TRANSFORMATIONS> <DATA-TRANSFORMATION-REF-CONDITIONAL> <DATA-TRANSFORMATION-REF DEST="DATA-TRANSFORMATION">/Communication/DataTransformation/TransformerConfiguration/SOMEIP_V1_E2E_none</DATA-TRANSFORMATION-REF> </DATA-TRANSFORMATION-REF-CONDITIONAL> </DATA-TRANSFORMATIONS> <SYSTEM-SIGNAL-REF DEST="SYSTEM-SIGNAL">/Communication/SystemSignals/Event_ADC_RX_VehicleCAN_Service_Event_RawCANDataOfVehicle_2_SysSig</SYSTEM-SIGNAL-REF> <TRANSFORMATION-I-SIGNAL-PROPSS> <SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS> <SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS-VARIANTS> <SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS-CONDITIONAL> <CS-ERROR-REACTION>AUTONOMOUS</CS-ERROR-REACTION> <TRANSFORMER-REF DEST="TRANSFORMATION-TECHNOLOGY">/Communication/DataTransformation/TransformerConfiguration/SOMEIPDefaultTransformer_V1</TRANSFORMER-REF> <INTERFACE-VERSION>1</INTERFACE-VERSION> <MESSAGE-TYPE>NOTIFICATION</MESSAGE-TYPE> </SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS-CONDITIONAL> </SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS-VARIANTS> </SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS> </TRANSFORMATION-I-SIGNAL-PROPSS> </I-SIGNAL> ``` **关键特征说明**: 1. **动态命名**:通过`{signal_name}`占位符自动生成`SHORT-NAME`和`SYSTEM-SIGNAL-REF` 2. **固定路径**:据转换路径保持预设值`/Communication/DataTransformation/...` 3. **协议配置**:保持`SOMEIP-TRANSFORMATION-I-SIGNAL-PROPS`中通信协议参的固定配置 4. **批量生成**:支持任意量的信号名称输入,自动生成对应XML节点 如果需要调整XML结构或添加动态参,只需修改模板中的占位符和生成逻辑即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值