蓝桥杯 操作格子
问题描述
有n个格子,从左到右放成一排,编号为1-n。共有m次操作,有3种操作类型:
1.修改一个格子的权值,
2.求连续一段格子权值和,
3.求连续一段格子的最大值。
对于每个2、3操作输出你所求出的结果。
输入格式
第一行2个整数n,m。接下来一行n个整数表示n个格子的初始权值。
接下来m行,每行3个整数p,x,y,p表示操作类型,p=1时表示修改格子x的权值为y,p=2时表示求区间[x,y]内格子权值和,p=3时表示求区间[x,y]内格子最大的权值。
输出格式
有若干行,行数等于p=2或3的操作总数。
每行1个整数,对应了每个p=2或3操作的结果。
样例输入
4 3
1 2 3 4
2 1 3
1 4 3
3 1 4
样例输出
6
3
数据规模与约定
对于100%的数据1 <= n <= 100000,m <= 100000,0 <= 格子权值 <= 10000。
分析
裸线段树问题
代码
#include <cstdio> #include <iostream> #include <algorithm> #define maxn 100000 #define inf -1000000 using namespace std; int maxv[4 * maxn], a[maxn], sum[4 * maxn]; //建树 void build(int id, int l, int r){ if(l == r){ maxv[id] = a[l]; sum[id] = a[l]; return; } int mid = (l + r) >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); maxv[id] = max(maxv[id << 1], maxv[id << 1| 1]); sum[id] = sum[id << 1] + sum[id << 1| 1]; } //把x变成v void update(int id, int l, int r, int x, int v){ if(l == r){ maxv[id] = v; sum[id] = v; return; } int mid = (l + r) >> 1; if(x <= mid){ update(id << 1, l, mid, x, v); } else{ update(id << 1 | 1, mid + 1, r, x, v); } maxv[id] = max(maxv[id << 1], maxv[id << 1| 1]); sum[id] = sum[id << 1] + sum[id << 1| 1]; } //求x-y上的最大值 int query_max(int id, int l, int r, int x, int y){ if(x <= l && y >= r){ return maxv[id]; } int mid = (l + r) >> 1; int ans = inf; if(x <= mid){ ans = max(ans, query_max(id << 1, l, mid, x, y)); } if(y > mid){ ans = max(ans, query_max(id << 1 | 1, mid + 1, r, x, y)); } return ans; } //求x-y上的和 int query_sum(int id, int l, int r, int x, int y){ if(x <= l && y >= r){ return sum[id]; } int mid = (l + r) >> 1; int ans = 0; if(x <= mid){ ans += query_sum(id << 1, l, mid, x, y); } if(y > mid){ ans += query_sum(id << 1 | 1, mid + 1, r, x, y); } return ans; } int main(){ int n, m; cin >> n >> m; for(int i = 1; i <= n; i++){ cin >> a[i]; } build(1, 1, n); for(int i = 0; i < m; i++){ int a, b, c; cin >> a >> b >> c; if(a == 1){ update(1, 1, n, b, c); } else if(a == 2){ cout<< query_sum(1, 1, n, b, c) << endl; } else{ cout<< query_max(1, 1, n, b, c) << endl; } } return 0; }

更多精彩