hihocoder 1116 : 计算(线段树 区间合并)
2017-10-22 12:52
381 查看
l表示每个前缀之积的和
r表示每个后缀之积的和
m表示区间内所有数字之积
查询的结果就是整个区间的结果。
r表示每个后缀之积的和
m表示区间内所有数字之积
查询的结果就是整个区间的结果。
#include <bits/stdc++.h> using namespace std; typedef long long LL; #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 const int MAXN = 1e5+10; const int mod = 10007; int sum[MAXN<<2]; int m[MAXN<<2]; int l[MAXN<<2]; int r[MAXN<<2]; void pushUp(int rt) { sum[rt] = (sum[rt<<1] + sum[rt<<1|1] + r[rt<<1]*l[rt<<1|1])%mod; l[rt] = (l[rt<<1] + l[rt<<1|1]*m[rt<<1])%mod; r[rt] = (r[rt<<1|1] + r[rt<<1]*m[rt<<1|1])%mod; m[rt] = (m[rt<<1]*m[rt<<1|1])%mod; } void update(int l, int r, int rt, int pos, int val) { if(l == r) { sum[rt] = ::l[rt] = ::r[rt] = m[rt] = val%mod; return; } int mid = (l+r) >> 1; if(pos > mid) update(rson, pos, val); else update(lson, pos, val); pushUp(rt); } int main() { int n,q,x,val; while(scanf("%d %d",&n,&q) != EOF) { memset(sum,0,sizeof(sum)); memset(m,0,sizeof(m)); memset(l,0,sizeof(l)); memset(r,0,sizeof(r)); while(q--) { scanf("%d %d",&x,&val); update(1,n,1,x,val); printf("%d\n",sum[1]); } } return 0; }
相关文章推荐
- hihoCoder 1116 计算 线段树 + 区间合并
- hihoCoder - 1116 - 计算 (线段树区间合并)
- hihocoder-1116 : 计算 (线段树区间合并)
- hihoCoder - 1116 - 计算 (线段树)
- hihoCoder 1116 计算 (线段树)
- hihoCoder#1116-计算[线段树+合并区间]
- hihoCoder 1116 计算(线段树)
- LA 3938 线段树(区间合并)
- 线段树 区间合并
- 线段树区间合并LCIShdu3308
- PKU 3667 Hotel (线段树,区间合并,最长连续区间)
- POJ3667:Hotel(线段树区间合并)
- 杭电3308 LCIS(线段树区间合并)
- hdu 1540 Tunnel Warfare(线段树单点更新+区间合并)
- hihocoder 1078 线段树的区间修改线段树(区间修改 区间求和)
- hdu 1540 & poj 2892Tunnel Warfare(线段树区间合并)
- HDU3308 线段树(区间合并)
- POJ 3667 & 1823 Hotel (线段树区间合并)
- HDU 3308 LCIS(线段树单点更新区间合并)
- 【POJ 3667】 hotel 【线段树 +区间操作+区间合并】