Hihocoder 1116 计算
这题最开始的时候看到线段树吧,没找到好的做法
想了下既然是乘积和
(-)
(--)
(---)
在脑子里就是这种线条位于各个位置,然后各种长度代表连续的乘积个数
然后把所有情况累加起来,但是并不好算
这题每次单点修改最开始就想到肯定是算贡献
然后总和是所有连续积和
然后就想是不是能用到前缀积呢,然后发现修改a[p] ai...ap...aj 1<=i<=p && n=>j>=p
(--ap---)
(-ap--)
然后分配律化简下,就是ap的后缀积和ap右边一位的前缀积和,这就是贡献
但是我直接把先算树的节点用前缀积表示pre[p]表示到p的前缀积,然后修改a[p]的时候就是修改p到n记录之前值改为现在的,就相当于a[p]/a[p],a[p
]是以前的
但是不好处理为0的情况以前为0.就。。。后面看了别人的发现可以算总和,前后缀积也可以分区间分节点向上推倒
#include <cstdio>
#include <memory>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#include <cassert>
#include <string>
#include <ctime>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
#include <cassert>
using namespace std;
#define REP(i,n) for(int i=0;i<n;i++)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define req(i,a,b) for(int i=a;i>=b;i--)
#define rp(i,a) for(int i=head[a];i+1;i=edge[i].next)
#define cl(a,b) memset(a,b,sizeof a);
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mod 10007
const int inf = ~0u >> 2;
const ll INF = (1LL << 62) - 1;
double eps = 1e-9;
const int N = 1e6 + 5;
const int M = 21;
int ans, cnt;
vector<int>g[N];
int n, m;
int in[N];
map<string, int>mp;
string S[N];
int pre[N];
int suf[N];
int sum[N];
int mul[N];
void up(int rt) {
mul[rt] = (mul[rt << 1] * mul[rt << 1 | 1]) % mod;
pre[rt] = (pre[rt << 1] + pre[rt << 1 | 1 ] * mul[rt << 1]) % mod;
suf[rt] = (suf[rt << 1 | 1] + suf[rt << 1] * mul[rt << 1 | 1]) % mod;
sum[rt] = (sum[rt << 1] + sum[rt << 1 | 1] + suf[rt << 1] * pre[rt << 1 | 1]) % mod;
}
void build(int l, int r, int rt) {
mul[rt] = pre[rt] = suf[rt] = sum[rt] = 0;
if (l == r) {
//scanf("%d", &c[rt]);
return;
}
int m = (l + r) >> 1;
build(l, m, rt * 2);
build(m + 1, r, rt * 2 + 1);
up(rt);
}
void update(int p, int value, int l, int r, int rt) {
if (l == r) {
if (l != p)
return;
pre[rt] = value%mod+mod;
suf[rt] = value%mod+mod;
sum[rt] = value%mod+mod;
mul[rt] = value%mod+mod;
return;
}
int m = (l + r) >> 1;
if (p <= m)
update(p, value, lson);
if (m < p)
update(p, value, rson);
up(rt);
}
int main() {
while (~scanf("%d%d", &n, &m)) {
build(1, n, 1);
ans = 0;
while (m--) {
int op, l, r;
int p, val;
scanf("%d%d", &p, &val);
update(p, val, 1, n, 1);
printf("%d\n", sum[1]);
}
}
return 0;
}
Hihocoder 1116 计算的更多相关文章
- hihoCoder 1116 计算(线段树)
http://hihocoder.com/problemset/problem/1116 题意: 思路: 用线段树解决,每个节点需要设置4个变量,sum记录答案,all记录整个区间的乘积,pre记录该 ...
- hihoCoder 1116 计算 (线段树)
题意 : 描述 现在有一个有n个元素的数组a1, a2, ..., an. 记f(i, j) = ai * ai+1 * ... * aj. 初始时,a1 = a2 = ... = an = 0,每次 ...
- hihocoder#1148 : 2月29日 计算闰年的个数
计算到某年为止的闰年数,其实很简单.设要计算的年为A,则到A年为止(含A年)的闰年数为: 闰年数=INT(A/)-INT(A/)+INT(A/) 这里:INT为取整数函数 #include <c ...
- hihocoder #1068 : RMQ-ST算法 ( RMQ算法 O(nlogn)处理 O(1)查询 *【模板】 1)初始化d数组直接读入+计算k值用数学函数log2()==*节约时间 )
#1068 : RMQ-ST算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在美国旅行了相当长的一段时间之后,终于准备要回国啦!而在回国之前,他们准备 ...
- 【hihocoder#1413】Rikka with String 后缀自动机 + 差分
搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...
- 【hihoCoder】1148:2月29日
问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...
- 【hihoCoder】1288 : Font Size
题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...
- 【hihoCoder】1036 Trie图
题目:http://hihocoder.com/problemset/problem/1036 给一个词典dict,词典中包含了一些单词words.要求判断给定的一个文本串text中是否包含这个字典中 ...
- 【hihoCoder】1039 : 字符消除
题目:http://hihocoder.com/problemset/problem/1039 给定一个字符串s,只包含'A', 'B', 'C'三种字符 1. 向 s 的任意位置 (包括头和尾) 中 ...
随机推荐
- jmeter分布式踩得坑汇总
一.普通的配置文件基本都能网上搜索资料,这里就简单记录: a.jmeter.properties几处修改:1.remote_hosts=master压力机Ip;2.server_port,开启服务器端 ...
- 018_go语言中的结构体
代码演示 package main import "fmt" type person struct { name string age int } func main() { fm ...
- Python笔试——毕业旅行问题
毕业旅行问题 小明目前在做一份毕业旅行的规划.打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次.由于经费有限,希望能够通过合理的路线安排尽可能的省一些路上的 ...
- Spring IOC 剖析
模拟实现 Spring Ioc 控制反转功能 使用 => 原理 => 源码 => 模拟实现 使用:了解 原理:熟悉 源码 And 模拟实现: 精通 对照 Spring 功能点 Spr ...
- VMware Workstation pro无法在Windows上运行,检查可在Windows上运行的此应用的更新版本
我的Windows版本是win10-1903,VMware版本比较老旧是VMware-10:国庆节后微软推送了一个新的更新补丁,更新之后发现VMware无法打开(未更新前正常). 更新补丁详情如下: ...
- JDBC工具类—如何封装JDBC
“获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils.提供获取连接对象的方法,从而达到代码的重复利用. 该工具类提供方法:public static Conne ...
- 2020-07-21:简述redis主从同步的过程。
福哥答案2020-07-21: 1.从服务发送一个sync同步命令给主服务要求全量同步.2.主服务接收到从服务的sync同步命令时,会fork一个子进程后台执行bgsave命令(非阻塞)快照保存,生成 ...
- 2020-06-07:mysql中varchar类型的id,where id=1,会用到索引吗?int 类型的id,where id="1",会用到索引吗?为什么?
福哥答案2020-06-07: 答案来自群员:对于int类型id,查询的varchar 类型 ‘1’会隐式转换成 1,‘1’和 1都能正常走索引:对于varchar类型id,查询的int 类型 1不会 ...
- Web前端性能优化,应该怎么做?
摘要:本文将分享一些前端性能优化的常用手段,包括减少请求次数.减小资源大小.各种缓存.预处理和长连接机制,以及代码方面的性能优化等方面. base64:尤其是在移动端,小图标可以base64(webp ...
- 【趣味设计模式系列】之【代理模式2--JDK动态代理源码解析】
1. 图解 上图主要描述了JDK动态代理的执行过程,下面做详细分析. 2. Proxy源码分析 上一篇,在使用JDK动态代理的时候,借助于Proxy类,使用newProxyInstance静态方法,创 ...