LYOI 2016 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 <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 函数 【线段树】的更多相关文章
- LightOJ 1370 Bi-shoe and Phi-shoe 欧拉函数+线段树
分析:对于每个数,找到欧拉函数值大于它的,且标号最小的,预处理欧拉函数,然后按值建线段树就可以了 #include <iostream> #include <stdio.h> ...
- loj1370(欧拉函数+线段树)
传送门:Bi-shoe and Phi-shoe 题意:给出多个n(1<=n<=1e6),求满足phi(x)>=n的最小的x之和. 分析:先预处理出1~1e6的欧拉函数,然后建立一颗 ...
- [BZOJ4026]dC Loves Number Theory 欧拉函数+线段树
链接 题意:给定长度为 \(n\) 的序列 A,每次求区间 \([l,r]\) 的乘积的欧拉函数 题解 考虑离线怎么搞,将询问按右端点排序,然后按顺序扫这个序列 对于每个 \(A_i\) ,枚举它的质 ...
- LOJ #2142. 「SHOI2017」相逢是问候(欧拉函数 + 线段树)
题意 给出一个长度为 \(n\) 的序列 \(\{a_i\}\) 以及一个数 \(p\) ,现在有 \(m\) 次操作,每次操作将 \([l, r]\) 区间内的 \(a_i\) 变成 \(c^{a_ ...
- bzoj4869: [Shoi2017]相逢是问候(欧拉函数+线段树)
这题是六省联考的...据说数据还出了点锅,心疼六省选手QAQ 首先要知道扩展欧拉定理... 可以发现每次区间操作都会使模数进行一次phi操作,而一个数最多取logp次phi就会变成1,这时后面的指数就 ...
- [LNOI] 相逢是问候 || 扩展欧拉函数+线段树
原题为2017六省联考的D1T3 给出一个序列,m次操作,模数p和参数c 操作分为两种: 1.将[l,r]区间内的每个数x变为\(c^x\) 2.求[l,r]区间内数的和%p 首先,我们要了解一些数论 ...
- 【博弈论】【SG函数】【线段树】Petrozavodsk Summer Training Camp 2016 Day 9: AtCoder Japanese Problems Selection, Thursday, September 1, 2016 Problem H. Cups and Beans
一开始有n个杯子,每个杯子里有一些豆子,两个人轮流操作,每次只能将一个豆子移动到其所在杯子之前的某个杯子里,不过可以移动到的范围只有一段区间.问你是否先手必胜. 一个杯子里的豆子全都等价的,因为sg函 ...
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 177 Solved: 128[Submit][Status ...
随机推荐
- Confluence 6 XML 备份失败的问题解决
XML 站点备份仅仅被用于整合到一个新的数据库.设置一个测试服务器 或者 创建一个可用的备份策略 相对 XML 备份来说是更合适的策略. 相关页面: Enabling detailed SQL log ...
- 【git】提交代码到远程仓库
看完不用,就是一个字:忘! 之前学了两天git结果今天要用的时候,啥也想不起来.... 场景: 已有远程仓库: git@192.168.1.1:test/test.git 要提交代码到远程仓库的新分支 ...
- django----多对多数据添加
class UserInfo(models.Model): """ 用户表:既有班主任也有老师 """ username = models. ...
- python 把类当作 装饰器
# class Test(object): # def __call__(self): # print('-----test----') # t= Test()# t() 调用主要有个__call__ ...
- Dom,查找标签和操作标签
Dom,查找标签和操作标签 文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式 ...
- 基于容器的ETCD集群脚本
其实是从上一篇的脚本里剥离出来的. 加深一下印象吧. docker run \ -d \ -p ${ETCD_CLI_PORT}:${ETCD_CLI_PORT} \ -p ${ETCD_CLU_PO ...
- Oozie如何和安装部署
1.Oozie的简单介绍: .Oozie是一个工作流引擎服务器,用于运行hadoop map/reduce和hive等任务工作流,同时Oozie还是一个Java web程序,运行在Java Servl ...
- org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /eclipse20171118
1:如果有一天,你有幸看到了这个错误,也许你像我一样low,因为此时,你已经准备开发Zookeeper程序了,却还没有把Zookeeper的服务启动起来. org.apache.zookeeper.K ...
- [转]EndNote导入IEEE文献的方法
EndNote导入IEEE文献的方法.IEEE虽然可以批量导出,但是批量导出的是CSV格式.如果想导入到EndNote,需要一个个文献的导入.本文介绍一下IEEE导出文献并导入到EndNote的方法. ...
- 使用spark集成kudu做DDL
spark对kudu表的创建 定义kudu的表需要分成5个步骤: 1:提供表名 2:提供schema 3:提供主键 4:定义重要选项:例如:定义分区的schema 5:调用create Table a ...