题目链接

现在有一个有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 ;
}

hiho1116 - 数据结构 线段树(区间合并)的更多相关文章

  1. POJ 2482 Stars in Your Window (线段树区间合并+扫描线)

    这题开始一直被矩形框束缚了,想法一直都是枚举线,但是这样枚举都需要O(n^2)...但是看了别人的思路,感觉这题思想真心很好(PS:开头好浪漫的描述啊,可惜并没有什么用)  题意就是在平面上给你一些星 ...

  2. HDU 3911 线段树区间合并

    北京赛区快了,准备袭击数据结构和图论.倒计时 18天,线段树区间合并.维护一个最长连续.. 题意:给一个01串,以下有一些操作,问区间最长的连续的1的个数 思路:非常裸的线段树区间合并 #includ ...

  3. POJ 3667 Hotel(线段树 区间合并)

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

  4. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

  5. HDU 3911 Black And White(线段树区间合并+lazy操作)

    开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...

  6. HYSBZ 1858 线段树 区间合并

    //Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...

  7. poj3667 线段树 区间合并

    //Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  8. hdu3911 线段树 区间合并

    //Accepted 3911 750MS 9872K //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  9. 线段树(区间合并) POJ 3667 Hotel

    题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...

随机推荐

  1. Exception异常常见属性

    废话少说,直接上代码: try { int n = Convert.ToInt32("@"); } catch(Exception ex) { Console.WriteLine( ...

  2. CentOS 7.1 下载,安装,配置

    CentOS(全称 Community Enterprise Operating System)是 RHEL 源代码再编译的产物. 2014年初,CentOS 宣布加入 Red Hat. CentOS ...

  3. MySQL 5.6.26 误删ibdata恢复

    [root@hank-yoon ~]# ps -ef | grep mysqlroot 1129 1 0 15:30 pts/0 00:00:00 /bin/sh /export/servers/my ...

  4. Long型转换成IP段String、StringIP段转换成Long型

    /** 把long类型的Ip转为一般Ip类型:xx.xx.xx.xx * * @param ip * @return */ public static String getIpFromLong(Lon ...

  5. sed将上下两行并列

    #cat log5 mmmm 1234 nnnn 2344 #sed -n '{N;s/\n/\t/p}' log5 mmmm 1234 nnnn 2344

  6. BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)

    ---恢复内容开始--- 题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相 ...

  7. Hive中的一种假NULL

    Hive中有种假NULL,它看起来和NULL一摸一样,但是实际却不是NULL. 例如如下这个查询: hive> desc ljn004; OK a       string Time taken ...

  8. C# 实现窗口程序winform像QQ一样靠近桌面边缘自动隐藏窗口

    实现原理: 实现这个功能的原理步骤如下: 1.判断窗体程序是否靠近桌面边缘: 2.获取桌面屏幕大小与窗体程序大小: 3.把窗体程序显示在桌面以外隐藏起来,预留部分窗体方便用户拉出程序: 4.判断鼠标是 ...

  9. Spring中的InitializingBean接口

    InitializingBean接口为bean提供了初始化方法的方式,它只有afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: impo ...

  10. 2015 Multi-University Training Contest 1 hdu 5296 Annoying problem

    Annoying problem Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...