• loj 6277 6280 数列分块入门 #1 #4


    题解:分块。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=50005;
    int w[maxn],sum[maxn],block;
    int main()
    {
      int k,i,n,l,r,c,op,pre,end;
      scanf("%d",&n);
      block=sqrt(n);
      for(i=1;i<=n;i++) scanf("%d",&w[i]);
      for(i=0;i<n;i++)
      {
        scanf("%d%d%d%d",&op,&l,&r,&c);
        if(op==0)
        {
          pre=((l-1)/block+1);
          end=((r-1)/block+1);
          if(pre==end)  for(k=l;k<=r;k++) w[k]+=c;
          else
          {
           for(k=l;k<=min(pre*block,n);k++) w[k]+=c;
           for(k=(end-1)*block+1;k<=r;k++) w[k]+=c;
           for(k=pre+1;k<end;k++) sum[k]+=c;
          }
        }
        else printf("%d
    ",w[r]+sum[((r-1)/block+1)]);
      }
      system("pause");
      return 0;
    }

     题解:分块。

     代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=100005;
    int n,block;
    long long sum[maxn],b[maxn],w[maxn];
    int get(int x);
    void update(int l,int r,int c);
    long long check(int l,int r,int c);
    int main()
    {
      int i,op,l,r,c;
      scanf("%d",&n);
      block=sqrt(n);
      for(i=1;i<=n;i++) 
      {
        scanf("%lld",&w[i]);
        sum[get(i)]+=w[i];
      }
      for(i=0;i<n;i++)
       {
         scanf("%d%d%d%d",&op,&l,&r,&c);
         if(op==0) update(l,r,c);
         else printf("%lld
    ",check(l,r,c));
       }
      system("pause");
      return 0;
    }
    int get(int x)
    {return (x-1)/block+1;}
    void update(int l,int r,int c)
    {
      int pre,end,k;
      pre=get(l);end=get(r);
      if(pre==end) 
       {
         for(k=l;k<=r;k++) 
           w[k]+=c,sum[get(k)]+=c;
       }
      else
       {
         for(k=l;k<=min(pre*block,n);k++) w[k]+=c,sum[get(k)]+=c;
         for(k=(end-1)*block+1;k<=r;k++) w[k]+=c,sum[get(k)]+=c;
         for(k=pre+1;k<end;k++) b[k]+=c;
       }
    }
    long long check(int l,int r,int c)
    {
      long long ans=0;
      int pre,end,k,x;
      pre=get(l);end=get(r);
      if(pre==end) 
       { 
         for(k=l;k<=r;k++) 
           ans=(ans+w[k]+b[pre])%(c+1);
       }
      else
       {
         for(k=l;k<=min(pre*block,n);k++) ans=(ans+w[k]+b[get(k)])%(c+1);
         for(k=(end-1)*block+1;k<=r;k++) ans=(ans+w[k]+b[get(k)])%(c+1);
         for(k=pre+1;k<end;k++) ans=(ans+sum[k]+b[k]*block)%(c+1);
       }
      return ans%(c+1);
    }
    本博客仅为本人学习,总结,归纳,交流所用,若文章中存在错误或有不当之处,十分抱歉,劳烦指出,不胜感激!!!
  • 相关阅读:
    夜神模拟器+seleinm抓取手机app(参考资料集合)
    关于pycharm导入其他项目时出现找不到python无法运行的问题
    关于动态规划的一点研究
    numpy里的randn
    关于pandas里面的合并
    笛卡尔乘积的解释
    Python链表与反链表
    年度总结一下
    Docker的使用初探(一):常用指令说明
    Java开发学习心得(三):项目结构
  • 原文地址:https://www.cnblogs.com/VividBinGo/p/11302687.html
Copyright © 2020-2023  润新知