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

因为开根号能使数字减小得非常快

所以开不了几次(6次?)很大的数就会变成1.....

所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return

(好像也可以维护区间被开方的次数,但我不会。。。QAQ)

#include<cstdio>
#include<iostream>
#include<cmath>
#define int long long
#define R register int
#define ls (tr<<1)
#define rs (tr<<1|1)
using namespace std;
inline int g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch==‘-‘?-1:fix;
    do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m;
int mx[400010],sum[400010];
inline void build(int tr,int l,int r){
    if(l==r) {mx[tr]=sum[tr]=g(); return ;}
    R md=(l+r)>>1;
    build(ls,l,md),build(rs,md+1,r);
    mx[tr]=max(mx[ls],mx[rs]);
    sum[tr]=sum[ls]+sum[rs];
}
inline void calc(int tr,int l,int r,int ll,int rr) {
    if(mx[tr]<=1) return ;
    if(l==r) {mx[tr]=sqrt(mx[tr]),sum[tr]=sqrt(sum[tr]); return ;}
    R md=(l+r)>>1;
    if(ll>md) calc(rs,md+1,r,ll,rr);
    else if(rr<md+1) calc(ls,l,md,ll,rr);
    else calc(ls,l,md,ll,md),calc(rs,md+1,r,md+1,rr);
    mx[tr]=max(mx[ls],mx[rs]);
    sum[tr]=sum[ls]+sum[rs];
}
inline int query(int tr,int l,int r,int ll,int rr) {
    if(l==ll&&r==rr) return sum[tr];
    R md=(l+r)>>1;
    if(ll>md) return query(rs,md+1,r,ll,rr);
    else if(rr<md+1) return query(ls,l,md,ll,rr);
    else return query(ls,l,md,ll,md)+query(rs,md+1,r,md+1,rr);
}
signed main() {
    n=g(); build(1,1,n); m=g();
    for(R i=1,k,l,r;i<=m;++i) {
        k=g(),l=g(),r=g();
        if(l>r) swap(l,r);
        if(k&1) printf("%lld\n",query(1,1,n,l,r));
        else calc(1,1,n,l,r);
    }
}


2019.04.11

原文地址:https://www.cnblogs.com/Jackpei/p/10687158.html

时间: 2024-11-09 05:01:37

luogu P4145 上帝造题的七分钟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

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

好吧,楼下有分块的解法,那么我就再阐述一遍好了 本以为暴力分块为\(TLE\)的,结果发现吊打线段树,用奇技淫巧的卡常技术卡到第一页 评测记录 其实这道题就是数列分块入门\(5\)嘛,发现一个数只能被不超过\(6\)次开方,那么暴力修改,用一个标记看看整块是否有大于\(1\)的数 那么我就献上一个未卡常的分块解法 \(Code\ Below:\) #include <bits/stdc++.h> #define ll long long using namespace std; const i

洛谷P4145上帝造题的七分钟——区间修改

题目:https://www.luogu.org/problemnew/show/P4145 区间开平方,可以发现其实开几次就变成1,不需要开了,所以标记一下,每次只去开需要开的地方: 原来写的并查集跳过1或0,然而WA... (如果a数组<原数组>开int会RE!) 改成线段树,本来想着是这一段区间和只要小于等于其长度就可以跳过了,然而仔细想想完全不是,应为可能有多个0什么的: 所以直接开bool数组标记一下就好了: 不需要pushdown,直接去修改或是跳过. 并查集: #include&

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说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作.第

【BZOJ3132】上帝造题的七分钟 树状数组

[BZOJ3132]上帝造题的七分钟 Description “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. 第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作. 第四分钟,彩虹喵说,要基于二叉树的数据结构,于是便有了数据范围. 第五分钟,和雪说,要有耐心,于是便有了时间限制. 第六分钟,吃钢琴男说,要省点事,于是便有了保证运算过程中

C++之路进阶——线段树(上帝造题的七分钟 2)

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