<题目链接>

题目大意:

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. bat如何实现自动创建文件夹(以当前时间命名)

    先比较直接的查看当前的日期和时间:(或者cmd中直接输入date,time查看) @echo off color 0a set dt=%date%%time% echo %dt% pause 1.使用 ...

  2. Spark Streaming 实现思路与模块概述

    一.基于 Spark 做 Spark Streaming 的思路 Spark Streaming 与 Spark Core 的关系可以用下面的经典部件图来表述: 在本节,我们先探讨一下基于 Spark ...

  3. TabLayout和ViewPager

    这里就说下tablayout+viewpager的实现方式:tablayout是android5.0推出来的一个MaterialDesign风格的控件,是专门用来实现tab栏效果的:功能强大,使用方便 ...

  4. laravel 更新

    public function update(Request $request, ResponseFactoryContract $response) { $user = $request->u ...

  5. web.xml中的ContextLoaderListener和DispatcherServlet区别

    ContextLoaderListener和DispatcherServlet都会在Web容器启动的时候加载一下bean配置. 区别在于: DispatcherServlet一般会加载MVC相关的be ...

  6. postMan测试https接口

    一.如何安装postman? Postman下载地址https://www.getpostman.com/ 我下载的版本是Postman-win64-5.0.0-Setup.exe 这是免安装的,可以 ...

  7. 饮冰三年-人工智能-Python-17Python基础之模块与包

    一.模块(modue) 简单理解一个.py文件就称之为一个模块. 1.1 模块种类: python标准库 第三方模板 应用程序自定义模块(尽量不要与内置函数重名) 1.2 模块导入方法 # impor ...

  8. 调整Windows操作系统下时间同步的频率

    今天发现时间不对,同步时间后看到Windows系统默认是一周才同步一次时间,频率太低了.查找了一下资料,找到了两种调整Win7时间同步频率的方法. 方法一:注册表法 这种方法是通过修改注册表中的键值来 ...

  9. MySQL 官方 Docker 镜像的使用

    首先是pull image,这里我拉取的是5.6.35: $ sudo docker pull mysql:5.6.35 拉下来以后大可以按照官方的说明无脑启动,但是外部无法访问,所以绑定端口: $ ...

  10. A - Exposition CodeForces - 6E

    题目链接:https://vjudge.net/contest/202699#problem/A 题意 给一个n个元素的序列,从中挑出最长的子序列,要求子序列中元素差的最大值不超过k.问有几个最长子序 ...