题目描述

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. Vi 常用命令列表

    基本上vi可以分为三种状态,分别是命令模式(command mode).输入模式(Insert mode)和末行模式(last line mode),各模式的功能区分如下: 1) 命令模式(comma ...

  2. 使用母版页的Web窗体不走Page_Load

    原因:母版页--->属性--->生成--->输出路径,这里我将它的默认/bin路径更改了,所以才导致使用此母版页的其它页面也不走Page_Load方法 解决:改回默认的输出路径

  3. Show Me the Code

    最近在练习写Python代码,拥有150多道程序员面试题的LeetCode注重算法的实现,锻炼思维,还能在线测试代码的正确性,而Python练习册涉及到了Python实际的应用,锻炼解决问题的能力,托 ...

  4. Survey Results for Rebecca Murpheys Learning JavaScript Survey

    时间 2016-01-27 05:40:46  Raymond Camden's Blog 原文  http://www.raymondcamden.com/2016/01/25/survey-res ...

  5. an安装jenkins时遇到ERROR: No Java executable found in current PATH: /bin:/usr/bin:/sbin:/usr/sbin的问题

    # sudo /etc/init.d/jenkins restartERROR: No Java executable found in current PATH: /bin:/usr/bin:/sb ...

  6. Notepad++添加插件Funtion List 支持PHP

    插件下载地址:functionlist插件 配置方法:关闭notepad++; functionlist.dll拷贝到 安装目录/plugins目录下; 下载php.bmp 地址:https://gi ...

  7. [原]Threads vs Processes in Linux 分析

    Linux中thread (light-weighted process) 跟process在實作上幾乎一樣. 最大的差異來自於,thread 會分享 virtual memory address s ...

  8. hdu6354 Everything Has Changed (圆的相交弧长)

    题目传送门 题意: 用一堆圆来切割一个圆心为原点,半径为R的圆A,问切割完毕后圆A外围剩余部分的周长(图中的红线部分). 思路: 首先判定圆与圆A的关系,这题我们只需要与A内切.相交的圆. 然后就是求 ...

  9. CSV的规范与使用

    CSV可以通过Excel打开,数据格式比较小,通过记事本打开一个CSV文件, 便知道在csv里面,每一个单元格的数据都是通过逗号来分割的.所以在csv里面切记:单元格数据不要出现逗号 格式: 第一行: ...

  10. BZOJ1672 Cleaning Shifts 清理牛棚

    传送门 显然可以考虑 $dp$ 设 $f[i]$ 表示当前到了时间 $i$,从初始到 $i$ 的时间都安排好打扫了 把所有牛按照区间 $l,r$ 双关键字排序 这样枚举到一头牛 $x$ 时,在 $x. ...