首页 > 其他分享 >每日一题 第六十五期 洛谷 线段树1

每日一题 第六十五期 洛谷 线段树1

时间:2024-04-07 15:33:07浏览次数:17  
标签:10 le 洛谷 int 线段 tree1 add include 第六十五

【模板】线段树 1

题目描述

如题,已知一个数列,你需要进行下面两种操作:

  1. 将某区间每一个数加上 k k k。
  2. 求出某区间每一个数的和。

输入格式

第一行包含两个整数 n , m n, m n,m,分别表示该数列数字的个数和操作的总个数。

第二行包含 n n n 个用空格分隔的整数,其中第 i i i 个数字表示数列第 i i i 项的初始值。

接下来 m m m 行每行包含 3 3 3 或 4 4 4 个整数,表示一个操作,具体如下:

  1. 1 x y k:将区间 [ x , y ] [x, y] [x,y] 内每个数加上 k k k。
  2. 2 x y:输出区间 [ x , y ] [x, y] [x,y] 内每个数的和。

输出格式

输出包含若干行整数,即为所有操作 2 的结果。

样例 #1

样例输入 #1

5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4

样例输出 #1

11
8
20

提示

对于 30 % 30\% 30% 的数据: n ≤ 8 n \le 8 n≤8, m ≤ 10 m \le 10 m≤10。
对于 70 % 70\% 70% 的数据: n ≤ 10 3 n \le {10}^3 n≤103, m ≤ 10 4 m \le {10}^4 m≤104。
对于 100 % 100\% 100% 的数据: 1 ≤ n , m ≤ 10 5 1 \le n, m \le {10}^5 1≤n,m≤105。

保证任意时刻数列中所有元素的绝对值之和 ≤ 10 18 \le {10}^{18} ≤1018。

【样例解释】

AC代码:


#include<map>
#include<set>
#include<stack>
#include<cmath>
#include<queue>
#include<string>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<numeric>
#include<iomanip>
#define endl '\n'
//#define x first
//#define y second
using namespace std;

typedef long long ll;
typedef pair<int, int>PII;
const int N=3e5+10;
const int MOD=1e9 + 7;
const int INF=0X3F3F3F3F;
const int dx[]={-1,1,0,0,-1,-1,+1,+1};
const int dy[]={0,0,-1,1,-1,+1,-1,+1};
const int M = 1e6 + 10;

ll tree1[M], tree2[M];//此时树状数组维护的是差分数组
int n, m;

int bit(int x)
{
	return x & -x;
}
void add(ll tree[], int i, int x)
{
	while(i <= n)
	{
		tree[i] += x;
		i += bit(i);
	}
}

ll sum(ll tree[],int i)
{
	ll res = 0;
	while(i > 0)
	{
		res += tree[i];
		i -= bit(i);
	}
	return res;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i = 1; i <= n; i ++)
	{
		int x;
		cin >> x;
		add(tree1, i, x);
		add(tree1, i + 1, -x);
		add(tree2, i, (i - 1) * x);
		add(tree2, i + 1, -(i * x));
	}
	while(m --){
		int a, x, y, k;
		cin >> a;
		if(a == 1) 
		{
			cin >> x >> y >> k;
			add(tree1, x, k);
			add(tree1, y + 1, -k);
			add(tree2, x, (x - 1) * k);
			add(tree2, y + 1, -(y * k));
		}
		if(a == 2)
		{
			cin >> x >> y;
			ll s = sum(tree1, y) * y - sum(tree2, y) - sum(tree1, x - 1) * (x - 1) + sum(tree2, x - 1);//注意去括号要变号
			cout << s << endl;
		}
	}
	return 0;
}

标签:10,le,洛谷,int,线段,tree1,add,include,第六十五
From: https://blog.csdn.net/2301_80882026/article/details/137287970

