hiho1116 - 数据结构 线段树(区间合并)
2024-08-23 15:26:16
现在有一个有n个元素的数组a1, a2, ..., an。
记f(i, j) = ai * ai+1 * ... * aj。
初始时,a1 = a2 = ... = an = 0,每次我会修改一个ai的值,你需要实时反馈给我 ∑1 <= i <= j <= n f(i, j)的值 mod 10007。
第一行包含两个数n(1<=n<=100000)和q(1<=q<=500000)。
接下来q行,每行包含两个数i, x,代表我把ai的值改为了x。
/*******************************************************/
记两个数的区间【a,b】
[a,b].sum = a+b+a*b;
[a,b].prefix = a+a*b;
[a,b].suffix = b+a*b;
[a,b].product = a*b;
当合并区间【a,b】和【c,d】时
有[a,b,c,d].sum = [a,b].sum+[c,d].sum+[a,b].suffix*[c,d].prefix;
[a,b,c,d].product = a*b*c*d = [a,b].product*[c,d].product;
.product的存在是为了维护prefix和suffix,因为:
[a,b,c,d].prefix = [a,b].prefix + [a,b].product*[c,d].prefix;
[a,b,c,d].suffix = [c,d].suffix + [c,d].product*[a,b].suffix;
#include <cstdio>
#include <cstring>
const int N = ;
const int MOD = ;
struct NODE{
int l,r;
int sum;
int prefix,suffix,product;
NODE(){
sum = prefix = suffix = product = ;
}
int MID(){ return (l+r)>>; }
};
NODE segtree[N*];
void build(int id,int l,int r){
segtree[id].l = l;
segtree[id].r = r;
if(l==r) return ;
int mid = (l+r)>>;
build(id*,l,mid);
build(id*+,mid+,r);
}
void modify(int id,int pos,int value){
if((segtree[id].l==segtree[id].r)&&(segtree[id].l==pos)){
segtree[id].sum = segtree[id].prefix = segtree[id].suffix = segtree[id].product = (value)%MOD;
return ;
}
int mid = segtree[id].MID();
if(pos<=mid) modify(id*,pos,value);
else modify(id*+,pos,value); segtree[id].sum = ((segtree[id*].sum+segtree[id*+].sum)+(segtree[id*].suffix*segtree[id*+].prefix)%MOD)%MOD;
segtree[id].prefix = (segtree[id*].prefix+(segtree[id*].product*segtree[id*+].prefix)%MOD)%MOD;
segtree[id].suffix = (segtree[id*+].suffix+(segtree[id*+].product*segtree[id*].suffix)%MOD)%MOD;
segtree[id].product = (segtree[id*].product*segtree[id*+].product)%MOD;
}
int main(){
int n,q,a,b;
scanf("%d%d",&n,&q);
build(,,n);
while(q--){
scanf("%d%d",&a,&b);
modify(,a,b);
printf("%d\n",segtree[].sum);
}
return ;
}
最新文章
- XML中输入特殊符号
- C++ 基础知识复习(三)
- 给Source Insight做个外挂系列之二--将本地代码注入到Source Insight进程
- js判断浏览器,包括Edge浏览器
- poj1988(并查集)
- android 入门-git之上传本地代码到github
- LIS(n^2) POJ 2533 Longest Ordered Subsequence
- Shtml妙用
- 转:ASP.NET MVC + EF 更新的几种方式
- HDU 1159 Common Subsequence
- PHPcms 摘要
- 强大的日志分析工具 -- NSLogger
- PAT_1046 划拳
- mysql配置文件转载
- Python递归函数与斐波那契数列
- Oracle ASM数据库故障数据恢复过程
- [转]同一台Windows机器中启动多个Memcached服务
- 我所理解的Android 启动模式
- DataRead和DataSet的异同
- 创建虚拟目录失败,必须为服务器名称指定“localhost”