上帝造题的七分钟2 / 花神游历各国

好吧,楼下有分块的解法,那么我就再阐述一遍好了

本以为暴力分块为\(TLE\)的,结果发现吊打线段树,用奇技淫巧的卡常技术卡到第一页

评测记录

其实这道题就是数列分块入门\(5\)嘛,发现一个数只能被不超过\(6\)次开方,那么暴力修改,用一个标记看看整块是否有大于\(1\)的数

那么我就献上一个未卡常的分块解法

\(Code\ Below:\)

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=100000+10;
ll n,m,a[maxn],sum[330],v[330],pos[maxn],blo;

void change(ll x){
    if(!v[x]){
        v[x]=1;sum[x]=0;
        for(ll i=(x-1)*blo+1;i<=x*blo;i++){
            a[i]=sqrt(a[i]);
            sum[x]+=a[i];
            if(a[i]>1) v[x]=0;
        }
    }
}

void update(ll l,ll r){
    if(!v[pos[l]]){
        for(ll i=l;i<=min(pos[l]*blo,r);i++){
            sum[pos[i]]-=a[i];
            a[i]=sqrt(a[i]);
            sum[pos[i]]+=a[i];
        }
        v[pos[l]]=1;
        for(ll i=(pos[l]-1)*blo+1;i<=min(pos[l]*blo,n);i++){
            if(a[i]>1){v[pos[l]]=0;break;}
        }
    }
    if(pos[l]!=pos[r]){
        if(!v[pos[r]]){
            for(ll i=(pos[r]-1)*blo+1;i<=r;i++){
                sum[pos[i]]-=a[i];
                a[i]=sqrt(a[i]);
                sum[pos[i]]+=a[i];
            }
            v[pos[r]]=1;
            for(ll i=(pos[r]-1)*blo+1;i<=min(pos[r]*blo,n);i++){
                if(a[i]>1){v[pos[r]]=0;break;}
            }
        }
    }
    for(ll i=pos[l]+1;i<=pos[r]-1;i++) change(i);
}

ll query(ll l,ll r){
    ll ans=0;
    for(ll i=l;i<=min(pos[l]*blo,r);i++) ans+=a[i];
    if(pos[l]!=pos[r])
        for(ll i=(pos[r]-1)*blo+1;i<=r;i++) ans+=a[i];
    for(ll i=pos[l]+1;i<=pos[r]-1;i++) ans+=sum[i];
    return ans;
}

int main()
{
    scanf("%lld",&n);blo=sqrt(n);
    for(ll i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        pos[i]=(i-1)/blo+1;
        sum[pos[i]]+=a[i];
    }
    scanf("%lld",&m);
    ll opt,l,r;
    while(m--){
        scanf("%lld%lld%lld",&opt,&l,&r);
        if(l>r) swap(l,r);
        if(opt==0) update(l,r);
        else printf("%lld\n",query(l,r));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/owencodeisking/p/9736440.html

时间: 2024-11-09 09:55:48

上帝造题的七分钟2 / 花神游历各国的相关文章

P4145 上帝造题的七分钟2 / 花神游历各国

思路 每个数不会被开方超过log次,对每个数暴力开方即可 代码 #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> #define int long long using namespace std; struct Node{ int max,sum; }Seg[100100<<2]; int a[100100],n,m; void pushup(i

luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&amp;&amp;区间开根号

因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以维护区间被开方的次数,但我不会...QAQ) #include<cstdio> #include<iostream> #include<cmath> #define int long long #define R register int #define ls (tr<

【BZOJ3211&amp;3038】花神游历各国&amp;上帝造题的七分钟2(CodeVS)

Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 5 5 1 1 2 2 1 2 1 1 2 2 2 3 1 1 4 Sample Output 101 11 11 HINT 对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9 Source SPOJ2713 gss4 数据已加强 思路:线段树并不能区间开方,但直接暴力修改是会超时的,只要加入一点点优化:若

BZOJ 3038 上帝造题的七分钟2 (并查集+树状数组)

题解:同 BZOJ 3211 花神游历各国,需要注意的是需要开long long,还有左右节点需要注意一下. #include <cstdio> #include <cmath> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; LL a[100005],c[100005]; int f[100005],n,m,op,l,r,t; int s

【BZOJ3038】【Codevs2492】上帝造题的七分钟2

喜闻乐见双倍经验 2492 上帝造题的七分钟 2 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作. 第三分钟,k说,要能查询,于是便有了求一段数的和的操作. 第四分钟,彩虹喵说,要是noip难度,于是便有了数据范围. 第五分

BZOJ 3132: 上帝造题的七分钟( 二维BIT )

二维树状数组... 自己YY一下再推一下应该可以搞出来... ---------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i <

3038: 上帝造题的七分钟2 [线段树 暴力]

3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1210  Solved: 536[Submit][Status][Discuss] Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部."第一分钟,X说,要有数列,于是便给定了一个正整数数列.第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作.第三分钟,k说,要能查询,于是便有了求一段数的和的操作.第四分

Bzoj3038 上帝造题的七分钟2 并查集

Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1135  Solved: 509 Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部."第一分钟,X说,要有数列,于是便给定了一个正整数数列.第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作.第三分钟,k说,要能查询,于是便有了求一段数的和的操作.第四分钟,彩虹喵说,要是noip难度,于是便有了数据范围.第五分钟,诗人说,要有韵律,于

tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树

P1716 - 上帝造题的七分钟 From Riatre    Normal (OI)总时限:50s    内存限制:128MB    代码长度限制:64KB 背景 Background 裸体就意味着身体. 描述 Description “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵.第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作.第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作.第