题目链接:传送门

题目大意:略

题目思路:线段树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. 关于spring中<context:component-scan base-package="" />写法

    1.通配符形式<context:component-scan base-package="com.*" /> 2.全路径 <context:component-s ...

  2. IIS7如何部署asp.net网站 (asp.net mvc 5 , asp.net 4.5 , asp.net 4.0 都可以 )

      第一步:发布网站 右键asp.net web项目,选择发布, 然后新建配置文件名称并选择 "文件系统" 发布方法. 目标位置选择本地新建的文件夹如: IISWebSite 第二 ...

  3. javascript中call apply的区别

    obj.call(thisObj, arg1, arg2, ...); obj.apply(thisObj, [arg1, arg2, ...]); 两者作用一致,都是把obj(即this)绑定到th ...

  4. html5-表单常见操作

    <form  autocompelate="on" id="from1"><!--常用属性-->邮件:<input type=&q ...

  5. C#反射取数组单个元素的类型

    去bing上查了一下,果然有和我一样蛋疼的朋友,他们在论坛研究了半天,最后还是暴力解决: public Type GetArrayElementType(Type t) { string tName ...

  6. PHP获得数组的交集与差集

    PHP获得数组的交集与差集 作者:简明现代魔法图书馆 发布时间:-- :: 次阅读 服务器君一共花费了218. ms进行了6次数据库查询,努力地为您提供了提供了这个页面. 数组的交集 array_in ...

  7. COOKIE和session的机制详解

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  8. freemarker和jsp的比较

    1.共享变量 FreeMarker 的共享变量是我最喜欢的“隐藏”功能之一.此功能可以让你设置自动添加到所有模板的值. 例如,可以设置应用程序的名称作为共享变量. 1 2 Configuration ...

  9. ExtFormReturn,ext

    package cn.edu.hbcf.common.vo; public class ExtFormReturn { /** * 是否成功 */ private boolean success; / ...

  10. nginx php-fpm启用慢日志slowlog

    php-fpm慢日志slowlog设置可以让我们很好的看见哪些php进程速度太慢而导致的网站问题. 可以让我们方便的找到问题的所在.  代码如下 1 vi /data1/server/php-cgi/ ...