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

    数据最大就2^31次方,通过计算这些数开方五次就变成1了,然后把继续开方也不会变了,所以对于每个块,前5次更新暴力,之后就可以直接跳过,查询就直接就可以了

    #include<map>
    #include<set>
    #include<ctime>
    #include<cmath>
    #include<stack>
    #include<queue>
    #include<string>
    #include<vector>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define first fi
    #define second se
    #define lowbit(x) (x & (-x))
    
    typedef unsigned long long int ull;
    typedef long long int ll;
    const double pi = 4.0*atan(1.0);
    const int inf = 0x3f3f3f3f;
    const int maxn = 50005;
    const int maxm = 100000;
    const int mod = 998244353;
    using namespace std;
    
    int n, m, tol, T;
    int block;
    int a[maxn];
    int b[maxn];
    int c[maxn];
    int belong[maxn];
    
    void init() {
        memset(a, 0, sizeof a);
        memset(b, 0, sizeof b);
        memset(c, 0, sizeof c);
        memset(belong, 0, sizeof belong);
    }
    
    int L(int x) {
        return (x-1) * block + 1;
    }
    
    int R(int x) {
        return min(n, x*block);
    }
    
    void update(int l, int r) {
        for(int i=l; i<=min(r, R(belong[l])); i++) {
            b[belong[i]] -= a[i];
            a[i] = sqrt(a[i]);
            b[belong[i]] += a[i];
        }
        if(belong[l] == belong[r])    return ;
        if(belong[l] != belong[r]) {
            for(int i=L(belong[r]); i<=r; i++) {
                b[belong[i]] -= a[i];
                a[i] = sqrt(a[i]);
                b[belong[i]] += a[i];
            }        
        }
        for(int i=belong[l]+1; i<belong[r]; i++) {
            if(c[i] == 6)    continue;
            for(int j=L(i); j<=R(i); j++) {
                b[i] -= a[j];
                a[j] = sqrt(a[j]);
                b[i] += a[j];
            }
            c[i]++ ;
        }
    }
    
    int query(int l, int r) {
        int ans = 0;
        for(int i=l; i<=min(r, R(belong[l])); i++)    ans += a[i];
        if(belong[l] == belong[r])    return ans;
        if(belong[l] != belong[r]) {
            for(int i=L(belong[r]); i<=r; i++) {
                ans += a[i];
            }
        }
        for(int i=belong[l]+1; i<belong[r]; i++)    ans += b[i];
        return ans;
    }
    
    int main() {
        while(~scanf("%d", &n)) {
            block = sqrt(n);
            for(int i=1; i<=n; i++) {
                scanf("%d", &a[i]);
                belong[i] = (i-1) / block + 1;
                b[belong[i]] += a[i];
            }
            m = n;
            while(m--) {
                int op, l, r, c;
                scanf("%d%d%d%d", &op, &l, &r, &c);
                if(op == 0) {
                    update(l, r);
                } else {
                    int ans = query(l, r);
                    printf("%d
    ", ans);
                }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    BDOC ROUTER
    web dom api中的Selection和Range
    基于第三方vuejs库组件做适配性个性开发
    香草js侦测元素是否离开视窗viewport
    xampp windows10下xdebug调试环境安装及配置
    beyond compare全文件夹比较,仅显示变化的文件
    给定制的vuejs组件添加v-model双向绑定支持
    javascript工厂函数(factory function)vs构造函数(constructor function)
    edrawmax使用技巧备忘
    babel plugin和presets是什么,怎么用?
  • 原文地址:https://www.cnblogs.com/Jiaaaaaaaqi/p/9373854.html
Copyright © 2011-2022 走看看