相关文章

  • 洛谷题单指南-数学基础问题-P1100 高低位交换
    原题链接:https://www.luogu.com.cn/problem/P1100题意解读:将32位二进制数的高低16位交换位置。解题思路:给定无符号整数a,假设二进制高16为h,低16位为l,即a表示为hl,a>>16得到0h,a<<16得到l0,两者相加即得到lh,交换完毕。需要注意的是,无符号整数的表示是unsignedint,如果是int,......
  • 洛谷题单指南-数学基础问题-P1469 找筷子
    原题链接:https://www.luogu.com.cn/problem/P1469题意解读:找到落单的整数,其他整数都可以配对。解题思路:利用异或的特性:1、整数和自己异或x^x=02、任何数和0异或x^0=x因此,将所有数异或起来,结果就是落单的整数。100分代码:#include<bits/stdc++.h>usingnamespa......
  • 洛谷题单指南-数学基础问题-P1143 进制转换
    原题链接:https://www.luogu.com.cn/problem/P1143题意解读:进制转换的模版题,n进制转10进制,10进制转m进制。解题思路:1、对于n进制数转10进制,如abcd转10进制,根据定义是a*n^3+b*n^2+c*n+d,在程序中迭代处理:for(inti=0;i<s.length();i++)dec=dec*n+s[i]需要注......
  • Poj1845 & 洛谷P1593 寄中寄
    给定两个数\(A\),\(B\),求\(A^B\)的因子和。由唯一分解定理,\(A\)可以表示成\(p_1^{a_1}\timesp_2^{a_2}\timesp_3^{a_3}\times\cdots\timesp_n^{a_n}\)的形式。而\(A^B\)也就可以表示成\(p_1^{a_1\timesB}\timesp_2^{a_2\timesB}\timesp_3^{a_3\timesB}\times......
  • 洛谷题单指南-图的基本应用-P1983 [NOIP2013 普及组] 车站分级
    原题链接:https://www.luogu.com.cn/problem/P1983题意解读:由于“如果这趟车次停靠了火车站x,则始发站、终点站之间所有级别大于等于火车站x的都必须停靠”。因此,在始发站和终点站之间,能停靠的车站都是级别较高的,没有停靠的车站都是级别较低的,计算最少有多少个不同级别。解题思路:......
  • 美化洛谷
    氩洛谷(使用Egde浏览器)下载后解压,然后点击浏览器右上角的三个点->“扩展”->“管理扩展”。将开发人员模式打开,把刚刚解压的文件拖上去。打开洛谷,点击“扩展”->“Stylus”->“管理样式”,把“作为UserCSS”打开,然后“新建样式”,复制下面的代码。/*==UserStyle==@name......
  • [DS 小计] 李超线段树
    前言大家好啊,今天讲的是LCT(李超Tree)(bushi错了错了。这两不是一个东西。概念李超树能干什么。插入一条直线/线段单点查询当前点的峰值(最大最小均可)你会说:OI中有什么是和斜率相关的吗?有,那就是斜率优化。关于斜率优化可以看这个。你会说:你说的对,静态的dp......
  • 倍增(LCA与ST表)附详细讲解博客路劲以及洛谷模板题
    前置知识--倍增倍增算法,顾名思义,就是不断地翻倍。虽然是一种基础算法,但它能够使得线性的处理转化为对数级的处理,大大地优化时间复杂度,在很多算法中都有应用,其中最常见的就是ST表以及LCA(树上最近公共祖先)了。学习博客:算法学习笔记(12):ST表-知乎(zhihu.com)for(intx=......
  • 【题单】 洛谷图论题单
    这里写目录标题updata普及-普及/提高-普及+/提高提高+/省选-省选/NOI−NOI/NOI+/CTSCupdata2024.03.31发布此文章普及-P1359租用游艇P1636Einstein学画画(数据有误)P1700[USACO19OPEN]MilkFactoryBB3613图的存储与出边的排序B3643图的存储B3644【模......
  • 八皇后问题(洛谷P1219)
    在做洛谷上的题前我们看一下这样一道题题目描述会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 × 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对......