牛客竞赛数据结构专题班树状数组、线段树练习题

牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ

G 智乃酱的平方数列(线段树,等差数列,多项式)

题目描述
想必你一定会用线段树维护等差数列吧?让我们来看看它的升级版。

请你维护一个长度为5×10 ^5的数组,一开始数组中每个元素都为0,要求支持以下两个操作:

1、区间[l,r]加自然数的平方数组,即al+=1,al+1+=4,al+2+=9,al+3+=16...ar+=(r−l+1)∗(r−l+1)
2、区间[l,r]查询区间和mod 10^9 + 7

输入描述:
第一行输入n,m,(1≤n,m≤5*10 ^5)
接下来m行,对于每行,先读入一个整数q。
当q的值为1时,还需读入两个整l,r,(1≤l≤r≤n)表示需要对区间[l,r]进行操作,让第一个元素加1,第二个元素加4,第三个元素加9...以此类推。
当q的值为2时,还需读入两个整数l,r(1≤l≤r≤n)表示查询l到r的元素和

输出描述:
对于每一个q=2,输出一行一个非负整数,表示l到r的区间和mod 110^9+7。
示例1

输入
复制

4 4
2 1 4
1 1 4
1 3 4
2 1 4
输出
复制

0
35
示例2

输入
复制

10 6
1 1 6
1 8 9
1 3 6
2 1 10
1 1 10
2 1 10
输出
复制

126
511


解析: 

等差数列可以写成 [x-(l-1)]^2,其中 x 表示当前的位置,等价于 x^2-2*x*(l-1)+(l-1)^2,通过线段树维护其系数即可

#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <math.h>
#include <map>
#include <sstream>
#include <deque>
#include <unordered_map>
#include <unordered_set>
#include <bitset>
#include <stdio.h>
#include <tuple>
using namespace std;
/*
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
*/
typedef long long LL;
#define int long long
#define ld long double
//#define INT __int128
const LL INF = 0x3f3f3f3f3f3f3f3f;
typedef unsigned long long ULL;
typedef pair<long long, long long> PLL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
const int inf = 0x3f3f3f3f;
const LL mod = 1e9+7;
const ld eps = 1e-12;
const int N = 5e5 + 10, M = N + 10;
int n, m;
struct TREE {
	int l, r;
	int la1, la2, la3;
	int sum;
	int base1, base2;
}tr[N << 2];
#define ls u<<1
#define rs u<<1|1
void cal(int u, int la1, int la2, int la3) {
	la3 %= mod;
	int len = tr[u].r - tr[u].l + 1;
	tr[u].sum = (tr[u].sum + len * la3 % mod) % mod;
	tr[u].sum = (tr[u]
### 网语法入门顺序结构 Python 解题方法 在解决竞赛中的语法入门顺序结构习题时,可以通过分析具体题目需求并结合基础的 Python 输入输出操作来完成。以下是基于提供的参考资料以及常见解题思路的一个总结。 #### 题目特点与基本解法 竞赛语法入门的顺序结构通常涉及简单的算术运算、字符串处理或条件判断等问题。这些问题的核心在于掌握 Python 的基本语法规则和数据类型的运用[^2]。例如: - **输入**: 使用 `input()` 函数读取用户输入的数据。 - **输出**: 利用 `print()` 输出计算结果。 - **数据类型转换**: 将输入的字符串形式转化为整数或其他所需类型(如通过 `int()` 或 `float()` 进行转换)。 以下是一个典型的例子——求两个整数之和的问题解决方案: ```python a, b = map(int, input().split()) # 接收两数作为输入 result = a + b # 计算它们的和 print(result) # 打印结果 ``` 此代码片段展示了如何高效地接收多组数据并通过内置函数快速解决问题[^1]。 #### 关于装饰器的应用扩展思考 虽然当前讨论的是较为基础的顺序结构问题,但在更复杂的场景下可能会涉及到程序性能优化或是功能增强的需求。此时可以考虑引入装饰器的概念[^3]。尽管对于初学者来说可能稍显复杂,但了解其原理有助于未来学习更高阶的内容。 假设我们需要记录某个简单加法函数执行的时间,则可设计如下装饰器: ```python import time def timer_decorator(func): # 定义一个计时器装饰器 def wrapper(*args, **kwargs): start_time = time.time() # 开始时间戳 result = func(*args, **kwargs) end_time = time.time() # 结束时间戳 print(f"{func.__name__} took {end_time - start_time:.6f}s to execute.") return result return wrapper @timer_decorator # 应用于add_function上 def add_function(x, y): """模拟耗时较长的操作""" import random delay = random.uniform(0.1, 1.0) time.sleep(delay) # 模拟延迟 return x + y # 测试该装饰后的函数 res = add_function(5, 7) print(res) ``` 上述示例说明了即使是在相对简单的应用环境中,适当采用高级特性也能带来额外的好处。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值