题目链接:传送门

题目大意:略

题目思路:线段树or树状数组

     我们可以将区间值做一些调整。a*3+b*2+c=a+(a+b)+(a+b+c)

     也就是利用前缀和建树。然后单点更新也就转换成了区间更新。修改一个点x时,需要修改 x~n 的值(因为是按前缀和建树

     查询时也很简单,查询 x~y,则直接返回 x~y的值,再减去 (x-1的值)*(y-x+1),要把(1~x)的前缀和减去。

     用线段树时要注意一个坑点,若查询时 x==1,则不用减去任何值直接输出即可,否则有可能RE(别问我怎么知道的

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r ///宏
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 1000005
#define maxn 100005
typedef pair<int,int> PII;
typedef long long LL; int n,m,k,cnt,L,R;
LL a[maxn],mrk[maxn<<],v;
struct Node{
int l,r;
LL v;
}node[maxn<<];
void build(int rt,int l,int r){
node[rt].l=l;node[rt].r=r;
if(l==r){
node[rt].v=a[l];
return;
}
int mid=l+r>>;
build(lson);
build(rson);
node[rt].v=node[rt<<].v+node[rt<<|].v;
}
inline void pushup(int rt){
int t=rt<<;
mrk[t]+=mrk[rt];
mrk[t|]+=mrk[rt];
node[t].v+=mrk[rt]*(node[t].r-node[t].l+);
node[t|].v+=mrk[rt]*(node[t|].r-node[t|].l+);
mrk[rt]=;
}
void add(int rt,int l,int r){
if(L<=l&&r<=R){
node[rt].v+=v*(r-l+);
mrk[rt]+=v;
return;
}
if(mrk[rt])pushup(rt);
int mid=l+r>>;
if(R<=mid)add(lson);
else if(L>mid)add(rson);
else add(lson),add(rson);
node[rt].v=node[rt<<].v+node[rt<<|].v;
}
LL get(int rt,int l,int r){
if(L<=l&&r<=R) return node[rt].v;
int mid=l+r>>;
if(mrk[rt])pushup(rt);
if(R<=mid)return get(lson);
else if(L>mid)return get(rson);
else return get(lson)+get(rson);
}
int main(){
int i,j,x,y;
scanf("%d%d",&n,&m);
for(i=;i<=n;++i){
scanf("%lld",&a[i]);
a[i]+=a[i-];
}
build(,,n);
while(m--){
scanf("%d%d%lld",&y,&x,&v);
if(y==){
L=x;R=n;
add(,,n);
}
else{
L=x;R=(int)v;
LL ans=get(,,n);
if(x>){
L=x-;R=x-;
ans-=get(,,n)*(v-x+);
}
printf("%lld\n",ans);
}
}
return ;
}

再附上树状数组代码

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int N=;
typedef long long ll;
ll c[][N];
int n;
void add(int p,int x,ll y){while(x<=n){c[p][x]+=y;x+=x&-x;}}
ll query(int p,int x){ll r=;while(x){r+=c[p][x];x-=x&-x;}return r;}
int main(){
int q,i,ty;
ll x,y,ans;
scanf("%d %d",&n,&q);
for(i=;i<=n;i++){
scanf("%lld",&x);
add(,i,x);
add(,i,i*x);
}
for(i=;i<=q;i++){
scanf("%d %lld %lld",&ty,&x,&y);
if(ty==){
add(,x,y);
add(,x,x*y);
}
else{
ans=(y+)*(query(,y)-query(,x-))-(query(,y)-query(,x-));
printf("%lld\n",ans);
}
}
return ;
}

洛谷OJ P2846 LJJ的数学课的更多相关文章

  1. USACO Section 1.3 题解 (洛谷OJ P1209 P1444 P3650 P2693)

    usaco ch1.4 sort(d , d + c, [](int a, int b) -> bool { return a > b; }); 生成与过滤 generator&& ...

  2. [洛谷OJ] P1114 “非常男女”计划

    洛谷1114 “非常男女”计划 本题地址:http://www.luogu.org/problem/show?pid=1114 题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太 ...

  3. 洛谷OJ P1196 银河英雄传说(带权并查集)

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

  4. USACO1.4 1.5 搜索剪枝与数字 洛谷OJ P1214 P1215 P1217 P1218

    USACO1.4 题解 Arithmetic Progressions 题意 让你求长为n的由小于2*m*m的双平方数组成的等差数列有几个 双平方数:形如 B=P*P+Q*Q,p,q>0的数 题 ...

  5. 洛谷OJ U552 守墓人 线段树模板题

    题目描述 Description 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然... ...

  6. 洛谷OJ P2356 弹珠游戏 维护前缀和

    题目描述 Description MedalPluS 和他的小伙伴 NOIRP 发掘了一个骨灰级别的游戏--超级弹珠. 游戏的内容是:在一个 n*n 的矩阵里,有若干个敌人,你的弹珠可以摧毁敌人,但只 ...

  7. 洛谷oj U3936(分成回文串) 邀请码:a0c9

    题目链接:传送门 题目大意:略 题目思路:DP 先预处理,分别以每个字母为中心处理能形成的回文串,再以两个字母为中心处理能形成的回文串. 然后 dp[i] 表示1~i 能形成的数目最少的回文串. 转移 ...

  8. 洛谷 P1763 状态压缩dp+容斥原理

    (题目来自洛谷oj) 一天,maze决定对自己的一块n*m的土地进行修建.他希望这块土地共n*m个格子的高度分别是1,2,3,...,n*m-1,n*m.maze又希望能将这一些格子中的某一些拿来建蓄 ...

  9. [洛谷P1707] 刷题比赛

    洛谷题目连接:刷题比赛 题目背景 nodgd是一个喜欢写程序的同学,前不久洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- ...

随机推荐

  1. C语言-数据结构(一)

    1.动态创建多维数组 int ** createArray(int rows, int cols) { int **x, i; x = (int **)malloc(rows * sizeof(*x) ...

  2. Layui 弹出层组件——layer的模块化开发实例应用

    Layui 弹出层组件——layer的模块化开发实例应用 1.首先在package.json中引入layer组件依赖 2.在源码中应用这个依赖 3.在源码中编写代码应用此组件 4.效果验证:点击日历上 ...

  3. 【SpringMVC学习01】宏观上把握SpringMVC框架

    springmvc是一个基于mvc的web框架,是spring框架的一个模块,所以springmvc和spring无需通过中间整合层进行整合.我们先来看下spring的一个架构模型,看springmv ...

  4. jedis连接集群

    /**        * 集群版        */       @Test       public  void JedisJiuQun()       {           HashSet< ...

  5. python --存储对象

    转自:http://www.cnblogs.com/vamei/archive/2012/09/15/2684781.html 在之前对Python对象的介绍中 (面向对象的基本概念,面向对象的进一步 ...

  6. MapReduce实现两表的Join--原理及python和java代码实现

    用Hive一句话搞定的,可是有时必需要用mapreduce 方法介绍 1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是很常见且很耗时的.而在HADOOP中进行JOIN操作.相同常见且耗时, ...

  7. sklearn word2vec 实践

    源代码: https://blog.csdn.net/github_38705794/article/details/75452729 一.复现时报错: Traceback (most recent ...

  8. IIS8.5设置 MVC HTTP 错误 404.0 - Not Found

    0. 确认 设置IIS的“ISAPI和CGI限制”中的“ASP.NET v4.0.0.30319”为允许 1. 解决方案 <system.webServer>    <modules ...

  9. 定时检测Memcached进程是否存在,若不存在自动启动它

    由于一台WEB服务器的Memcached死掉而导致在访问网站的某些页面时候打不开.下面脚本会自动检测Memcached的进程,如果挂掉则自动重启Memcached服务. vim memcached_c ...

  10. 多线程-Thread与Runnable源码分析

    Runnable: @FunctionalInterface public interface Runnable { /** * When an object implementing interfa ...