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)\)这条路径上每个节点的权值就会 ...
随机推荐
- EZOJ #393加倍的飞机
分析 从大到小考虑每个点 记录一个连通块中选了选了几个 如果选的小于siz则直接选否则不选 代码 #include<bits/stdc++.h> using namespace std; ...
- Vue作用域插槽:基本用法
一 项目结构 二 App组件 <template> <div id="app"> <!-- 子组件 --> <user v-slot:de ...
- 网络流强化-POJ2516
k种货物分开求解最小费用最大流,主要减少了寻找最短路的时间. #include<queue> #include<cstdio> #include<cstring> ...
- SQL计算两个时间段相隔时间
SQL语句: select cast(floor(datediff(minute,时间1,时间2) / 1440) as varchar)+'天'+ cast(floor((datediff(minu ...
- String.prototype.includes
if (!String.prototype.includes) { String.prototype.includes = function(search, start) { 'use s ...
- kmp(多次可重叠匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=1686 Oulipo Problem Description The French author Georges ...
- 1.openshift搭建
第1章 主机规划和所需文件 1.1 主机规划 IP地址 域名 用途 11.11.233.125 master01.song.test.cnpc 容器编排.etcd 11.11.233.126 mast ...
- Linux Interactive Exploit Development with GDB and PEDA
Exploit Development Process● Occupy EIP● Find the offset(s)● Determine the attack vector● Build the ...
- shuoj 1 + 2 = 3? (二分+数位dp)
题目传送门 1 + 2 = 3? 发布时间: 2018年4月15日 22:46 最后更新: 2018年4月15日 23:25 时间限制: 1000ms 内存限制: 128M 描述 埃森哲是 ...
- Source Insight symbol not found
使用SourceInsight查看源代码时,发现点击查看相关类型时,无法关联到其代码,出现 symbol not found, 然而明明在我的头文件有定义的 网上查了一下主要是因为新建工程导入文件后, ...