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

    区间开方,求和。

    分析性质可发现sqrt(0)= 0,sqrt(1) = 1,所以记录每块是否已不能改变。

    区分l与r啊。。错了这么个关键字母可不爆零了么。。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 typedef long long ll;
     8 
     9 ll bl[50050],fns[250],v[50050],sum[250];
    10 ll n,blo,c,l,r,opt;
    11 
    12 void check(ll x){
    13     for(register int i = (x-1)*blo+1;i <= min(n,x*blo);i++)
    14         if(v[i]^0&&v[i]^1)return;
    15     fns[x] = 1;
    16 }
    17 
    18 void change(ll l,ll r){
    19     ll x,flag;
    20     if(bl[l] == bl[r]){
    21         flag = true;
    22         for(register int i = l;i <= r;i++)if(v[i] > 1){
    23             x = sqrt(v[i]);
    24             sum[bl[l]] -= v[i]-x;
    25             v[i] = x;
    26             if(x > 1)flag = false;
    27         } if(flag)check(bl[l]); return;
    28     }
    29     if(!fns[bl[l]]){
    30         flag = true;
    31         for(register int i = l;i <= bl[l]*blo;i++)if(v[i] > 1){
    32             x = sqrt(v[i]);
    33             sum[bl[l]] -= v[i]-x;
    34             v[i] = x;
    35             if(x > 1)flag = false;
    36         } if(flag)check(bl[l]);
    37     }
    38     if(!fns[bl[r]]){
    39         flag = true;
    40         for(register int i = (bl[r]-1)*blo+1;i <= r;i++)if(v[i] > 1){
    41             x = sqrt(v[i]);
    42             sum[bl[r]] -= v[i]-x;
    43             v[i] = x;
    44             if(x > 1)flag = false;
    45         } if(flag)check(bl[r]);
    46     }
    47     for(register int i = bl[l]+1;i < bl[r];i++)if(!fns[i]){
    48         flag = true;
    49         for(register int j = (i-1)*blo+1;j <= min(n,i*blo);j++)if(v[j] > 1){
    50             x = sqrt(v[j]);
    51             sum[i] -= v[j]-x;
    52             v[j] = x;
    53             if(x > 1)flag = false;
    54         } if(flag)check(i);
    55     }
    56 }
    57 
    58 ll query(ll l,ll r){
    59     ll ans = 0;
    60     if(bl[l] == bl[r]){
    61         for(register int i = l;i <= r;i++)ans += v[i];
    62         return ans;
    63     }
    64     for(register int i = l;i <= bl[l]*blo;i++)ans += v[i];
    65     for(register int i = (bl[r]-1)*blo+1;i <= r;i++)ans += v[i];
    66     for(register int i = bl[l]+1;i < bl[r];i++)ans += sum[i];
    67     return ans;
    68 }
    69 
    70 int main(){
    71     scanf("%lld",&n); blo = sqrt(n);
    72     for(register int i = 1;i <= n;i++){
    73         scanf("%lld",&v[i]);
    74         bl[i] = (i-1)/blo+1;
    75         sum[bl[i]] += v[i];
    76     }
    77     for(register int i = 1;i <= bl[n];i++)check(i);
    78     for(register int i = 1;i <= n;i++){
    79         scanf("%lld%lld%lld%lld",&opt,&l,&r,&c);
    80         switch(opt){
    81             case 0:change(l,r);break;
    82             case 1:printf("%lld
    ",query(l,r));break;
    83         }
    84     }    
    85 return 0;
    86 }
  • 相关阅读:
    Unix命令大全
    vs2008 与 IE8出现的兼容性问题
    Java 创建文件、文件夹以及临时文件
    如何修改Wamp中mysql默认空密码
    PAT 乙级真题 1003.数素数
    Tags support in htmlText flash as3
    DelphiXE4 FireMonkey 试玩记录,开发IOS应用 还是移植
    10 Great iphone App Review sites to Promote your Apps!
    HTML tags in textfield
    Delphi XE4 IOS 开发, "No eligible applications were found“
  • 原文地址:https://www.cnblogs.com/Wangsheng5/p/11785152.html
Copyright © 2011-2022 走看看