码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ】3038 上帝造题的七分钟2

时间:2017-09-23 10:34:42      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:long   else   ==   play   lap   div   个数   数组   ons   

【算法】线段树||(坑...)

【题解】修改必须暴力单点修改,然后利用标记区间查询。

优化:一个数经过不断开方很快就会变成1,所以维护区间最大值。

修改时访问到的子树最大值<=1时,该区间就不必修改。

技术分享
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100010;
struct treess{int k,l,r;long long maxs,sum;}t[maxn*3];
int n,m;long long a[maxn];
void build(int k,int l,int r)
{
    t[k].l=l;t[k].r=r;
    if(l==r)t[k].maxs=t[k].sum=a[l];
     else
      {
          int mid=(l+r)>>1;
          build(k<<1,l,mid);
          build(k<<1|1,mid+1,r);
          t[k].maxs=max(t[k<<1].maxs,t[k<<1|1].maxs);//printf("k=%d maxs=%d",k,t[k].maxs);
          t[k].sum=t[k<<1].sum+t[k<<1|1].sum;
      }
}
void update(int k,int l,int r)
{
    int left=t[k].l,right=t[k].r;
    if(t[k].maxs<=1)return;
    if(left==right)a[left]=floor(sqrt(a[left])),t[k].maxs=t[k].sum=a[left];
     else
      {
          int mid=(left+right)>>1;
          if(l<=mid)update(k<<1,l,r);
          if(r>mid)update(k<<1|1,l,r);
          t[k].maxs=max(t[k<<1].maxs,t[k<<1|1].maxs);
          t[k].sum=t[k<<1].sum+t[k<<1|1].sum;
      }
}
long long ask(int k,int l,int r)
{
    int left=t[k].l,right=t[k].r;
    if(l<=left&&right<=r)return t[k].sum;
    int mid=(left+right)>>1;long long ans=0;
    if(l<=mid)ans=ask(k<<1,l,r);
    if(r>mid)ans+=ask(k<<1|1,l,r);
    return ans;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    scanf("%d",&m);
    build(1,1,n);
    for(int i=1;i<=m;i++)
     {
         int k,l,r;
         scanf("%d%d%d",&k,&l,&r);
         if(l>r)swap(l,r);
         if(k==0)update(1,l,r);
          else printf("%lld\n",ask(1,l,r));
     }
    return 0;
}
View Code

BZOJ 3211 花神游历各国 树状数组+并查集

【BZOJ】3038 上帝造题的七分钟2

标签:long   else   ==   play   lap   div   个数   数组   ons   

原文地址:http://www.cnblogs.com/onioncyc/p/5845470.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!