LYOI2016 Summer 一次函数 (线段树)
题目描述
1.M i k b,把第i个函数改为 fi(x)=kx+b。
2.Q l r x,询问 fr(fr−1(…fl(x))) mod 1000000007的值。
输入
接下来n行,每行两个整数,表示 ki,bi。
接下来m行,每行的格式为 M i k b 或 Q l r x。
输出
样例输入
5 5
4 2
3 6
5 7
2 6
7 5
Q 1 5 1
Q 3 3 2
M 3 10 6
Q 1 4 3
Q 3 4 4
样例输出
1825
17
978
98 n,m≤200000,k,b,x<1000000007。
一看这个题的样子就是线段树,我们观察一次函数性质则有
剩下的线段树的区间合并一下它的左右儿子就好了
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const ll mod = 1e9+;
const int maxn = ;
int kk[maxn],bb[maxn];
int n,m;
char op[];
struct node
{
int l,r;
ll k,b;
}tree[maxn<<];
node Union (node x,node y)
{
node tmp;
tmp.l=x.l,tmp.r=y.r;
tmp.k=(x.k*y.k)%mod;
tmp.b=((y.k*x.b)%mod+y.b)%mod;
return tmp;
}
void pushup(int now)
{
tree[now] = Union(tree[now<<],tree[now<<|]);
}
void build (int now,int L,int R)
{
if (L==R){
tree[now].l=L,tree[now].r=L;
tree[now].k=kk[L];tree[now].b=bb[L];
return ;
}
int mid = (L+R)>>;
build(now<<,L,mid);
build(now<<|,mid+,R);
pushup(now);
}
void update (int now,int pos,int kkk,int bbb)
{
if (tree[now].l==tree[now].r){
tree[now].k=kkk,tree[now].b=bbb;
return;
}
int mid = (tree[now].l+tree[now].r)/;
if (pos<=mid)
update(now<<,pos,kkk,bbb);
else
update(now<<|,pos,kkk,bbb);
pushup(now);
}
node query (int now,int L,int R)
{
if (tree[now].l==L&&tree[now].r==R)
return tree[now];
int mid = (tree[now].l+tree[now].r)/;
if (R<=mid)
return query(now<<,L,R);
else if (L>mid)
return query(now<<|,L,R);
else
return Union(query(now<<,L,mid),query(now<<|,mid+,R));
}
int main()
{
//freopen("de.txt","r",stdin);
scanf("%d%d",&n,&m);
for (int i=;i<=n;++i)
scanf("%d%d",&kk[i],&bb[i]);
build(,,n);
for (int i=;i<m;++i){
scanf("%s",op);
if (op[]=='M'){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
update(,x,y,z);
}
else{
int lll,rrr,xx;
scanf("%d%d%d",&lll,&rrr,&xx);
node anss=query(,lll,rrr);
ll ans = ((anss.k*xx)%mod+anss.b)%mod;
printf("%lld\n",ans);
}
}
return ;
}
LYOI2016 Summer 一次函数 (线段树)的更多相关文章
- 线段树 by yyb
线段树 by yyb Type1 维护特殊信息 1.[洛谷1438]无聊的数列 维护一个数列,两种操作 1.给一段区间加上一个等差数列 2.单点询问值 维护等差数列 不难发现,等差数列可以写成\(ad ...
- LYOI 2016 Summer 函数 【线段树】
<题目链接> 题目大意: fqk 退役后开始补习文化课啦,于是他打开了数学必修一开始复习函数,他回想起了一次函数都是 f(x)=kx+b的形式,现在他给了你n个一次函数 fi(x)=kix ...
- BZOJ.4515.[SDOI2016]游戏(树链剖分 李超线段树)
BZOJ 洛谷 每次在路径上加的数是个一次函数,容易看出是树剖+李超线段树维护函数最小值.所以其实依旧是模板题. 横坐标自然是取个确定的距离标准.取每个点到根节点的距离\(dis[i]\)作为\(i\ ...
- 有趣的线段树模板合集(线段树,最短/长路,单调栈,线段树合并,线段树分裂,树上差分,Tarjan-LCA,势能线段树,李超线段树)
线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来, ...
- Code Chef JUMP(递推+树状数组+李超线段树)
\(JUMP\) 很容易写出转移柿子 \[f_i=\min_{p_j<p_i}\{(h_i-h_j)^2+f_j\}+w_i\] 把\(\min\)里面的东西展开一下 \[f_j=\min_{p ...
- 【xsy3423】党² 线段树+李超线段树or动态半平面交
本来并不打算出原创题的,此题集CF542A和sk的灵感而成,算个半原创吧. 题目大意: 给定有$n$个元素的集合$P$,其中第$i$个元素中包含$L_i,R_i,V_i$三个值. 给定另一个有$n$个 ...
- BZOJ5291 BJOI2018链上二次求和(线段树)
用线段树对每种长度的区间维护权值和. 考虑区间[l,r]+1对长度为k的区间的贡献,显然其为Σk-max(0,k-i)-max(0,k-(n-i+1)) (i=l~r). 大力展开讨论.首先变成Σk- ...
- HDU1166 敌兵布阵_线段树
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 洛谷P4069 [SDOI2016]游戏(李超线段树)
题面 传送门 题解 如果我们把路径拆成两段,那么这个路径加可以看成是一个一次函数 具体来说,设\(dis_u\)表示节点\(u\)到根节点的距离,那么\((x,lca)\)这条路径上每个节点的权值就会 ...
随机推荐
- SqL语句基础之增删改查
增查删改的SQL语句,如此的实用,下面我就来简单介绍一下它简单的用法. 1.什么是SQL? SQL是用于访问和处理数据库的标准的一种计算机语言. 2.SQL可以做什么? (1)可以向数据库进行查询 ...
- 2019/10/26 TZOJ
1001 Flooded Island http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=452 ...
- 深入探讨vue响应式原理
现在是时候深入一下了!Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 JavaScript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简单直接,不过理解其工作 ...
- 微信小程序列表时间戳转换
第一步先写js 随便命名为times.js function toDate(number){ var n=number * 1000; var date = new Date(n) ...
- Hibernate入门1
Hibernate概述: 1. 什么是框架: 写程序,在使用框架之后,帮我们实现一部分的功能,使用框架的好处可以少写一部分代码实现功能 2. 什么是hibernate框架: hibernate框架应用 ...
- Maven安装、配置环境变量
一.首先在官网下载安装maven 1.进入官网 2.找到下载位置 3.点进去后是最新版的,若需要最新版就下这个,需要旧版本接着往下滑 4.下载历史版本 (1)点击"archives" ...
- python学习第三十二天函数的闭包
python函数中嵌套另外一个函数,另外一个函数形成一个封闭的环境,里面的那个函数叫做函数的闭包,函数的闭包好处可以保护函数里面的变量,下面讲述函数闭包的实例和用法 1,函数闭包的实例 a='cat' ...
- qt 如何注册自定义类型?
如何声明自定义类型 如果仅仅在 QVariant 中使用,则仅需要使用 Q_DECLARE_METATYPE 宏进行声明即可. class Custom_ : public QObject { Q_O ...
- CodeForces 711D Directed Roads (DFS找环+组合数)
<题目链接> 题目大意: 给定一个$n$条边,$n$个点的图,每个点只有一条出边(初始状态),现在能够任意对图上的边进行翻转,问你能够使得该有向图不出先环的方案数有多少种. 解题分析: 很 ...
- windows不重装系统和重建MBR分区表来扩展系统盘
step1. 下载Acronis Disk Director Suite工具,随便一搜都能下载的到. step2. 这个软件使用非常easy,网上有非常多图文教程.扩充盘使用Increase the ...