hihoCoder 1116 计算(线段树)
http://hihocoder.com/problemset/problem/1116
题意:
思路:
用线段树解决,每个节点需要设置4个变量,sum记录答案,all记录整个区间的乘积,pre记录该区间内所有前缀的和,suf记录该区间内所有后缀的和。
举个例子,比如现在要合并{a,b,c,d}和{x,y,z,w}这两个区间,那么新增的答案有哪些呢?
有abcdx(省去乘号),abcdxy,abcdxyz,abcdxyzw,bcdxyzw,cdxyzw,dxyzw。这些就是{a,b,c,d}的所有后缀×{x,y,z,w}所有前缀。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = +;
const int mod = ;
typedef long long ll; int n,q; struct node
{
int l,r;
ll sum, pre, suf, all;
}t[maxn<<]; void PushUp(int o)
{
t[o].all=(t[o<<].all*t[o<<|].all)%mod;
t[o].sum=((t[o<<].sum+t[o<<|].sum)%mod+(t[o<<].suf*t[o<<|].pre)%mod)%mod;
t[o].pre=(t[o<<].pre+(t[o<<].all*t[o<<|].pre)%mod)%mod;
t[o].suf=(t[o<<|].suf+(t[o<<|].all*t[o<<].suf)%mod)%mod;
} void build(int l, int r, int o)
{
t[o].l = l;
t[o].r = r;
t[o].sum = t[o].pre = t[o].suf = t[o].all = ;
if(l==r) return;
int mid = (l+r)>>;
build(l,mid,o<<);
build(mid+,r,o<<|);
PushUp(o);
} void update(int l, int r, int x, int v, int o)
{
if(t[o].l == x && t[o].l==t[o].r)
{
t[o].sum = t[o].pre = t[o].suf = t[o].all = v;
return;
}
int mid = (l+r)>>;
if(x<=mid) update(l,mid,x,v,o<<);
else update(mid+,r,x,v,o<<|);
PushUp(o);
} int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&q);
build(,n,);
while(q--)
{
ll x,y;
scanf("%lld%lld",&x,&y);
update(,n,x,y%mod,);
printf("%lld\n",t[].sum);
}
return ;
}
hihoCoder 1116 计算(线段树)的更多相关文章
- hihoCoder 1116 计算 (线段树)
题意 : 描述 现在有一个有n个元素的数组a1, a2, ..., an. 记f(i, j) = ai * ai+1 * ... * aj. 初始时,a1 = a2 = ... = an = 0,每次 ...
- 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将问题 ...
随机推荐
- Linux基础命令---arping
arping arping指令用于发送arp请求到一个相邻的主机,在指定网卡上发送arp请求指定地址,源地址使用-s指定.该指令可以直径ping MAC地址,找出哪些地址被哪些电脑使用了. 此命令的适 ...
- sql之left join、right join、inner join的区别,连接自己时的查询结果测试
sql之left join.right join.inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括 ...
- 随笔 js-----------------------------------------------------------------------------------------------------
http://www.cnblogs.com/liuling/p/2014-4-19-04.html redis Base64.encode($( "#byerName").v ...
- GUI颜色、字体设置对话框
%颜色设置对话框 uisetcolor %c 红色 c=uisetcolor %默认规定颜色 c=uisetcolor([ ]); %设置曲线颜色 h = plot([:]); c = uisetco ...
- bzoj4358 premu
题目链接 莫队算法 没有用线段树,而是看了showson的并查集%%% #include<algorithm> #include<iostream> #include<c ...
- Linux系统管理和维护常用命令
Linux系统管理和维护常用命令 ls 命令 功能说明 ls 命令显示指定工作目录下的内容,列出工作目录所包含的文件及子目录. 语法结构: ls [选项] [路径或文件] ls 选项及说明 -a 显示 ...
- mysql日志种类、二进制日志模式、mysqlbinlog解析二进制日志
mysql日志的种类 二进制日志(binary log):记录数据更新的操作,mysqlbinlog 可查看二进制日志文件 错误日志(error log):记录mysql服务进程mysqld的启动.关 ...
- MVC HTML页面使用
解决HTML <system.webServer> <validation validateIntegratedModeConfiguration="false" ...
- Linux下Keepalived安装与配置
一.简介 负载平衡是一种在真实服务器集群中分配IP流量的方法,可提供一个或多个高度可用的虚拟服务.在设计负载均衡拓扑时,重要的是要考虑负载均衡器本身的可用性以及它背后的真实服务器.用C编写的类似于la ...
- python之路-day1-while循环
while Thue: (条件为真无限循环) break(跳出循环) 猜年龄: #Author:zwwage_of_jay = 40count = 0while count < 3: gues ...