• 洛谷P3372 【模板】线段树 1 分块


     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 
     5 #define ll long long
     6 
     7 using namespace std;
     8 
     9 ll c[100005];
    10 ll addv[320];
    11 ll sum[320];
    12 int n,m,g,p=1,ks=1;  //g每块大小 p临时指针 ks块数 
    13 int f,x,y,pl,pr;  //pl左指针 pr右指针 
    14 ll k,ans;
    15 
    16 int main(){
    17     scanf("%d%d",&n,&m);
    18     for(int i=1;i<=n;i++)scanf("%lld",&c[i]);
    19     memset(addv,0,sizeof(addv));
    20     g=sqrt(n);
    21     for(int i=1;i<=n;i++){
    22         if(p>g){
    23             p=1;
    24             ks++;
    25         }
    26         sum[ks]+=c[i];
    27         p++;
    28     }
    29     for(int i=1;i<=m;i++){
    30         scanf("%d",&f);
    31         if(f==1){
    32             scanf("%d%d%lld",&x,&y,&k);
    33             if(x%g)pl=(x/g)+1;else pl=x/g;
    34             if(y%g)pr=(y/g)+1;else pr=y/g;
    35             if(x!=(pl-1)*g+1){
    36                 while(x<=pl*g){
    37                     c[x]+=k;
    38                     sum[pl]+=k;
    39                     x++;
    40                 }
    41                 pl++;
    42             }
    43             if(y!=pr*g){
    44                 while(y>(pr-1)*g){
    45                     c[y]+=k;
    46                     sum[pr]+=k;
    47                     y--;
    48                 }
    49                 pr--;
    50             }
    51             for(int j=pl;j<=pr;j++){
    52                 addv[j]+=k;
    53                 sum[j]+=k*g;
    54             }
    55         }
    56         else{
    57             scanf("%d%d",&x,&y);
    58             if(x%g)pl=(x/g)+1;else pl=x/g;
    59             if(y%g)pr=(y/g)+1;else pr=y/g;
    60             ans=0;
    61             if(x!=(pl-1)*g+1){
    62                 while(x<=pl*g){
    63                     ans+=c[x]+addv[pl];
    64                     x++;
    65                 }
    66                 pl++;
    67             }
    68             if(y!=pr*g){
    69                 while(y>(pr-1)*g){
    70                     ans+=c[y]+addv[pr];
    71                     y--;
    72                 }
    73                 pr--;
    74             }
    75             for(int j=pl;j<=pr;j++)ans+=sum[j];
    76             printf("%lld
    ",ans);
    77         }
    78     }
    79     
    80     return 0;
    81 }
  • 相关阅读:
    CTF-域渗透--SSH服务
    CTF-域渗透--SMB信息泄露
    CTF-域渗透--FTP服务后门利用
    Codeforces Round #628 (Div. 2)
    模板
    模板
    Educational Codeforces Round 6
    Educational Codeforces Round 5
    模板
    Codeforces Round #627 (Div. 3)
  • 原文地址:https://www.cnblogs.com/running-coder-wfh/p/11336787.html
Copyright © 2020-2023  润新知