【BZOJ4499】线性函数

Description

小C最近在学习线性函数,线性函数可以表示为:f(x) = kx + b。现在小C面前有n个线性函数fi(x)=kix+bi ,他对这n个线性函数执行m次操作,每次可以:
1.M i K B 代表把第i个线性函数改为:f i(x)=kx+b 。
2.Q l r x 返回f r(f r-1(...f l(x)))  mod  10^9+7 。

Input

第一行两个整数n, m (1 <= n, m <= 200,000)。
接下来n行,每行两个整数ki, bi。
接下来m行,每行的格式为M i K B或者Q l r x。

Output

对于每个Q操作,输出一行答案。

Sample Input

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

Sample Output

1825
17
978
98

HINT

1 <= n, m <= 200,000,0 <= k, b, x < 1000,000,007

题解:这个式子显然是可以用线段树维护的。

维护区间k的乘积sk,区间的那个式子的值sb,则合并时sb=sb1*sk2+sb2,sk=sk1*sk2。答案就是x*sk+sb。

#include <cstdio>
#include <cstring>
#include <iostream>
#define lson x<<1
#define rson x<<1|1
using namespace std;
typedef long long ll;
const ll P=1000000007;
const int maxn=200010;
int n,m;
ll B[maxn],K[maxn];
char str[5];
struct node
{ll b,k;node() {}node(ll x,ll y) {b=x,k=y;}node operator + (const node &a) const {return node((b*a.k+a.b)%P,k*a.k%P);}
}s[maxn<<2];
void build(int l,int r,int x)
{if(l==r){s[x]=node(B[l],K[l]);return ;}int mid=(l+r)>>1;build(l,mid,lson),build(mid+1,r,rson);s[x]=s[lson]+s[rson];
}
void updata(int l,int r,int x,int a)
{if(l==r){s[x]=node(B[l],K[l]);return ;}int mid=(l+r)>>1;if(a<=mid)  updata(l,mid,lson,a);else   updata(mid+1,r,rson,a);s[x]=s[lson]+s[rson];
}
node query(int l,int r,int x,int a,int b)
{if(a<=l&&r<=b) return s[x];int mid=(l+r)>>1;if(b<=mid) return query(l,mid,lson,a,b);if(a>mid)   return query(mid+1,r,rson,a,b);return query(l,mid,lson,a,b)+query(mid+1,r,rson,a,b);
}
inline int rd()
{int ret=0,f=1;   char gc=getchar();while(gc<'0'||gc>'9')  {if(gc=='-')    f=-f;  gc=getchar();}while(gc>='0'&&gc<='9')  ret=ret*10+gc-'0',gc=getchar();return ret*f;
}
int main()
{int i,a,b;ll x;n=rd(),m=rd();for(i=1;i<=n;i++)    K[i]=rd(),B[i]=rd();build(1,n,1);for(i=1;i<=m;i++){scanf("%s",str);if(str[0]=='M'){a=rd(),K[a]=rd(),B[a]=rd();updata(1,n,1,a);}else{a=rd(),b=rd(),x=rd();node tmp=query(1,n,1,a,b);printf("%lld\n",(x*tmp.k+tmp.b)%P);}}return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7671055.html

【BZOJ4499】线性函数 线段树相关推荐

  1. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  2. 线段树——HDU - 1698

    题目含义 就是初始化一堆数为1 可以经过操作把一个区间的数都改变 并求这堆数的总大小 题目分析 有一个 #include<iostream> #include<stdio.h> ...

  3. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  4. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  5. [bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树

    Holiday Painting 节日画画 bzoj-1582 Usaco-2009 Hol 题目大意:给定两个n*m的01网格图.q次操作,每次将第二个网格图的子矩阵全部变成0或1,问每一次操作后两 ...

  6. codefores 786B. Legacy(最短路,线段树优化拆点,好题)

    题目链接 B. Legacy time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...

  7. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

  8. 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)

    题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...

  9. bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治

    这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...

最新文章

  1. 简单邮件传送协议SMTP
  2. 【网络】HTTP基础总结
  3. SAP CRM Fiori应用My Note的OData调用设计
  4. ant中table表格的多选框如何清空
  5. 如何对聚类结果进行分析_如何更合理地给聚类结果贴标签——由一个挖掘学生用户的项目说开去...
  6. 字符缓冲输入流 BufferedReader java
  7. mysql mysql中的索引
  8. 华为回应关于“获政府巨额补贴”报道;最高法:微信微博聊天记录可作为证据;GoLand 2020.1 路线图公布 | 极客头条...
  9. [转]ORA-01555错误总结(二)
  10. 如何解决时间在前端显示的问题,使用jsel解决,仅供初步接触servlet新手
  11. 软考 - 数据库系统工程师
  12. vmware虚拟机卸载教程
  13. python写入csv或excel时,数字0开头丢失的解决方案
  14. 【高精度】高精度除以高精度 C++题解
  15. python爬虫之网易云歌曲下载(需要js分析) -- 2020.06.20更新
  16. MySQL HeatWave Quickstart AutoPilot简介
  17. Springboot 关闭或绕过 jwt用户验证
  18. 谷歌临时工成二等公民 ,部分人年薪仅 3万美元
  19. Git下载慢,经常超时 关联远程仓库
  20. mybatis从零基础到增删改查数据库

热门文章

  1. 创建 Windows Server无人值守安装自动安装 ISO
  2. springboot mybatis-plus 一个事务里面两次同样的查询,第二次没有查数据库
  3. 视频教程-算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践-C/C++
  4. vs2019离线安装OnnxRuntime
  5. 技术辞职报告格式范文(5篇)
  6. 计算机病毒论文7000字,计算机病毒解析与防范.doc
  7. 职位情报局 | 招聘季,什么样的职位最抢手?
  8. 关于Driver oracle.jdbc.OracleDriver claims to not accept jdbcUrl解决方法
  9. mp4视频 视频测试地址(在线MP4文件)
  10. 【软考备战·希赛网每日一练】2023年5月3日