<题目链接>

题目大意:

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 <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std; #define Lson rt<<1,l,mid
#define Rson rt<<1|1,mid+1,r
typedef long long ll;
const ll mod = 1e9+;
const int M = 2e5+;
int cur1[M],cur2[M];
int n,m;
struct node{
ll k,b;
}tr[M<<];
node cal(node x,node y){ //将Fy(Fx)的嵌套关系合并,其实就是将里面的一元一次函数乘出来
node tmp;
tmp.k=(x.k*y.k)%mod;
tmp.b=((y.k*x.b)%mod+y.b)%mod;
return tmp;
}
void Pushup(int rt){ //根据函数嵌套关系维护函数嵌套值,相当于该区间对应函数的嵌套值看成普通线段树的区间和(这个思路非常妙)
tr[rt] = cal(tr[rt<<],tr[rt<<|]);
}
void build(int rt,int l,int r){
if (l==r){
tr[rt].k=cur1[l],tr[rt].b=cur2[l];
return;
}
int mid = (l+r)>>;
build(Lson);
build(Rson);
Pushup(rt);
}
void update(int rt,int l,int r,int loc,int tmp1,int tmp2)
{
if (l==r){
tr[rt].k=tmp1,tr[rt].b=tmp2; //单点更新该函数的系数
return;
}
int mid = (l+r)>>;
if (loc<=mid) update(Lson,loc,tmp1,tmp2);
else update(Rson,loc,tmp1,tmp2);
Pushup(rt);
}
node query (int rt,int l,int r,int L,int R)
{
if (l==L&&r==R)return tr[rt];
int mid = (l+r)>>;
if (R<=mid)return query(Lson,L,R);
else if (L>mid)return query(Rson,L,R);
else return cal(query(Lson,L,mid),query(Rson,mid+,R));
}
/*node query(int rt,int l,int r,int L,int R){ //为什么我这样查询区间函数嵌套和不行???
if(l<=l&&r<=R)return tr[rt];
int mid=(l+r)>>1;
node tmp;
tmp.k=1,tmp.b=0;
if(L<=mid)tmp=cal(query(Lson,L,R),tmp);
if(R>mid)tmp=cal(query(Rson,L,R),tmp);
return tmp;
}*/
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;++i)
scanf("%d%d",&cur1[i],&cur2[i]);
build(,,n);
char op[];
while(m--){
scanf("%s",op);
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
if (op[]=='M'){
update(,,n,x,y,c);
}
else{
node tmp=query(,,n,x,y);
ll ans = ((tmp.k*c)%mod+tmp.b)%mod;
printf("%lld\n",ans);
}
}
return ;
}

2018-10-13

LYOI 2016 Summer 函数 【线段树】的更多相关文章

  1. LightOJ 1370 Bi-shoe and Phi-shoe 欧拉函数+线段树

    分析:对于每个数,找到欧拉函数值大于它的,且标号最小的,预处理欧拉函数,然后按值建线段树就可以了 #include <iostream> #include <stdio.h> ...

  2. loj1370(欧拉函数+线段树)

    传送门:Bi-shoe and Phi-shoe 题意:给出多个n(1<=n<=1e6),求满足phi(x)>=n的最小的x之和. 分析:先预处理出1~1e6的欧拉函数,然后建立一颗 ...

  3. [BZOJ4026]dC Loves Number Theory 欧拉函数+线段树

    链接 题意:给定长度为 \(n\) 的序列 A,每次求区间 \([l,r]\) 的乘积的欧拉函数 题解 考虑离线怎么搞,将询问按右端点排序,然后按顺序扫这个序列 对于每个 \(A_i\) ,枚举它的质 ...

  4. LOJ #2142. 「SHOI2017」相逢是问候(欧拉函数 + 线段树)

    题意 给出一个长度为 \(n\) 的序列 \(\{a_i\}\) 以及一个数 \(p\) ,现在有 \(m\) 次操作,每次操作将 \([l, r]\) 区间内的 \(a_i\) 变成 \(c^{a_ ...

  5. bzoj4869: [Shoi2017]相逢是问候(欧拉函数+线段树)

    这题是六省联考的...据说数据还出了点锅,心疼六省选手QAQ 首先要知道扩展欧拉定理... 可以发现每次区间操作都会使模数进行一次phi操作,而一个数最多取logp次phi就会变成1,这时后面的指数就 ...

  6. [LNOI] 相逢是问候 || 扩展欧拉函数+线段树

    原题为2017六省联考的D1T3 给出一个序列,m次操作,模数p和参数c 操作分为两种: 1.将[l,r]区间内的每个数x变为\(c^x\) 2.求[l,r]区间内数的和%p 首先,我们要了解一些数论 ...

  7. 【博弈论】【SG函数】【线段树】Petrozavodsk Summer Training Camp 2016 Day 9: AtCoder Japanese Problems Selection, Thursday, September 1, 2016 Problem H. Cups and Beans

    一开始有n个杯子,每个杯子里有一些豆子,两个人轮流操作,每次只能将一个豆子移动到其所在杯子之前的某个杯子里,不过可以移动到的范围只有一段区间.问你是否先手必胜. 一个杯子里的豆子全都等价的,因为sg函 ...

  8. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  9. Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 128[Submit][Status ...

随机推荐

  1. Confluence 6 匿名访问远程 API

    Confluence 管理员可能希望为匿名用户禁用远程访问 API.这样能够避免恶意软件随意在网站进行批量修改. 希望禁用远程访问 API: 在屏幕的右上角单击 控制台按钮 ,然后选择 General ...

  2. Confluence 6 的系统配置信息的示例

    awt.toolkit sun.awt.X11.XToolkit file.encoding.pkg sun.io java.specification.version 1.8 sun.cpu.isa ...

  3. 【mongo】可以用localhost启动,无法用ip启动问题的解决

    问题: mongo安装在a.b.c.d机器上,启动mongo服务后, mongo localhost:27017可以进入数据库, mongo 127.0.0.1:27017也可以进入数据库 mongo ...

  4. Java和C冒泡排序

    Java 示例代码: public class test { public static void main(String[] args) { String str = "321dca5&q ...

  5. Allegro PCB Design GXL (legacy) 使用slide推挤走线,走线的宽度就发生改变的原因

    Allegro PCB Design GXL (legacy) version 16.6-2015 使用slide推挤走线,走线的宽度就会发生改变. 后来发现是因为约束管理器(Constraint M ...

  6. Java 单字节、多字节读取文本文档中的内容

    文本文档位于工程下. 鼠标右击工程,选择“new - File”,即可创建. 文本文档的格式:GBK 单字节读取 import java.io.File; import java.io.FileInp ...

  7. python 内置数据类型之数字

    目录: 1.2. 数字 1.2.1. 数字类型 1.2.2. 浮点数 1.2.3. 进制记数 1.2.4. 设置小数精度 1.2.5. 分数 1.2.6. 除法 1.2 数字   1.2.1 数字类型 ...

  8. springboot+mybatis+springMVC基础框架搭建

    项目结构概览 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http: ...

  9. BZOJ 2818 Gcd(欧拉函数+质数筛选)

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 9108  Solved: 4066 [Submit][Status][Discu ...

  10. SQLServer索引及统计信息

    索引除了提高性能,还能维护数据库. 索引是一种存储结构,主要以B-Tree形式存储信息. B-Tree的定义: 1.每个节点最多只有m个节点(m>=2) 2.除了根节点和叶子节点外的每个节点上最 ...