首页 > 其他分享 >Luogu P4145 上帝造题的七分钟 2 / 花神游历各国 题解

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

时间:2023-01-31 13:18:05浏览次数:54  
标签:maxx int Luogu mid 七分钟 summ quxiu 题解 区间

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

$ {\scr \color {Orchid}{\text{Solution}}} $

题目大意

支持两种操作:

  1. 区间开方(向下取整)
  2. 区间求和

分析

发现线段树容易实现区间求和,考虑区间开方操作

其实并没有什么思路

我们发现了一个很显而易见神奇的事情,如果对一个数开方且下取整,最后这个数一定是$1$

然后用计算器计算一下,发现$1$~$10^{12}$里的一个数,最多开方$6$次,就能变成$1$

所以一共最多只用修改$ 6 \times n$次,发现这是可以承受的

所以就很简单啦!维护区间最大值,如果区间内所有数都小于等于$1$,就跳过这段区间

如果大于1,就把区间细分为左儿子与右儿子,重新进行上一步,一直到叶子节点,直接修改即可

时间复杂度:$O(n log n)$(常数很小)

最后放个代码啦QwQ

Code

#include<bits/stdc++.h>
#define L long long
using namespace std;
L a[500005],summ[2000005],maxx[2000005];
void build(int o,int l,int r)
{
    if(l==r)
    {
        summ[o]=maxx[o]=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(o+o,l,mid);
    build(o+o+1,mid+1,r);
    summ[o]=summ[o+o]+summ[o+o+1];
    maxx[o]=max(maxx[o+o],maxx[o+o+1]);
}
L x,y;
void quxiu(int o,int l,int r)
{
    if(l==r)
    {
        summ[o]=sqrt(summ[o]);
        maxx[o]=sqrt(maxx[o]);
        return;
    }
    int mid=(l+r)>>1;
    if(x<=mid && maxx[o+o]>1) quxiu(o+o,l,mid);
    if(y>mid && maxx[o+o+1]>1) quxiu(o+o+1,mid+1,r);
    summ[o]=summ[o+o]+summ[o+o+1];
    maxx[o]=max(maxx[o+o],maxx[o+o+1]);
}
L ans;
void qucha(int o,int l,int r)
{
    if(x<=l && r<=y)
    {
        ans+=summ[o];
        return;
    }
    int mid=(l+r)>>1;
    if(x<=mid) qucha(o+o,l,mid);
    if(y>mid) qucha(o+o+1,mid+1,r);
}
int main()
{
    int n,m;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    build(1,1,n);
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        int k;
        scanf("%d%lld%lld",&k,&x,&y);
        if(x>y) swap(x,y);
        if(k==0) quxiu(1,1,n);
        else
        {
            qucha(1,1,n);
            printf("%lld\n",ans);
            ans=0;
        }
    }
   return 0; }

标签:maxx,int,Luogu,mid,七分钟,summ,quxiu,题解,区间
From: https://www.cnblogs.com/201929-whx/p/17078607.html

相关文章

  • AT dp 26 题 题解
    题单:https://www.luogu.com.cn/training/100578#problems嘛虽然是26题,但是简单的题就不想写了...就写绿题及以上的吧目录EIJMOPQRSTUVE对重量dp,设\(dp[i][v]\)表......
  • uniapp webview中动态设置公众号文章标题不显示问题解决
    设置在onLoad中可能会引起偶发性无效。解决方案:1、改写在onReady生命周期中。2、用setTimeout设置延迟。 onReady(){this.timers=setTimeout(()=>{......
  • USACO2023 Bronze 题解
    Problem1.Leaders\(\mathcal{Farmer\John}\)共有\(n\)头奶牛,品种用字符\(\mathsf{G}\)或\(\mathsf{H}\)表示。每一头牛有一个管辖区间\([i,E_i]\)称一头......
  • 算法:线段树&&Luogu p3372题解
    前言不愧是线段树,竟然卡我这么久,还是那句话:十年OI一场空,不开longlong见祖宗#1什么是线段树?线段树长什么样?通俗一点,线段树就是线段,树。实际上,线段树是一棵完全......
  • CF1067E 题解
    题意传送门给定一棵\(n\)个节点的树,每条边有\(\frac{1}{2}\)的概率出现,可以得到一个森林,求这个森林邻接矩阵的秩的期望。\(1\len\le5\times10^5\)。题解此题关键......
  • [AHOI2022] 山河重整 题解
    T3,一个不错的数学题,给了不少的暴力分。Statement求有多少值域为\([1,n]\)的集合,01背包可以凑出\(1\simn\)中的所有数字。Subtask\(1\sim6\)我们从小到大选择每......
  • 微信小程序-【转发好友】以及中文标题乱码问题解决
    微信小程序的转发功能,参考官方文档,使用的buttom的open-type功能,下面是转发功能的具体实现。//通过按钮的open-type="share"实现转发,触发onShareAppMessage函数<butto......
  • 洛谷P2375 [NOI2014] 动物园【题解】
    题目简要对于字符串\(......
  • 部分互测题,专项测试题题解
    互测部分1https://www.cnblogs.com/Chencgy/p/16970117.html2A.营救皮卡丘跑弗洛伊德,搞出\(i->j\)不经过比\(i,j\)编号大的点的最小花费每个点都要走一遍,套......
  • TypeDB Forces 2023 (Div. 1 + Div. 2) 题解
    更新中……A~D略。E.TheHarmonizationofXOR题目链接题意简述\(t\)组testcase,每组给定\(n,k,x\)三个数。求将\(1\simn\)划分成\(k\)个子序列(可以不连......