洛谷OJ P2846 LJJ的数学课
题目链接:传送门
题目大意:略
题目思路:线段树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的数学课的更多相关文章
- 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&& ...
- [洛谷OJ] P1114 “非常男女”计划
洛谷1114 “非常男女”计划 本题地址:http://www.luogu.org/problem/show?pid=1114 题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太 ...
- 洛谷OJ P1196 银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
- 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的数 题 ...
- 洛谷OJ U552 守墓人 线段树模板题
题目描述 Description 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然... ...
- 洛谷OJ P2356 弹珠游戏 维护前缀和
题目描述 Description MedalPluS 和他的小伙伴 NOIRP 发掘了一个骨灰级别的游戏--超级弹珠. 游戏的内容是:在一个 n*n 的矩阵里,有若干个敌人,你的弹珠可以摧毁敌人,但只 ...
- 洛谷oj U3936(分成回文串) 邀请码:a0c9
题目链接:传送门 题目大意:略 题目思路:DP 先预处理,分别以每个字母为中心处理能形成的回文串,再以两个字母为中心处理能形成的回文串. 然后 dp[i] 表示1~i 能形成的数目最少的回文串. 转移 ...
- 洛谷 P1763 状态压缩dp+容斥原理
(题目来自洛谷oj) 一天,maze决定对自己的一块n*m的土地进行修建.他希望这块土地共n*m个格子的高度分别是1,2,3,...,n*m-1,n*m.maze又希望能将这一些格子中的某一些拿来建蓄 ...
- [洛谷P1707] 刷题比赛
洛谷题目连接:刷题比赛 题目背景 nodgd是一个喜欢写程序的同学,前不久洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- ...
随机推荐
- 阿里云 oss python3 样例
阿里云的oss SDK又是不支持python3,头疼头疼. 本想改一改它的SDK,让它支持python2+python3,无奈里面大量的代码使用不带括号的print.工作量恐怖. 幸好oss的使用很e ...
- Bootstrap学习笔记面板(Panels)
本文将讲解Bootstrap面板(Panels).面板组件用于把DOM组件插入到一个盒子中.创建一个基本的面板,只需要向div元素添加class .panel和 panel-default即可,如下面 ...
- AFN访问https设置
AFN访问https的时候需要设定如下两个属性: manager.securityPolicy.allowInvalidCertificates = YES; manager.securityPoli ...
- 基于DDD的.NET开发框架-DDD经典分层
DDD核心思想是由业务问题来控制解决方案的形式从以数据库为中心过渡到领域模型为中心 下面这个图是我在<领域驱动设计与模式实战>书中拍下来的,他完全诠释DDD的经典分层. 程序代码中也是响应 ...
- SQL Server Profiler 跟踪sql小技巧
使用Profile监控sql时候经常会有很多很多的sql,想查询那条是自己的sql很困难,但是连接字串有个参数可以解决这个问题这个参数是Application Name例如说 我们在需要的数据库连接中 ...
- mongodb - mongostat说明
# ./mongostat insert query update delete getmore command % dirty % used flushes vsize res qr|qw ar|a ...
- PHP REST架构简单设计
REST是什么? REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性. REST的特点 ...
- atitit.浏览器插件解决方案----ftp插件 attilax 总结
atitit.浏览器插件解决方案----ftp插件 attilax 总结 1. 界面概览 D:云盘同步文件夹p5p5f tp.demo.html1 2. 初始化1 3. 事实调用2 4. 参考2 ...
- Post+Get方式接口测试代码编写
详细代码如下 package testproject; import java.io.BufferedReader; import java.io.IOException; import java.i ...
- 广告过滤神器(ADMuncher)4.93
Ad Muncher 介绍: 浏览网页时,冷不防地被网站播放的MIDI音乐声音吓一跳,或是因为弹出的广告窗口碍事,而影响你上网络的心情.Ad Muncher支持Netscape.Inte ...