题目描述

fqk 退役后开始补习文化课啦,于是他打开了数学必修一开始复习函数,他回想起了一次函数都是 f(x)=kx+b的形式,现在他给了你n个一次函数 fi(x)=kix+b,然后将给你m个操作,操作将以如下格式给出:
    1.M i k b,把第i个函数改为 fi(x)=kx+b。
    2.Q l r x,询问 fr(fr−1(…fl(x))) mod 1000000007的值。

输入

第一行两个整数n,m,代表一次函数的数量和操作的数量。
接下来n行,每行两个整数,表示 ki,bi。
接下来m行,每行的格式为 M i k b 或 Q l r x。

输出

对于每个操作Q,输出一行表示答案。

样例输入

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 一次函数 (线段树)的更多相关文章

  1. 线段树 by yyb

    线段树 by yyb Type1 维护特殊信息 1.[洛谷1438]无聊的数列 维护一个数列,两种操作 1.给一段区间加上一个等差数列 2.单点询问值 维护等差数列 不难发现,等差数列可以写成\(ad ...

  2. LYOI 2016 Summer 函数 【线段树】

    <题目链接> 题目大意: fqk 退役后开始补习文化课啦,于是他打开了数学必修一开始复习函数,他回想起了一次函数都是 f(x)=kx+b的形式,现在他给了你n个一次函数 fi(x)=kix ...

  3. BZOJ.4515.[SDOI2016]游戏(树链剖分 李超线段树)

    BZOJ 洛谷 每次在路径上加的数是个一次函数,容易看出是树剖+李超线段树维护函数最小值.所以其实依旧是模板题. 横坐标自然是取个确定的距离标准.取每个点到根节点的距离\(dis[i]\)作为\(i\ ...

  4. 有趣的线段树模板合集(线段树,最短/长路,单调栈,线段树合并,线段树分裂,树上差分,Tarjan-LCA,势能线段树,李超线段树)

    线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来, ...

  5. 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 ...

  6. 【xsy3423】党² 线段树+李超线段树or动态半平面交

    本来并不打算出原创题的,此题集CF542A和sk的灵感而成,算个半原创吧. 题目大意: 给定有$n$个元素的集合$P$,其中第$i$个元素中包含$L_i,R_i,V_i$三个值. 给定另一个有$n$个 ...

  7. BZOJ5291 BJOI2018链上二次求和(线段树)

    用线段树对每种长度的区间维护权值和. 考虑区间[l,r]+1对长度为k的区间的贡献,显然其为Σk-max(0,k-i)-max(0,k-(n-i+1)) (i=l~r). 大力展开讨论.首先变成Σk- ...

  8. HDU1166 敌兵布阵_线段树

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. 洛谷P4069 [SDOI2016]游戏(李超线段树)

    题面 传送门 题解 如果我们把路径拆成两段,那么这个路径加可以看成是一个一次函数 具体来说,设\(dis_u\)表示节点\(u\)到根节点的距离,那么\((x,lca)\)这条路径上每个节点的权值就会 ...

随机推荐

  1. EZOJ #393加倍的飞机

    分析 从大到小考虑每个点 记录一个连通块中选了选了几个 如果选的小于siz则直接选否则不选 代码 #include<bits/stdc++.h> using namespace std; ...

  2. Vue作用域插槽:基本用法

    一 项目结构 二 App组件 <template> <div id="app"> <!-- 子组件 --> <user v-slot:de ...

  3. 网络流强化-POJ2516

    k种货物分开求解最小费用最大流,主要减少了寻找最短路的时间. #include<queue> #include<cstdio> #include<cstring> ...

  4. SQL计算两个时间段相隔时间

    SQL语句: select cast(floor(datediff(minute,时间1,时间2) / 1440) as varchar)+'天'+ cast(floor((datediff(minu ...

  5. String.prototype.includes

    if (!String.prototype.includes) {   String.prototype.includes = function(search, start) {     'use s ...

  6. kmp(多次可重叠匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=1686 Oulipo Problem Description The French author Georges ...

  7. 1.openshift搭建

    第1章 主机规划和所需文件 1.1 主机规划 IP地址 域名 用途 11.11.233.125 master01.song.test.cnpc 容器编排.etcd 11.11.233.126 mast ...

  8. Linux Interactive Exploit Development with GDB and PEDA

    Exploit Development Process● Occupy EIP● Find the offset(s)● Determine the attack vector● Build the ...

  9. shuoj 1 + 2 = 3? (二分+数位dp)

    题目传送门 1 + 2 = 3? 发布时间: 2018年4月15日 22:46   最后更新: 2018年4月15日 23:25   时间限制: 1000ms   内存限制: 128M 描述 埃森哲是 ...

  10. Source Insight symbol not found

    使用SourceInsight查看源代码时,发现点击查看相关类型时,无法关联到其代码,出现 symbol not found, 然而明明在我的头文件有定义的 网上查了一下主要是因为新建工程导入文件后, ...