LOJ#3043。「ZJOI2019」ラインセグメントツリーラインセグメントツリー+分類のディスカッション

Da Daは議論に分かれており、アイデアはまだ非常に賢いです。 

コード: 

#include <bits / stdc ++。h>     
#define ll long long 
#define lson now << 1 
#define rson now << 1 | 1     
#define N 100008         
#define mod 998244353 
#define setIO(s)freopen(s ".in "、" r "、stdin)
名前空間stdを使用;    
int n、m、cur;   
ll f [N << 3]、g [N << 3]、SUM [N << 3]、qp [N]、mf [N << 3]、mg [N << 3];  
void markf(int now、int v)
{ 
    f [now] =(ll)f [now] * qp [v]%mod;     
    SUM [now] =(ll)SUM [now] * qp [v]%mod;  
    mf [now] + = v;    
}     
void markg(int now、int v)
{ 
    g [now] =(ll)g [now] * qp [v]%mod;    
    mg [now] + = v;  
    if(mf [now])
    { 
        markf(lson、mf [now]); 
        markf(rson、mf [now]); 
        mf [now] = 0;   
    } 
    if(mg [now])
    { 
        markg(lson、mg [now]); 
        markg(rson、mg [now]);  
        mg [now] = 0;   
    } 
} 
void pushup(int now)
{   
    SUM [now] =(ll)(SUM [lson] + SUM [rson] + f [now])%mod;    
}   
void build(int l、int r、int now)
{ 
    f [now] = 0、g [now] = 1;   
    if(l == r)return;      
    int mid =(l + r)>> 1;   
    build(l、mid、lson)、build(mid + 1、r、rson);    
}         
void update(int l、int r、int now、int L、int R)
{      
    pushdown(now);             
    if(l> = L && r <= R)
        pushdown(p);   
    {     
        // 1类点    
        f [now] =(ll)(f [now] + qp [cur-1])%mod;             
        markf(lson、1)、markf(rson、1);                         
        pushup(now);               
        戻る;    
    } 
    int mid =(l + r)>> 1;   
    if(L <= mid && R> mid)
    {    
        update(l、mid、lson、L、R); 
        update(mid + 1、r、rson、L、R);                 
    } 
    else if(L <= mid)
    { 
        update(l、mid、lson、L、R);      
        int p = rson;               
        markf(p << 1,1)、markf(p << 1 | 1,1);     
        markg(p << 1,1)、markg(p << 1 | 1,1);       
        g [p] =(ll)(g [p] + g [p])%mod;     
        pushup(p);     
    } 
    else 
    {        
 
        update(mid + 1、r、rson、L、R);   
        int p = lson;                       
        pushdown(p);   
        markf(p << 1,1)、markf(p << 1 | 1,1);     
        markg(p << 1,1)、markg(p << 1 | 1,1);  
        f [p] =(ll)(f [p] + qp [cur-1] -g [p] + mod)%mod;     
        g [p] =(ll)(g [p] + g [p])%mod;  
        pushup(p);        
    }                  
    // 2类点      
    // 
    g [now] =(ll)(g [now] + qp [cur-1])%mod;   
    pushup(now);          
} 
メインINT()
{ 
   // setIO( "input"); 
    qp [0] = 1;   
    for(int i = 1; i <N; ++ i)qp [i] =(ll)qp [i-1] * 2%mod;      
    scanf( "%d%d"、&n、&m);    
    build(1、n、1);   
    for(int i = 1; i <= m; ++ i)
    {    
        int op、l、r;   
        scanf( "%d"、&op);  
        if(op == 1)      
        { 
            scanf( "%d%d"、&l、&r)、++ cur、update(1、n、1、l、r);   
        } 
        else 
        { 
            printf( "%lld \ n"、SUM [1]);    
        } 
    } 
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/12748685.html