题目链接 #include<cmath> #include<cstdio> #include<cctype> #include<algorithm> using namespace std; const int N=1e5+5; #define LL long long int n,belong[N],size; LL A[N],sum[N],tag[N]; inline LL read() { LL now=0,f=1;register char c=ge…
1317. 数列操作C ★★★   输入文件:shuliec.in   输出文件:shuliec.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 假设有一个长度为 n(n≤100000) 的数列 A,支持如下两种操作: 1. 将 Ai,Ai+1,…,Aj 的值均增加 d 2. 查询 As+As+1+⋯+At(s≤t) 的值. 根据操作要求进行正确操作并输出结果. [输入格式] 第一行为一个正整数 n,表示数列的大小. 第二行有 n 个整数,表示数列 A 各项的初始…
传送门 : COGS 2638. 数列操作ψ 线段树 这道题让我们维护区间最大值,以及维护区间and,or一个数 我们考虑用线段树进行维护,这时候我们就要用到吉司机线段树啦 QAQ 由于发现若干次and,or之后,如果数据分布均匀,那么几乎所有的数在若干次操作后都会变成同一个数 因为我们的and操作中的0位,以及or操作当中的1位,都是可以把整个区间的那一二进制位重置为相同的 我们考虑利用这一个性质 如果我们直接维护一个区间内的值是否是相同的,那么效果会差很多. 我们发现我们在进行and操作的时…
[前言] 作为一个什么数据结构都不会只会CDQ分治和分块的蒟蒻,面对区间加&区间求和这么难的问题,怎么可能会写线段树呢 于是,用CDQ分治解决区间加&区间求和这篇习作应运而生 [Part.I]区间加&区间求和的数据结构做法 [一]线段树 裸题... 1141ms #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include…
「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long long p; class SegmentTree { private: struct Node { int l,r; long long v,mul,add; Node *c[2]; Node(int l,int r):l(l),r(r),mul(1LL),add(0LL) { c[0]=c[1]=nullp…
1316. 数列操作B ★★   输入文件:shulieb.in   输出文件:shulieb.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 假设有一个大小为 n(n≤100000) 整数数列 A,支持如下两种操作: 1. 将 Ai,Ai+1,…,Aj 的值均增加 d 2. 查询 Ai 的值 根据操作要求进行正确操作并输出结果. [输入格式] 输入文件第一行一个整数 n, 第二行为 n 个整数,表示数列 A 中各项的初始值. 第三行为一个整数 m ,表示操作数.…
http://cogs.pro:8080/cogs/problem/problem.php?pid=pyNimmVeq 264. 数列操作 ★☆   输入文件:shulie.in   输出文件:shulie.out   简单对比时间限制:1 s   内存限制:160 MB [问题描述] 给定一个数列 A,请实现如下两种操作: 1. 将 Ak 的值加 d. 2. 查询 As+As+1+⋯+At(s≤t) 的值. [输入格式] 第一行为一个整数 n(0≤n≤100000),表示数列 A 的大小. 第…
[题意]给定序列,支持区间加和区间乘,查询区间和取模.n<=10^5. [算法]线段树 [题解]线段树多重标记要考虑标记与标记之间的相互影响. 对于sum*b+a,+c直接加上即可. *c后就是(sum*b+a)*c=sum*b*b+a*c,也就是加法的部分也要乘. 所以,每次在乘法的时候要把加法标记也乘上.下传时先传乘法. 注意乘法初始值为1,但是取模后可能为0. #include<cstdio> #include<cstring> #include<cctype&g…
题目链接 #include<cmath> #include<cstdio> #include<cctype> #include<algorithm> using namespace std; const int N=1e5+5; int n,m,A[N],size,belong[N],sum[N]/*某块的总和*/,tag[N]/*某块的加标记*/; inline int read() { int now=0,f=1;register char c=getc…
时间限制:1 s   内存限制:160 MB [问题描述] 假设有一列数 {Ai }(1 ≤ i ≤ n) ,支持如下两种操作: (1)将 A k 的值加 D .( k, D 是输入的数) (2) 输出 A s +A s+1 +…+A t .( s, t 都是输入的数, S ≤ T ) 根据操作要求进行正确操作并输出结果. [输入格式] 输入文件第一行一个整数 n(0<=n<=100000) , 第二行为 n 个整数,表示 {A i } 的初始值. 第三行为一个整数 m(0<=m<…