SPOJ GSS4 Can you answer these queries IV ——树状数组 并查集

【题目分析】

    区间开方+区间求和。

    由于区间开方次数较少,直接并查集维护下一个不是1的数的位置,然后暴力修改,树状数组求和即可。

    这不是BZOJ上上帝造题7分钟嘛

【代码】

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
long long a[100001],f[100001],n,q,op,l,r;
long long t[100001];
inline long long gf(long long k)
{
    if (f[k]==k) return k;
    else return f[k]=gf(f[k]);
}
inline void add(long long x,long long f)
{
    for (;x<=n;x+=x&(-x))
        t[x]+=(ll)f;
}
inline long long gs(long long x)
{
    long long ret=0;
    for (;x;x-=x&(-x)) ret+=t[x];
    return ret;
}
int main()
{
	int kas=0;
    while (scanf("%lld",&n)!=EOF)
    {
    	printf("Case #%d:\n",++kas); 
    	memset(t,0,sizeof t);
	    for (long long i=1;i<=n;++i) scanf("%lld",&a[i]),f[i]=i;
	    f[n+1]=n+1;
	    for (long long i=1;i<=n;++i) add(i,a[i]);
	    scanf("%lld",&q);
	    for (long long zz=1;zz<=q;++zz)
	    {
	        scanf("%lld",&op);
	        if (op==0)
	        {
	            scanf("%lld%lld",&l,&r);
	            if (l>r) swap(l,r);
	            long long i=l;
	            while (i<=r)
	            {
	                i=gf(f[i]);
	                if (i>r) break;
	                long long tmp=a[i];
	                a[i]=(long long)sqrt(a[i]);
	                add(i,a[i]-tmp);
	                if (a[i]==1) f[i]=f[i]+1;
	                gf(f[i]);
	                i++;
	            }
	        }
	        else
	        {
	            scanf("%lld%lld",&l,&r);
	            if (l>r) swap(l,r);
	            printf("%lld\n",gs(r)-gs(l-1));
	        }
	    }
    	printf("\n");
	}
}

  

转载于:https://www.cnblogs.com/SfailSth/p/6360294.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值