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

    链接:

    https://loj.ac/problem/6281

    思路:

    因为是向下取整开方,那么其实每个数最多被开个个几次就会变成0或者1了,更新的时候我们可以将中间的块标记下是否全部变成了0或者1,如果全变了就不处理

    实现代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int M = 1e5 + 10;
    vector<int>v[M];
    int a[M],block,n;
    int sum[M];
    int tag[M];
    int bl[M];
    void reset(int x){
        if(tag[x]) return;
        tag[x] = 1;
        sum[x] = 0;
        for(int i = (x-1)*block+1;i <= min(x*block,n);i ++){
            a[i] = sqrt(a[i]);
            sum[x] += a[i];
            if(a[i] > 1) tag[x] = 0;
        }
    }
    
    void update(int l,int r){
        for(int i = l;i <= min(bl[l]*block,r);i ++){
            sum[bl[l]] -= a[i];
            a[i] = sqrt(a[i]);
            sum[bl[l]] += a[i];
        }
        if(bl[l] != bl[r]){
            for(int i = (bl[r]-1)*block+1;i <= r;i ++){
                sum[bl[r]] -= a[i];
                a[i] = sqrt(a[i]);
                sum[bl[r]] += a[i];
            }
        }
        for(int i = bl[l] + 1;i <= bl[r] - 1;i ++){
            reset(i);
        }
    }
    
    int query(int l,int r){
        int ans = 0;
        for(int i = l;i <= min(bl[l]*block,r);i ++)
            ans += a[i];
        if(bl[l] != bl[r]){
            for(int i = (bl[r]-1)*block+1;i <= r;i ++)
                ans += a[i];
        }
        for(int i = bl[l] + 1;i <= bl[r]-1;i ++)
            ans += sum[i];
        return ans;
    }
    
    int main()
    {
        int l,r,opt,c;
        scanf("%d",&n);
        block = sqrt(n);
        for(int i = 1;i <= n;i ++){
            scanf("%d",&a[i]);
        }
        for(int i = 1;i <= n;i ++){
            bl[i]  = (i - 1)/block + 1;
            sum[bl[i]] += a[i];
        }
        for(int i = 1;i <= n;i ++){
            scanf("%d%d%d%d",&opt,&l,&r,&c);
            if(opt == 0) update(l,r);
            else printf("%d
    ",query(l,r));
        }
        return 0;
    }
  • 相关阅读:
    ssdb使用笔记
    跟我学爬虫-2-使用正则表达式解析文本
    跟我学爬虫-1-爬虫简介
    python int函数转换浮点型字符串的坑???
    python使用smtplib和email发送腾讯企业邮箱邮件
    php文件之间传值的三种主流并且常用的方式
    验证码的输入框与图片不能对齐问题
    web前端命名规范
    css盒子模型
    css基础
  • 原文地址:https://www.cnblogs.com/kls123/p/9372893.html
Copyright © 2011-2022 走看看