• BZOJ 4499: 线性函数


    4499: 线性函数

    Time Limit: 20 Sec  Memory Limit: 256 MB
    Submit: 177  Solved: 127
    [Submit][Status][Discuss]

    Description

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

    Source

     
    [Submit][Status][Discuss]

    莫名其妙,线段树维护一下区间的函数和就好了,单点修改,区间查询,比GSS还水……

    UPDATE 感觉这么水的题,再困还是可以写出来的,补代码……

     1 #include<cstdio>
     2 #define N 200005
     3 #define M 800005
     4 #define P 1000000007
     5 int n,m,ki[N],bi[N],k[M],b[M];
     6 void build(int t,int l,int r){
     7     if(l==r)k[t]=ki[l],b[t]=bi[l];
     8     else{
     9         int d=l+r>>1,x=t<<1,y=x|1;
    10         build(x,l,d);
    11         build(y,d+1,r);
    12         k[t]=(1LL*k[x]*k[y])%P;
    13         b[t]=(1LL*k[y]*b[x]%P+b[y])%P;
    14     }
    15 }
    16 void build(int t,int l,int r,int p){
    17     if(l==r)k[t]=ki[l],b[t]=bi[l];
    18     else{
    19         int d=l+r>>1,x=t<<1,y=x|1;
    20         if(p<=d)build(x,l,d,p);
    21         else build(y,d+1,r,p);
    22         k[t]=(1LL*k[x]*k[y])%P;
    23         b[t]=(1LL*k[y]*b[x]%P+b[y])%P;
    24     }
    25 }
    26 int query(int t,int l,int r,int x,int y,int v){
    27     if(l==x&&r==y)return (1LL*k[t]*v%P+b[t])%P;
    28     int d=l+r>>1;
    29     if(y<=d)return query(t<<1,l,d,x,y,v);
    30     if(x>d)return query(t<<1|1,d+1,r,x,y,v);
    31     return query(t<<1|1,d+1,r,d+1,y,query(t<<1,l,d,x,d,v));
    32 }
    33 main(){
    34     scanf("%d%d",&n,&m);
    35     for(int i=1;i<=n;++i)
    36         scanf("%d%d",ki+i,bi+i);
    37     build(1,1,n);
    38     while(m--){
    39         static int x,y,z;
    40         static char s[10];
    41         scanf("%s%d%d%d",s,&x,&y,&z);
    42         if(s[0]=='M')ki[x]=y,bi[x]=z,build(1,1,n,x);
    43         else printf("%d
    ",query(1,1,n,x,y,z));
    44     }
    45 }

    @Author: YouSiki

  • 相关阅读:
    500. 键盘行
    657. 判断路线成圈
    771. 宝石与石头
    461. 汉明距离
    Java 基本数据类型
    Windows下的DOM操作
    jQuery学习笔记
    Java(16-19)
    Java(1-15)
    总结
  • 原文地址:https://www.cnblogs.com/yousiki/p/6538319.html
Copyright © 2020-2023  润新知