当前位置: 首页 > news >正文

A - 整数的简单问题/A - A Simple Problem with Integers

 

你有 N 个整数,A1、A2、... 、AN。您需要处理两种作。一种类型的作是在给定的时间间隔内将一些给定的数字添加到每个数字。另一种是询问给定区间内的数字之和。

输入

第一行包含两个数字 N 和 Q。1 ≤ N,Q ≤ 100000。
第二行包含 N 个数字,初始值为 A1、A2、... 、AN。-10000000000 ≤ Ai ≤ 1000000000。
接下来的 Q 行中的每一行都表示一个作。
“C a b c” 是指将 c 添加到 AaAa+1、... 、Ab 中的每一个。-10000 ≤ c ≤ 10000。
“Q a b” 表示查询 Aa, Aa+1, ... , Ab 之和。

输出

您需要按顺序回答所有 Q 命令。一行中只有一个答案。

样本

输入复制输出复制
10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
4
55
9
15

提示

总和可能超出 32 位整数的范围。

注意:查询的返回值为long long 型

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
struct ss {
	long long sum ;
	long long lazy ;
	int x ;
	int y ;
};
struct ss zong[400005];
long long a[400005];
int n, m;
char v;
int f, g;
long long h;
void build(int i, int l, int r) {
	zong[i].x = l, zong[i].y = r;
	zong[i].sum = a[r] - a[l - 1];
	zong[i].lazy = 0;
	if (l == r) {
		return;
	}
	int mid = l + (r - l) / 2;
	build(i * 2, l, mid);
	build(i * 2 + 1, mid + 1, r);
}
void yidong(int i, int q, int w) {
	if (zong[i].y<q || zong[i].x>w || (zong[i].x >= q && zong[i].y <= w))
		return;
	zong[i * 2].lazy += zong[i].lazy;
	zong[i * 2 + 1].lazy += zong[i].lazy;
	zong[i].sum += zong[i].lazy * (zong[i].y - zong[i].x + 1);
	zong[i].lazy = 0;
	yidong(i * 2, q, w);
	yidong(i * 2 + 1, q, w);
}
long long chaxun(int i,int q, int w) {
	if (zong[i].x >= q && zong[i].y <= w) {
		return zong[i].sum + zong[i].lazy * (zong[i].y - zong[i].x + 1);
	}
	else if ((zong[i].x < q && zong[i].y>=q) || (zong[i].x <= w &&zong[i].y > w)) {
		if (zong[i].lazy != 0) {
			yidong(i, q, w);
		}
		return chaxun(i * 2, q, w) + chaxun(i * 2 + 1, q, w);
	}
	else {
		return 0;
	}
}
void tianjia(int i, int q,int w,int e) {
	if (zong[i].y<q || zong[i].x>w )
		return;
	else if (zong[i].x >= q && zong[i].y <= w) {
		zong[i].lazy += e;
		return;
	}
	else{
		if (zong[i].lazy != 0) {
			zong[i * 2].lazy += zong[i].lazy;
			zong[i * 2 + 1].lazy += zong[i].lazy;
			zong[i].sum += zong[i].lazy * (zong[i].y - zong[i].x + 1);
			zong[i].lazy = 0;
		}
		if (zong[i].x < q && zong[i].y >= q) {
			zong[i].sum += e * ((zong[i].y > w ? w : zong[i].y) - q + 1);
			tianjia(i * 2, q, w, e);
			tianjia(i * 2 + 1, q, w, e);
		}
		else  {
			zong[i].sum += e * (w - zong[i].x + 1);
			tianjia(i * 2, q, w, e);
			tianjia(i * 2 + 1, q, w, e);
		}
	}
}
int main(){
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &a[i]);
		a[i] += a[i - 1];
	}
	build(1, 1, n);
	while (m--) {
		do{
			scanf("%c", &v);
		} while (v != 'Q' && v != 'C');
		if (v == 'Q') {
			scanf("%d %d", &f, &g);
			long long t=chaxun(1,f, g);
			printf("%lld\n", t);
		}
		else {
			scanf("%d %d %lld", &f, &g, &h);
			tianjia(1,f, g, h);
		}
	}
	return 0;
}

相关文章:

  • 《算法笔记》8.2小节——搜索专题->广度优先搜索(BFS)问题 E: 【宽搜入门】巧妙取量
  • 基于 Prometheus + Grafana 监控微服务和数据库
  • 职业教育五金建设改革解析
  • C# 一文读懂委托与事件
  • Web Component 教程(二):如何有效管理和使用自定义属性
  • ✎ 一次有趣的经历
  • Cross-Silo Prototypical Calibration for Federated Learning with Non-IID Data
  • 【操作系统安全】任务6:Linux 系统文件与文件系统安全 学习指南
  • 【项目合集】基于ESP32的智能化妆柜
  • Linux进程信号(上)
  • Python第五章03:函数返回值和None类型
  • 网络编程知识预备阶段
  • 东隆科技携手PRIMES成立中国校准实验室,开启激光诊断高精度新时代
  • 【免费】2004-2017年各地级市实际利用外资数据
  • Grokking System Design 系统设计面试问题
  • 从零开始实现一个HTML5飞机大战游戏
  • java 中散列表(Hash Table)和散列集(Hash Set)是基于哈希算法实现的两种不同的数据结构
  • 【渗透测试】webpack对于渗透测试的意义
  • Linux 如何上传本地文件以及下载文件到本地命令总结
  • WSL2配置Humanoidbench问题mujoco.FatalError: OpenGL version 1.5 or higher required
  • “特朗普效应”下澳大利亚执政工党赢得大选,年轻选民担忧房价
  • 德国巴斯夫:关税政策加剧全球市场不确定性,间接影响已显现
  • 跳水世界杯女子单人10米台决赛,陈芋汐、全红婵包揽金银牌
  • 首都航空:太原至三亚航班巡航阶段出现机械故障,已备降南宁机场
  • 结束北京队与总决赛十年之痒的,为何会是一度被群嘲的许利民
  • 抢抓消费旺季:五一假期,多地党政主官调研外贸优品展销活动