一次函数

【题目描述】
fqk 退役后开始补习文化课啦, 于是他打开了数学必修一开始复习
函数, 他回想起了一次函数都是f(x)=k*x+b的形式, 现在他给了你 n 个
一次函数fi(x)=ki*x+bi,然后将给你 m 个操作, 操作将以如下格式给出:
1.M  i k b ,把第 i 个函数改为fi(x)=k*x+b
2.Q  l r x ,询问 fr(fr-1(……f(1)))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

/*
  观察式子,我们可以知道f2(f1(x))=k2(k1*x+b1)*b2,  展开式子得:ans=k2*k1*x+k2*b1*b2,所以新的k=k2*k1,b=k2*b1*b2,  利用这个原理建立两棵线段树,一棵维护k,一棵维护b。
*/
#include<cstdio>
#include<iostream>
#define N 200010
#define mod 1000000007
#define ll long long
#define lson l,mid,now*2
#define rson mid+1,r,now*2+1
#define lc now*2
#define rc now*2+1
#ifdef unix
#define LL "%lld\n"
#else
#define LL "%I64d\n"
#endif
using namespace std;
ll K[N*4],B[N*4];int n,m;
int read()
{
    int num=0,flag=1;char c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)flag=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();}
    return num*flag;
}
void insert(int l,int r,int now,int pos,int k,int b)
{
    if(l==r)
    {
        K[now]=(ll)k;B[now]=(ll)b;return;
    }
    int mid=(l+r)/2;
    if(pos<=mid)insert(lson,pos,k,b);
    else insert(rson,pos,k,b);
    K[now]=K[lc]*K[rc]%mod;B[now]=(K[rc]*B[lc]%mod+B[rc])%mod;
}
ll kquery(int l,int r,int now,int x,int y)
{
    if(l>=x&&r<=y)return K[now];
    int mid=(l+r)/2;
    ll k1=1,k2=1;
    if(x<=mid)k1=kquery(lson,x,y);
    if(y>mid)k2=kquery(rson,x,y);
    return k1*k2%mod;
}
ll bquery(int l,int r,int now,int x,int y)
{
    if(l>=x&&r<=y)return B[now];
    int mid=(l+r)/2;
    ll b1=0,b2=0;
    if(x<=mid)b1=bquery(lson,x,y);
    if(y>mid)
    {
        b2=bquery(rson,x,y);
        b1*=kquery(rson,x,y);
    }
    return (b1%mod+b2)%mod;
}
int main()
{
    freopen("fx.in","r",stdin);
    freopen("fx.out","w",stdout);
    n=read(),m=read();
    for(int i=1;i<=n;i++)
    {
        int k=read(),b=read();
        insert(1,n,1,i,k,b);
    }
    for(int i=1;i<=m;i++)
    {
        char c;cin>>c;
        if(c==‘M‘)
        {
            int p=read(),k=read(),b=read();
            insert(1,n,1,p,k,b);
        }
        else
        {
            int l=read(),r=read(),x=read();
            ll k=kquery(1,n,1,l,r);
            ll b=bquery(1,n,1,l,r);
            printf(LL,(k*x%mod+b)%mod);
        }
    }
    return 0;
}
时间: 2024-08-04 05:06:43

一次函数的相关文章

一次函数(好难的一次函数)

一次函数 (fx.c/cpp/pas) [题目描述] fqk 退役后开始补习文化课啦, 于是他打开了数学必修一开始复习函数, 他回想起了一次函数都是 b kx x f ? ? ) ( 的形式, 现在他给了你 n 个一次函数 i i ib x k x f ? ? ) ( , 然后将给你 m 个操作, 操作将以如下格式给出:M . 1 i k b ,把第 i 个函数改为 b kx x f i ? ? ) ( .Q . 2 l r x ,询问 ))) ( (... (1x f f fl r r ?mo

LYOI2016 Summer 一次函数 (线段树)

题目描述 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.接下

洛谷 P2026 求一次函数解析式

P2026 求一次函数解析式 题目背景 做数学寒假作业的怨念…… 题目描述 给定两个整点的坐标,求它们所在直线的函数解析式(一次函数). 输入输出格式 输入格式: 输入共两行. 第一行有两个整数x1,y1.表示第一个整点的坐标为(x1,y1) 第二行有两个整数x2,y2.表示第二个整点的坐标为(x2,y2) 输出格式: 输出共一行,即这个函数解析式. 输入输出样例 输入样例#1: 复制 [一] 3 6 2 4 [二] 3 5 2 7 [三] 3 -1 5 -2 输出样例#1: 复制 [一] y=

求两个一次函数的交点

Point2f pointIntersection(Point2f p1, Point2f p2, Point2f p3, Point2f p4) { //p1,p2所在一条直线,p3,p4所在一条直线,求两条直线的交点 //p1,p2所成的直线 BOOL flag1=FALSE,flag2=FALSE; Point2f p;//存放最后的交点 float k1,k2,b1,b2; if(p2.x==p1.x)//分母不能为0 p.x=p2.x; else { flag1=TRUE; k1=(p

WinForm中,每隔一段时间(参数)调用一次函数(使用定时器)

1 System.Windows.Forms.Timer setTimer; //定义一个定时器 2 int flg = 0; //定义一个竖旗 3 private void btnSetTime_Click(object sender, EventArgs e) 4 { 5 setTimer = new System.Windows.Forms.Timer(); 6 int i = Convert.ToInt32(nudSetTime.Value); //界面控件的值,初始化隔5分钟刷新一次,

Leastsq 最小二乘法拟合一次函数简单入门例子

###最小二乘法试验### #error是自定义计算误差的函数,k,b也就是p0是计算初始化值,args是error其余的参数,该函数返回2个值,第一个是k,b的值 import numpy as np from scipy.optimize import leastsq ###采样点(Xi,Yi)### Xi=np.array([8.19,2.72,6.39,8.71,4.7,2.66,3.78]) Yi=np.array([7.01,2.78,6.47,6.71,4.1,4.23,4.05]

python 字符串只替换一次函数,支持汉字

def oneReplace(mystr,Findstr,Repstr): #Findstr=Findstr.decode('utf-8').encode('gb18030') idx=mystr.find(Findstr) strlen=len(Findstr.decode('utf-8')) arcpy.AddMessage("idx:"+str(idx)+":"+Findstr+"长度:"+str(strlen)) if idx<0:

关于SVM数学细节逻辑的个人理解(三) :SMO算法理解

第三部分:SMO算法的个人理解 接下来的这部分我觉得是最难理解的?而且计算也是最难得,就是SMO算法. SMO算法就是帮助我们求解: s.t.   这个优化问题的. 虽然这个优化问题只剩下了α这一个变量,但是别忘了α是一个向量,有m个αi等着我们去优化,所以还是很麻烦,所以大神提出了SMO算法来解决这个优化问题. 关于SMO最好的资料还是论文<Sequential Minimal Optimization A Fast Algorithm for Training Support Vector

Server.Transfer和Response.Redirect区别

根本上,Response是叫浏览器去重新转向到指定的网页,而Server自然是发生在服务器端为主了,因此会有以下区别: 1. Server.Transfer只能够转跳到本地虚拟目录指定的页面,而Response.Redirect则十分灵活:2. Server.Transfer可以将页面参数方便传递到指定页面:3. 使用时,Server.Transfer跳到别的页面后,浏览器显示的地址不会改变,有时反而会造成误会,当然也有些场合需要这样的效果:4. Server.Transfer可以减少客户端对服