https://scut.online/p/337

这个东西是个阶梯状的。那么可以考虑存两棵树,一棵树是阶梯的,另一棵树的平的,随便一减就是需要的阶梯。

优化之后貌似速度比树状数组还惊人。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;inline int read() {int x=0;int f=0;char c;do {c=getchar();if(c=='-')f=1;} while(c<'0'||c>'9');do {x=(x<<3)+(x<<1)+c-'0';c=getchar();} while(c>='0'&&c<='9');return f?-x:x;
}inline void _write(int x) {if(x>9)_write(x/10);putchar(x%10+'0');
}inline void write(int x) {if(x<0) {putchar('-');x=-x;}_write(x);putchar('\n');
}void TestCase(int ti);int main() {
#ifdef Yinkufreopen("Yinku.in","r",stdin);//freopen("Yinku.out","w",stdout);
#endif // Yinkuint T=1;for(int ti=1; ti<=T; ti++)TestCase(ti);
}/*---  ---*/const int MAXM=100000;
int a[MAXM+5];
int st[(MAXM<<2)+5];
int st2[(MAXM<<2)+5];const int mod=1000000007;inline int add(const int &a,const int &b){int res=a+b;return res>=mod?res-mod:res;
}inline int sub(const int &a,const int &b){int res=a-b;return res<0?res+mod:res;
}inline int mul(const int &a,const int &b){ll res=1ll*a*b;return res>=mod?res%mod:res;
}inline void push_up(int o) {st[o]=add(st[o<<1],st[o<<1|1]);st2[o]=add(st2[o<<1],st2[o<<1|1]);
}void build(int o,int l,int r) {if(l==r){st[o]=a[l];st2[o]=mul(l,a[l]);}else {int m=(l+r)>>1;build(o<<1,l,m);build(o<<1|1,m+1,r);push_up(o);}
}void update(int o,int l,int r,int x,int v) {if(l==r) {st[o]=v;st2[o]=mul(x,v);return;} else {int m=(l+r)>>1;if(x<=m)update(o<<1,l,m,x,v);else if(x>=m+1)update(o<<1|1,m+1,r,x,v);push_up(o);}
}int query1(int o,int l,int r,int a,int b) {if(a<=l&&r<=b) {return st[o];} else {int m=(l+r)>>1;int ans=0;if(a<=m)ans=query1(o<<1,l,m,a,b);if(b>=m+1)ans=add(ans,query1(o<<1|1,m+1,r,a,b));return ans;}
}int query2(int o,int l,int r,int a,int b) {if(a<=l&&r<=b) {return st2[o];} else {int m=(l+r)>>1;int ans=0;if(a<=m)ans=query2(o<<1,l,m,a,b);if(b>=m+1)ans=add(ans,query2(o<<1|1,m+1,r,a,b));return ans;}
}inline void TestCase(int ti) {int n,m;while(~scanf("%d",&n)) {for(int i=1; i<=n; i++)scanf("%d",&a[i]);build(1,1,n);scanf("%d",&m);for(int i=1; i<=m; i++) {char a[2];int b,c;scanf("%s%d%d",a,&b,&c);if(a[0]=='Q') {printf("%d\n",sub(query2(1,1,n,b,c),mul(b-1,query1(1,1,n,b,c))));} else {update(1,1,n,b,c);}}}
}

这个树状数组就不太好懂了,不过空间是线段树的1/4,速度是其两倍。
单点改值就把差值update上去就可以了。然后记得把原始值也顺手改了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;inline int read() {int x=0;int f=0;char c;do {c=getchar();if(c=='-')f=1;} while(c<'0'||c>'9');do {x=(x<<3)+(x<<1)+c-'0';c=getchar();} while(c>='0'&&c<='9');return f?-x:x;
}inline void _write(int x) {if(x>9)_write(x/10);putchar(x%10+'0');
}inline void write(int x) {if(x<0) {putchar('-');x=-x;}_write(x);putchar('\n');
}void TestCase(int ti);int main() {
#ifdef Yinkufreopen("Yinku.in","r",stdin);//freopen("Yinku.out","w",stdout);
#endif // Yinkuint T=1;for(int ti=1; ti<=T; ti++)TestCase(ti);
}/*---  ---*/const int MAXM=100000;
int a[MAXM+5];
int bit[MAXM+5];
int bit2[MAXM+5];int n;const int mod=1000000007;inline int add(const int &a,const int &b) {int res=a+b;return res>=mod?res-mod:res;
}inline int sub(const int &a,const int &b) {int res=a-b;return res<0?res+mod:res;
}inline int mul(const int &a,const int &b) {ll res=1ll*a*b;return res>=mod?res%mod:res;
}inline int sum(int x,int bit[]) {int res=0;while(x) {res=add(res,bit[x]);x-=x&-x;}return res;
}inline void update(int x,int v,int bit[]) {while(x<=n) {bit[x]=add(bit[x],v);x+=x&-x;}
}inline int range_sum(int x,int y,int bit[]) {return sub(sum(y,bit),sum(x-1,bit));
}inline void TestCase(int ti) {int m;while(~scanf("%d",&n)) {memset(bit,0,sizeof(bit));memset(bit2,0,sizeof(bit2));for(int i=1; i<=n; i++) {scanf("%d",&a[i]);update(i,a[i],bit);update(i,mul(i,a[i]),bit2);}scanf("%d",&m);for(int i=1; i<=m; i++) {char s[2];int b,c;scanf("%s%d%d",s,&b,&c);if(s[0]=='Q') {printf("%d\n",sub(range_sum(b,c,bit2),mul(b-1,range_sum(b,c,bit))));} else {int delta=sub(c,a[b]);update(b,delta,bit);update(b,mul(b,delta),bit2);a[b]=c;}}}
}

