HDU-4027-Can you answer these queries? (线段树,区间开平方,区间求和)

题目链接:HDU-4027-Can you answer these queries?

一个数最多开平方8次,所以加个剪枝,当区间和等于区间元素数时,不再递归下去,

然后要注意eps开大一点,因为原始数字是long long 的范围。

#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
const double eps=1e-10;
ll sum[maxn<<2];
void push_up(int now)
{
    sum[now]=sum[now<<1]+sum[now<<1|1];
}
void build(int now,int l,int r)
{
    if(l==r)
    {
        scanf("%I64d",&sum[now]);
        return ;
    }
    int mid=(l+r)>>1;
    build(now<<1,l,mid);
    build(now<<1|1,mid+1,r);
    push_up(now);
}

void update(int now,int l,int r,int ul,int ur)
{
    if(l==r)
    {
        sum[now]=sqrt((long double)sum[now])+eps;
        return ;
    }
    if(ul<=l&&ur>=r&&sum[now]==r-l+1) return ;
    int mid=(l+r)>>1;
    if(ul<=mid) update(now<<1,l,mid,ul,ur);
    if(ur>mid) update(now<<1|1,mid+1,r,ul,ur);
    push_up(now);
}

ll query(int now,int l,int r,int ql,int qr)
{
    ll res=0;
    if(ql<=l&&qr>=r) return sum[now];
    int mid=(l+r)>>1;
    if(ql<=mid) res+=query(now<<1,l,mid,ql,qr);
    if(qr>mid)  res+=query(now<<1|1,mid+1,r,ql,qr);
    return res;
}

int main()
{
    int n,kase=1,l,r,option,m;
    while(~scanf("%d",&n))
    {
        printf("Case #%d:\n",kase++);
        build(1,1,n);
        scanf("%d",&m);
        for(int i=0;i


转载于:https://www.cnblogs.com/GrowingJlx/p/6642642.html

你可能感兴趣的:(HDU-4027-Can you answer these queries? (线段树,区间开平方,区间求和))