首页 > 其他分享 >P4145 上帝造题的七分钟 2 / #6281. 数列分块入门 5

P4145 上帝造题的七分钟 2 / #6281. 数列分块入门 5

时间:2022-10-26 22:34:46浏览次数:69  
标签:vis int ll 6281 七分钟 P4145 include sum block

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define ll long long
const int N = 1e5 + 1 ;
const int M = 1e5 + 1 ;
ll n , m , T ;
ll a [ N ] ;
ll block [ N ] ;
ll sum [ N ] , vis [ N ] ;
void check ( int b )
{
    if ( vis [ b ] ) return ;
    if ( sum [ b ] == min ( n , b * T ) - ( b - 1 ) * T )
        vis [ b ] = 1;
}
void Sqrt ( int x , int y )
{
    if ( block [ x ] == block [ y ] )
    {
        if ( vis [ block [ x ] ] == 1 )
            return ;
        for ( int i = x ; i <= y ; i ++ )
        {
            sum [ block [ x ] ] -= a [ i ] ;
            a [ i ] = sqrt ( a [ i ] ) ;
            sum [ block [ x ] ] += a [ i ] ;
        }
        check ( block [ x ] ) ;
        return ;
    }
    if ( vis [ block [ x ] ] == 0 )
    for ( int i = x ; i <= block [ x ] * T  ; i ++ )
        sum [ block [ i ] ] -= a [ i ] ,
        a [ i ] = sqrt ( a [ i ] ) ,
        sum [ block [ i ] ] += a [ i ] ;

    if ( vis [ block [ y ] ] == 0 )
    for ( int i = ( block [ y ] - 1 ) * T + 1 ; i <= y ; i ++ )
        sum [ block [ i ] ] -= a [ i ] ,
        a [ i ] = sqrt ( a [ i ] ) ,
        sum [ block [ i ] ] += a [ i ] ;

    for ( int j = block [ x ] + 1; j <= block [ y ] - 1 ; j ++ )
    {
        if ( vis [ j ] == 0 ) continue;
        for ( int i = ( j - 1 ) * T + 1 ; i <= j * T ; i ++ )
            sum [ block [ i ] ] -= a [ i ] ,
            a [ i ] = sqrt ( a [ i ] ) ,
            sum [ block [ i ] ] += a [ i ] ;
    }

    for ( int i = block [ x ] ; i <= block [ y ] ; i ++ )
        check ( i );
}
ll query ( int x , int y )
{
    ll ans = 0 ;
    if ( block [ x ] == block [ y ] )
    {
        for ( int i = x ; i <= y ; i ++ )
        {
            ans += a [ i ];
        }
        return ans ;
    }
    for ( int i = x ; i <= block [ x ] * T; i ++ )
    {
        ans += a [ i ] ;
    }
    for ( int i = ( block [ y ] - 1 ) * T + 1 ; i <= y ; i ++ )
    {
        ans += a [ i ] ;
    }
    for ( int i = block [ x ] + 1 ; i <= block [ y ] - 1 ; i ++ )
    {
        ans += sum [ i ] ;
    }
    return ans ;
}
int main()
{
    freopen ( "text.in" , "r" , stdin ) ;
    cin >> n ;
    T = sqrt ( n ) ;
    for ( int i = 1 ; i <= n ; i ++ )
    {
        cin >> a [ i ] ;
        block [ i ] = ( i - 1 ) / T + 1 ;
        sum [ block [ i ] ] += a [ i ] ;
    }
    cin >> m ;
    for ( int i = 1 ; i <= m ; i ++ )
    {
        int op , l , r ;
        cin >> op >> l >> r ;
        if ( l > r ) swap ( l , r ) ;
        if ( op == 0 )
        {
            Sqrt ( l , r ) ;
        }
        else
        {
            cout << query ( l , r ) << endl ;
        }
    }
    return 0 ;
}

标签:vis,int,ll,6281,七分钟,P4145,include,sum,block
From: https://www.cnblogs.com/dadidididi/p/16830339.html

相关文章

  • Luogu P4514 上帝造题的七分钟
    题目链接:​​传送门​​二维树状数组区间加区间求和烦人的输入#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<complex>#include<......
  • BZOJ 3132(上帝造题的七分钟-树状数组求和+2D逆求和数组)
    3132:上帝造题的七分钟TimeLimit: 20Sec  MemoryLimit: 128MBSubmit: 46  Solved: 18[​​Submit​​][​​Status​​][​​Discuss​]Description......
  • P4145 上帝造题的七分钟 2 / 花神游历各国
    题目链接P4145上帝造题的七分钟2/花神游历各国上帝造题的七分钟2/花神游历各国题目背景XLk觉得《上帝造题的七分钟》不太过瘾,于是有了第二部。题目描述"第一......
  • 七分钟学会 HTML 网页制作
    什么是HTML点击打开视频讲解更加详细HyperTextMarkupLanguage(超文本标记语言)标签控制排版体积小,方便传输编写HTLML推荐使用:VSCode<!DOCTYPEhtml><htmllang......