hihoCoder 1116 计算 (线段树)
题意 :
描述
现在有一个有n个元素的数组a1, a2, ..., an。
记f(i, j) = ai * ai+1 * ... * aj。
初始时,a1 = a2 = ... = an = 0,每次我会修改一个ai的值,你需要实时反馈给我 ∑f(i, j) (1 <= i <= j <= n) 的值 mod 10007。
输入
第一行包含两个数n(1<=n<=100000)和q(1<=q<=500000)。
接下来q行,每行包含两个数i, x,代表我把ai的值改为了x。
输出
分别输出对应的答案,一个答案占一行。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define INF 0x7fffffff
struct node{
int l;
int r;
long long value; //al ~ ar 的乘积
long long lsum; //所有前缀积之和
long long rsum; //所有后缀积之和
long long ans; //∑ f(i, j) (1 <= i <= j <= n)
}a[400010];
void buildtree(int i,int l,int r){
a[i].l = l;
a[i].r = r;
a[i].value = 0;
a[i].lsum = 0 ;
a[i].rsum = 0;
a[i].ans = 0;
if(l == r)
return ;
int mid = (l + r) / 2;
buildtree(i << 1,l,mid);
buildtree((i << 1) + 1,mid+1,r);
}
void update(int no,int k,int b){
if(a[no].l == a[no].r){
a[no].value = b;
a[no].lsum = b ;
a[no].rsum = b;
a[no].ans = b;
return ;
}
int mid = (a[no].l +a[no].r) / 2;
if(k<=mid)
update(no<<1,k,b);
else
update((no<<1)+1,k,b);
a[no].value = (a[no<<1].value * a[no*2+1].value)%10007;
a[no].lsum = (a[no*2].lsum + a[no*2].value*a[no*2+1].lsum)%10007;
a[no].rsum = (a[no*2+1].rsum + a[no*2+1].value*a[no*2].rsum)%10007;
a[no].ans = (a[no*2].ans + a[no*2+1].ans + a[no*2].rsum * a[no*2+1].lsum)%10007;
}
int main(){
int i,j,n,q,k,b;
while(scanf("%d%d",&n,&q) == 2){
buildtree(1,1,n);
for(i=1;i<=q;i++){
scanf("%d%d",&k,&b);
update(1,k,b);
printf("%d\n",a[1].ans%10007);
}
}
return 0;
}
hihoCoder 1116 计算 (线段树)的更多相关文章
- hihoCoder 1116 计算(线段树)
http://hihocoder.com/problemset/problem/1116 题意: 思路: 用线段树解决,每个节点需要设置4个变量,sum记录答案,all记录整个区间的乘积,pre记录该 ...
- hihoCoder#1080 (线段树)
题目大意:线段树的区间更改与查询,但是涉及到两种区间修改方式,一是给区间中的数全部加上一个数,二是将一个区间全部置为同一个数,然后询问整个区间和. 题目分析:处理好set操作和add操作的先后顺序就O ...
- 洛谷P4588 [TJOI2018]数学计算(线段树)
题意 题目链接 Sol TJOI怎么全是板子题 对时间开个线段树,然后就随便做了.... #include<bits/stdc++.h> using namespace std; cons ...
- BZOJ5334:[TJOI2018]数学计算(线段树)
Description 小豆现在有一个数x,初始值为1. 小豆有Q次操作,操作有两种类型: 1 m: x = x * m ,输出 x%mod; 2 pos: x = x / 第pos次操作所乘 ...
- [TJOI2018]数学计算 线段树
---题面--- 题解: ,,,考场上看到这题,没想到竟然是省选原题QAQ,考场上把它当数学题想了好久,因为不知道怎么处理有些数没有逆元的问题....知道这是线段树后恍然大悟. 首先可以一开始就建出一 ...
- hihoCoder #1079 : 离散化 (线段树,数据离散化)
题意:有一块宣传栏,高一定,给出长度,再给出多张海报的张贴位置,问还能见到几张海报(哪怕有一点被看到)?假设海报的高于宣传栏同高. 思路:问题转成“给出x轴上长为L的一条线段,再用n条线段进行覆盖上去 ...
- Hihocoder 1116 计算
这题最开始的时候看到线段树吧,没找到好的做法 想了下既然是乘积和 (-) (--) (---) 在脑子里就是这种线条位于各个位置,然后各种长度代表连续的乘积个数 然后把所有情况累加起来,但是并不好算 ...
- hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
随机推荐
- Ext中图片上传预览的问题,困扰了好几天终于解决了,记录下
{ columnWidth:.50, xtype:'textfield', style:"padding-top:5px", name:'goodsMainPhoto', id:' ...
- 合并多个excel工作簿
合并多个Excel工作簿,会出现电话号码以科学计数法显示,如果想要以字符串方式处理,要按如下完整代码 public static void mergeWorkBook() throws Excepti ...
- (转)iOS Wow体验 - 第六章 - 交互模型与创新的产品概念(1)
本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第六章译文精选,其余章节将陆续放出.上一篇:Wow ...
- Javascript:字符串分割split()妙用
概述: split() 方法将字符串分割为字符串数组,并返回此数组 语法格式: stringObject.split(separator,limit) 参数说明: 注意:如果把空字符串 (" ...
- Java中普通代码块,构造代码块,静态代码块的代码演示样例及区分
//运行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 当中静态代码块仅仅运行一次.构造代码块在每次创建对象是都会运行. 1 普通代码块 <span ...
- Eclipse 将projectBuild Path中引用的jar包自己主动复制到WEB-INF下的lib目录下
在用用 Eclipse进行Java Web开发时,web应用中引用的jar须要复制到WEB-INF下的lib目录下,否则常常出现ClassNotFound异常. 通过以下方法,能够不用手动拷贝jar包 ...
- hdu 1240 Asteroids! (三维bfs)
Asteroids! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- CentOS 6.5 升级内核 kernel
本文适用于CentOS 6.5, CentOS 6.6,亲测可行,估计也适用于其他Linux发行版. 1. 准备工作 1.1 下载源码包 Linux内核版本有两种:稳定版和开发版 ,Linux内核版本 ...
- IPMITOOL常用操作指令
一.开关机,重启 1. 查看开关机状态: ipmitool -H (BMC的管理IP地址) -I lanplus -U (BMC登录用户名) -P (BMC 登录用户名的密码) power statu ...
- Samba-ADS/WINBIND
Samba Security = ADShttp://www.justlinux.com/forum/showt...hreadid=118288 Winbindhttp://www.justlinu ...