前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >10128. 「一本通 4.3 练习 2」花神游历各国

10128. 「一本通 4.3 练习 2」花神游历各国

作者头像
yzxoi
发布2022-09-19 12:08:39
2530
发布2022-09-19 12:08:39
举报
文章被收录于专栏:OI

题意

每一次旅行中,花神会选择一条旅游路线,它在那一串国家中是连续的一段,这次旅行带来的开心值是这些国家的喜欢度的总和,当然花神对这些国家的喜欢程序并不是恒定的,有时会突然对某些国家产生反感,使他对这些国家的喜欢度 δ 变为 √δ (可能是花神虐爆了那些国家的 OI,从而感到乏味)。 现在给出花神每次的旅行路线,以及开心度的变化,请求出花神每次旅行的开心值。

思路

为了使时间复杂度降低,我们可以发现:

√1=1所以,最大数字109操作较少次数便能到1。所以在操作前判断一下,如果区间内都是1即可跳过。

代码语言:javascript
复制
#include<bits/stdc++.h>
#define ll long long
#define MAXNUM 1000000*4+10
using namespace std;
struct node{
    ll l,r,lef,rig;
    ll val,Max;
}tree[210000];
ll a[110000],len,n,m;
void build(ll l,ll r){
    ll root=++len;
    tree[root].l=l;tree[root].r=r;tree[root].lef=tree[root].rig=-1;
    if(l==r)tree[root].val=tree[root].Max=a[l];
    else{
        ll mid=(l+r)/2;
        ll lef=tree[root].lef=len+1;build(l,mid);
        ll rig=tree[root].rig=len+1;build(mid+1,r);
        tree[root].val=tree[lef].val+tree[rig].val;
        tree[root].Max=max(tree[lef].Max,tree[rig].Max);
    }
}
void update(ll root,ll l,ll r){
    if(tree[root].Max<2) return ;
    if(tree[root].l==tree[root].r){tree[root].val=sqrt(tree[root].val);tree[root].Max=tree[root].val;return ;}
    ll lef=tree[root].lef,rig=tree[root].rig,mid=(tree[root].l+tree[root].r)/2;
    if(r<=mid) update(lef,l,r);
    else if(mid<l) update(rig,l,r);
    else update(lef,l,mid),update(rig,mid+1,r);
    tree[root].val=tree[lef].val+tree[rig].val;
    tree[root].Max=max(tree[lef].Max,tree[rig].Max);
}
ll query(ll root,ll l,ll r){
    if(tree[root].l>=l&&tree[root].r<=r) return tree[root].val;
    ll lef=tree[root].lef,rig=tree[root].rig,mid=(tree[root].l+tree[root].r)/2;
    if(r<=mid) return query(lef,l,r);
    else if(mid<l) return query(rig,l,r);
    else return query(lef,l,mid)+query(rig,mid+1,r);
}
int main(){
    scanf("%lld",&n);
    for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
    build(1,n);
    scanf("%lld",&m);
    while(m--){
        char s;cin>>s;
        if(s=='2'){
            ll x,y;scanf("%lld%lld",&x,&y);
            update(1,x,y);
        }else{
            ll x,y;scanf("%lld%lld",&x,&y);
            printf("%lld\n",query(1,x,y));
        }
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
    • 思路
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档