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 ...
随机推荐
- swift 学习- 25 -- 协议 02
// 通过扩展添加协议一致性 // 即便无法修改源代码, 依然可以通过扩展 令已有类型遵循并符合协议, 扩展可以为已有类型添加属性, 方法, 下标 以及构造器, 因此可以符合协议中的相应要求 // 注 ...
- SSM框架应用
一.更新用户密码功能的实现 1. 新建页面 profile.jsp,添加三个输入框和提交按钮:用户输入当前密码.输入新密码.再次确认密码和重置按钮.修改密码按钮: 2. 前台 js(JavaScrip ...
- Confluence 6 白名单表达式类型
表达式类型 当添加一个 URL 到白名单列表中的时候,你可以选择采取下面的表达式进行添加. 域名名称(Domain name) 允许 URL 为一个指定的域名. http://www.example. ...
- 【shell】两种字符串提取场景的实现
shell虽然比batch顺眼点儿,但还是老话,入门容易,精通难. 1.场景一是这样的,现有字符串的内容 name: tiger; age:18; location:china; 需求:提取每个属性的 ...
- LeetCode(83): 删除排序链表中的重复元素
Easy! 题目描述: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1-&g ...
- hdu5758 思维,树形dp
/*可以推测从叶子结点传送到叶子节点才能使传送次数最少,如果是偶数个叶子结点,那么传送leaf/2次就是答案,如果是奇数个叶子结点,则还有单独一条链需要覆盖dp[u]表示覆盖完u为根的子树需要走的边数 ...
- 2017-2018-2 20165314实验二《Java面向对象程序设计》实验报告
实验报告封面 实验一 实验要求 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习提交最后三个JUnit测试用例 ...
- 20165314 2016-2017- 3《Java程序设计》第2周学习总结
20165314 2016-2017- 3<Java程序设计>第2周学习总结 教材学习内容总结 byte<short<char<int<long<float& ...
- Python使用正则表达式分割字符串
re.split(pattern, string, [maxsplit], [flags]) pattern:表示模式字符串,由要匹配的正则表达式转换而来. string:表示要匹配的字符串. max ...
- Python中pass的用法、作用
pass主要作用就是占位,让代码整体完整.如果定义一个函数里面为空或一个判断写好了之后还没想好满足条件需要执行执行什么逻辑,又想留着后面使用,但是函数和判断里面为空,那么就会报错,当你还没想清楚函数内 ...