转载于:https://www.cnblogs.com/Yinku/p/11039894.html

SCUT - 337 - 岩殿居蟹 - 线段树 - 树状数组相关推荐

  1. 树状数组及线段树入门(SDNU1665-1668)

    目录 前言 树状数组 先导 单点修改区间查询 区间修改区间查询 线段树 先导 单点修改区间查询--递归形式 单点修改区间查询--非递归形式 区间修改区间查询--递归形式 区间修改区间查询--非递归形式 ...

  2. 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)

    解题思路: 首先我们知道交换两个数a[l]和a[r]a[l]和a[r]a[l]和a[r]影响到的区间是[l+1,r−1][l+1,r-1][l+1,r−1] 对于a[l]a[l]a[l],我们要减去[ ...

  3. 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大

    题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax​为yyy 解题思路: 首先我们知道权值线段树是 ...

  4. poj 2352 Stars 线段树(先建后查/边建边查)/树状数组三种方法思路详解,带你深入了解线段树难度⭐⭐⭐★

    poj 2352 Stars 目录 poj 2352 Stars 1.树状数组 2.线段树,先建树后查找 3.线段树,边建树边查找 Description Astronomers often exam ...

  5. 8.8线段树和树状数组

    题目链接   http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28619#overview 密码 acmore 还是感觉不怎么会线段树,还是 ...

  6. 线段树/树状数组问题 | 问题集合

    写在前面 线段树代码实在冗长,于是乎能用树状数组直接搞的就懒得打线段树了(:溜 1.P2620[QZYZ] 校门外的树 描述 Description 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有 ...

  7. 花神游历各国 题解(小清新线段树/树状数组+并查集)

    题面 众所周知,这是一道小清新线段树 然而可以用树状数组水过去且跑得飞快 看到区间开方第一反应肯定是线段树懒标记区间修改之类的,但是这个东西似乎确凿不可维护 所以考虑暴力循环单点修改->T飞 于 ...

  8. LeetCode Range Sum Query - Mutable(树状数组、线段树)

    问题:给出一个整数数组,求出数组从索引i到j范围内元素的总和.update(i,val)将下标i的数值更新为val 思路:第一种方式是直接根据定义,计算总和时直接计算从i到j的和 第二种方式是使用树状 ...

  9. hdu 4417(线段树OR树状数组)

    题意:输入一个长度为n的序列,然后m个询问,询问区间[a,b]中比h小的数的个数. 思路:树状数组或线段树离线处理. 树状数组1 View Code 1 #include<cstdio> ...

最新文章

  1. empty怎么发音_empty,怎么读,解答要读出来,empty怎么读慢一点,清楚一点!
  2. R语言dplyr包使用transmute函数生成新的数据列(删除所有原数据列)实战
  3. ARTS打卡计划第二周-Share-使用java注解对方法计时
  4. python就业方向有哪些-目前Python这么火,Python有哪些就业方向?
  5. 下一代 Debian - \'Lenny\' 代码冻结
  6. 模拟操作系统动态内存管理(c实现)
  7. OpenResty简介
  8. 谈谈Spring中都用到了那些设计模式
  9. java中Map有哪些实现类
  10. leetcode100. 相同的树(dfs)
  11. java都市男人心痒痒_会让男人心痒痒的女人,是懂得套路的
  12. css3实现的精美菜单
  13. 支付宝:“答答星球”小程序上线20天累计参与人数超2亿
  14. 在Vue.js中使用Mixin
  15. 大数据平台目前存在的问题
  16. 深度学习之江湖~那些大神们
  17. 苹果手机怎么投屏王者荣耀
  18. 利用按键精灵实现QQ群发和微信群发
  19. Android新浪微博授权提示:文件不存在 C8998 的终极解决方法
  20. st语言 数组的常用方法_LINEST函数使用方法介绍

热门文章

  1. 四十六、Qt网络(六)UDP
  2. css expression
  3. 小程序开发实战学习笔记
  4. android_jsbridge,让你和前端愉快的交互
  5. FTP开启虚拟用户访问
  6. 介绍Python的魔术方法 - Magic Method
  7. 都快下班了,才来写日记
  8. elasticsearch7.9.2 安装配置
  9. Android inflate方法与 findViewById 方法区别
  10. Android全局对象Application的使用,以及如何在任何地方得到Application全局对象