• 题解——[TJOI2018]数学计算


    题解——[TJOI2018]数学计算

    我真的没看出来这是线段树


    题面搬运

    小豆现在有一个数x,初始值为1. 小豆有Q次操作,操作有两种类型:

    1 m: x = x * m ,输出 x%mod;

    2 pos: x = x / 第pos次操作所乘的数(保证第pos次操作一定为类型1,对于每一个类型1 的操作至多会被除一次),输出x%mod

    一共有t组输入(t ≤ 5)

    对于每一组输入,第一行是两个数字Q, mod(Q ≤ 100000, mod ≤ 1000000000);

    接下来Q行,每一行为操作类型op,操作编号或所乘的数字m(保证所有的输入都是合法的).

    1 ≤ Q ≤ 100000

    对于每一个操作,输出一行,包含操作执行后的x%mod的值

    思路

    我们用个线段树维护时间轴即可,初始全为1,1操作将该点修改为 m , 2操作改回 1 即可 。 大水题,但是很妙 。

    #include<bits/stdc++.h>
    using namespace std ;
    const int MAXN = 100005 ;
    #define ll long long
    inline ll read(){
       ll s=0 ; char g=getchar() ; while(g>'9'||g<'0')g=getchar() ;
       while(g>='0'&&g<='9')s=s*10+g-'0',g=getchar() ; return s ;
    }
    ll T , Q , mod ;
    struct Seg{
       int l , r ;
       ll sum ; 
    }t[ MAXN<<2 ];
    void  build( int p , int l , int r ){//不用updata,都是1 
       t[ p ].l = l , t[ p ].r = r , t[ p ].sum = 1 ;
       if( l == r )return ;
       int mid = ( l+r )>>1 ;
       build( p<<1 , l , mid ) , build( p<<1|1 , mid+1 ,r ) ;
    }
    void  change( int p , int loc , ll val ){
       if( t[ p ].l == t[ p ].r ){
       	t[ p ].sum = val ; return ;
       }
       int mid = ( t[ p ].l + t[ p ].r )>>1 ;
       if( loc <= mid )change( p<<1 , loc , val ) ;
       else change( p<<1|1 , loc , val ) ; 
       t[ p ].sum = ( t[ p<<1 ].sum*t[ p<<1|1 ].sum )%mod ; 
    }
    void  delelt( int p , int loc ){
       if( t[ p ].l == t[ p ].r ){
       	t[ p ].sum = 1 ; return ;
       }
       int mid = ( t[ p ].l + t[ p ].r )>>1 ;
       if( loc <= mid )delelt( p<<1 , loc ) ;
       else delelt( p<<1|1 , loc ) ;
       t[ p ].sum = ( t[ p<<1 ].sum*t[ p<<1|1 ].sum )%mod ; 
    }
    int main(){
       T = read() ;
       while( T-- ){
       	Q = read() , mod = read() ; ll m1 , m2 ;
       	build( 1 , 1 , Q ) ; 
       	for( int i = 1 ; i <= Q ; ++i ){
       		m1 = read() , m2 = read() ; 
       		if( m1 == 1 )
       			change( 1 , i , m2 ) ;
       		else delelt( 1 , m2 ) ;
       		printf("%lld
    ", t[ 1 ].sum ) ; 
       	}
       }
       return 0 ;
    }
    

    如有不足,请大佬指出

  • 相关阅读:
    怎样在caffe中添加layer以及caffe中triplet loss layer的实现
    【java】为数组全部元素赋同样的值 以及 数组之间的复制
    POJ 2386 Lake Counting 搜索题解
    android中实现内容搜索
    JNI之——在cmd命令行下编译执行C/C++源文件
    怎样编写高效android代码
    http headers
    matlab 工具函数、matlab toolbox(工具箱)
    数列收敛与数列极限
    数列收敛与数列极限
  • 原文地址:https://www.cnblogs.com/ssw02/p/11593712.html
Copyright © 2020-2023  润新知