zoukankan      html  css  js  c++  java
  • LOJ-数列分块入门5

    链接:

    https://loj.ac/problem/6281

    题意:

    给出一个长为 的数列 ,以及 n个操作,操作涉及区间开方,区间求和。

    思路:

    考虑开方5次之后就为1, 即考虑一整个区间的开方次数,对小于5次的区间暴力开方,否则就不管他.

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    //#include <memory.h>
    #include <queue>
    #include <set>
    #include <map>
    #include <algorithm>
    #include <math.h>
    #include <stack>
    #include <string>
    #include <assert.h>
    #include <iomanip>
    #define MINF 0x3f3f3f3f
    using namespace std;
    typedef long long LL;
    const int MAXN = 1e5+10;
    
    LL a[MAXN], Tag[MAXN], Sum[MAXN];
    LL Belong[MAXN];
    int n, part;
    
    void Update(LL l, LL r, LL c)
    {
        if (Tag[Belong[l]] < 5)
            for (int i = l;i <= min(Belong[l]*part, r);i++)
            {
                Sum[Belong[i]] -= a[i];
                a[i] = sqrt(a[i]);
                Sum[Belong[i]] += a[i];
            }
        if (Belong[l] != Belong[r])
        {
            if (Tag[Belong[r]] < 5)
                for (int i = max((Belong[r]-1)*part+1, l);i <= r;i++)
                {
                    Sum[Belong[i]] -= a[i];
                    a[i] = sqrt(a[i]);
                    Sum[Belong[i]] += a[i];
                }
        }
        for (int i = Belong[l]+1;i <= Belong[r]-1;i++)
        {
            if (Tag[i] < 5)
            {
                Tag[i]++;
                for (int j = (i-1)*part+1;j <= i*part;j++)
                {
                    Sum[i] -= a[j];
                    a[j] = sqrt(a[j]);
                    Sum[i] += a[j];
                }
            }
        }
    }
    
    LL Query(LL l, LL r, LL c)
    {
        LL res = 0;
        for (int i = l;i <= min(Belong[l]*part, r);i++)
            res += a[i];
        if (Belong[l] != Belong[r])
        {
            for (int i = max((Belong[r]-1)*part+1, l);i <= r;i++)
                res += a[i];
        }
        for (int i = Belong[l]+1;i <= Belong[r]-1;i++)
            res += Sum[i];
        return res;
    }
    
    int main()
    {
        scanf("%d", &n);
        part = sqrt(n);
        for (int i = 1;i <= n;i++)
        {
            scanf("%lld", &a[i]);
            Belong[i] = (i-1)/part + 1;
            Sum[Belong[i]] += a[i];
        }
        int op, l, r, c;
        for (int i = 1;i <= n;i++)
        {
            scanf("%d", &op);
            if (op == 0)
            {
                scanf("%d%d%d", &l, &r, &c);
                Update(l, r, c);
            }
            else
            {
                scanf("%d%d%d", &l, &r, &c);
                printf("%lld
    ", Query(l, r, c));
            }
        }
    
        return 0;
    }
    
  • 相关阅读:
    mysql 安全
    选择年份 php的写法要比js简洁一些
    PHP for 循环
    vb和php 基于socket通信
    PHP 数组和字符串互相转换实现方法
    php中对2个数组相加的函数
    开启mysql sql追踪
    幸运码
    系统管理模块_岗位管理_改进_使用ModelDroven方案_套用美工写好的页面效果_添加功能与修改功能使用同一个页面
    系统管理模块_岗位管理_实现CRUD功能的具体步骤并设计Role实体
  • 原文地址:https://www.cnblogs.com/YDDDD/p/11431954.html
Copyright © 2011-2022 走看看