CCF认证2017-9 除法

来源:互联网 发布:安卓淘宝引流量软件 编辑:程序博客网 时间:2024/06/03 20:10

题目链接:http://118.190.20.162/view.page?gpid=T59

用树状数组模板做,一开始只有50分,超时

突发奇想做了些优化,意外的100分了!这数据真的。。(感觉自己是碰巧卡过去了)

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#include<map>#include<set>#include<string>#include<stack>using namespace std;typedef long long ll;const int N=100000+10;ll a[N];int b[N];int n,m;int lowbit(int x){    return x & (-x);}void modify(int x,int add)//一维{    while(x<=n)    {        a[x]+=add;        x+=lowbit(x);    }}ll get_sum(int x){    ll ret=0;    while(x!=0)    {        ret+=a[x];        x-=lowbit(x);    }    return ret;}int main(){    //freopen("/home/zlwang/Desktop/t2.txt","r",stdin);    while(~scanf("%d%d",&n,&m))    {        int v;        memset(a,0,sizeof(a));        for(int i=1;i<=n;i++)        {            scanf("%d",&b[i]);            modify(i,b[i]);        }        int l,r,c;        for(int i=0;i<m;i++)        {            scanf("%d",&c);            if(c==1)            {                scanf("%d%d%d",&l,&r,&v); //本来50分                if(v==1) continue; //先加此行代码80分                for(int j=l;j<=r;j++)                if(b[j]>=v&&b[j]%v==0) //b[j]>=v ,再加这里满分                {                    modify(j,b[j]/v-b[j]);                    b[j]/=v;                }            }            else if(c==2)            {                scanf("%d%d",&l,&r);                printf("%lld\n",get_sum(r)-get_sum(l-1));            }        }    }    return 0;}


原创粉丝点击