A

来源:互联网 发布:别克车钥匙淘宝图片 编辑:程序博客网 时间:2024/05/16 06:38

题意:略

思路:




错误代码:

#include <iostream>

#include <iomanip>
#include <cstring>
#include <cstdio>
#include <map>
  


using namespace std;
int shu[10001];
int main()
{
     int n,m,l,r,mo,sum=0;
     int t;
     //char c;    //输入问题,用字符串然后取第一个
     string c;
     scanf("%d %d",&n,&m);


     for(int i=0;i<n;i++)
        scanf("%d",&shu[i]);


        scanf("%d",&t);


        for(int i=0;i<t;i++)
        {
            //scanf("%c",&c);
            cin>>c;
            if(c[0]=='s')
            {
           // scanf("%d%c%d%c%d",&l,&c,&r,&c,&mo);
                cin>>l>>r>>mo;
                for(int p=l-1;p<r;p++)
                {
                    if(shu[p]%m==mo)
                        sum+=shu[p];
                }
            
                cout<<sum<<endl;
            }
            else if(c[0]=='+')
            {
                //scanf("%d%c%d",&l,&c,&r);
               cin>>l>>r;
                cout<<shu[l-1]+r<<endl;;
            }
            else if(c[0]=='-')
            {
                //scanf("%d%c%d",&l,&c,&r);
               cin>>l>>r;
               if(shu[l-1]-r<0)
                cout<<shu[l-1]<<endl;
               else
                cout<<shu[l-1]-r<<endl;
            }


        }
        return 0;




}

AC 代码(应用树状数组):

#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdio>
#include <map>


using namespace std;
int   n,m;
const int maxx=100005;
long long  ar[maxx];
long long  bit[maxx*2][15];
int lowbit(int x)
{
    return x&(-x);
}
void add(long long  x,long long  d,long long  mod)
{
     while(x<=n)
     {
        bit[x][mod]+=d;
        x+=lowbit(x);
     }
}
   
long long sum(int x,long long  mod)//求取余后序号等于所给数字的数字的和
{
    long long tmp=0;
    while(x>0)
    {
        tmp+=bit[x][mod];
        x-=lowbit(x);
    }
    return tmp;
}


int main()
{
    int   l,r,mod,t;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&ar[i]);
        add(i,ar[i],ar[i]%m);
    }
    scanf("%d",&t);
    while(t--)
    {
        getchar();
        char f;
     scanf("%c",&f);
        if(f=='+')
        {
            cin>>l>>r;
            add(l,-ar[l],ar[l]%m);//该函数作用是替换,所以如果直接add(l,r,ar[l]%m);那就是直接把原来的数改成r而不是加上r了!!!!!!!
            ar[l]+=r;
            add(l,ar[l],ar[l]%m);
            cout<<ar[l]<<endl;


        }
         else if(f=='-')


        {
            cin>>l>>r;
           
            add(l,-ar[l],ar[l]%m);
            if(ar[l]-r>=0)
                ar[l]-=r;
          add(l,ar[l],ar[l]%m);
            cout<<ar[l]<<endl;


        }
         else if(f=='s')
        {
            cin>>l>>r>>mod;


            cout<<sum(r,mod)-sum(l-1,mod)<<endl;
        }
    }
  


}


原创粉丝点击