ST

来源:互联网 发布:安卓限制软件联网 编辑:程序博客网 时间:2024/04/27 09:39

题目链接

ST

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述

“麻雀”lengdan用随机数生成了后台数据,但是笨笨的他被妹纸的问题给难住了。。。

已知lengdan生成了N(1=<N<=10005)个随机整数,妹子对这些数可能有以下几种操作或询问:

1,A a b c 表示给区间a到b内每个数都加上c;

2,S a b  表示输出区间a到b内的和;

3,Q a b 表示区间a到b内的奇数的个数;

为了使妹纸不口渴,所以我们决定妹纸的询问次数少一点,即(1=<M<=10000,M为询问次数)。

唉,你说妹纸一直进行操作1该多好啊,嘎嘎。。。

好水!喝饱了~~~

输入
多组测试数据。
每组测试数据第一行包含两个数N,M,表示N个整数,执行M次询问或操作。
紧接着一行输入N个整数,输入数据保证在int范围内。
接下来M行,每行输入一种操作。
输出
每次对于操作2和3,输出结果。
样例输入
5 51 2 3 4 5Q 1 4S 1 5A 1 4 1S 1 5Q 2 5
样例输出
215193
提示
数据出水,请忽略时限!

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;/*********************************************************************/typedef long long ll;const ll maxn=10010;ll N,M,x,y,z;char op[5];/*********************************************************************/ll sum[maxn<<2],col[maxn<<2],prime[maxn<<2];void pushup(ll rt) {    sum[rt]=sum[rt<<1]+sum[rt<<1|1];    prime[rt]=prime[rt<<1]+prime[rt<<1|1];}/*********************************************************************/void pushdown(ll rt,ll num) {    if(col[rt]) {        col[rt<<1]+=col[rt];        col[rt<<1|1]+=col[rt];        sum[rt<<1]+=col[rt]*(num-(num>>1));        sum[rt<<1|1]+=col[rt]*(num>>1);        if(col[rt]&1) {            prime[rt<<1]=(num-(num>>1))-prime[rt<<1];            prime[rt<<1|1]=(num>>1)-prime[rt<<1|1];        }        col[rt]=0;    }}/*********************************************************************/void build(ll l,ll r,ll rt) {    col[rt]=0;    prime[rt]=0;    if(l==r) {        scanf("%lld",&sum[rt]);        if(sum[rt]&1) {            prime[rt]=1;        }        return;    }    ll mid=(l+r)>>1;    build(l,mid,rt<<1);    build(mid+1,r,rt<<1|1);    pushup(rt);}/*********************************************************************/void update(ll L,ll R,ll add,ll l,ll r,ll rt) {    if(L<=l&&r<=R) {        col[rt]+=add;        sum[rt]+=(r-l+1)*add;        if(add&1) {            prime[rt]=r-l+1-prime[rt];        }        return;    }    pushdown(rt,r-l+1);    ll mid=(l+r)>>1;    if(L<=mid) {        update(L,R,add,l,mid,rt<<1);    }    if(R>mid) {        update(L,R,add,mid+1,r,rt<<1|1);    }    pushup(rt);}/****************************用于计算和*****************************************/ll query(ll L,ll R,ll l,ll r,ll rt) {    if(L<=l&&r<=R) {        return sum[rt];    }    pushdown(rt,r-l+1);    ll mid=(l+r)>>1;    ll ret=0;    if(L<=mid) {        ret+=query(L,R,l,mid,rt<<1);    }    if(R>mid) {        ret+=query(L,R,mid+1,r,rt<<1|1);    }    return ret;}/******************************用于计算奇偶***************************************/ll queryprime(ll L,ll R,ll l,ll r,ll rt) {    if(L<=l&&r<=R) {        return prime[rt];    }    pushdown(rt,r-l+1);    ll mid=(l+r)>>1;    ll ret=0;    if(L<=mid) {        ret+=queryprime(L,R,l,mid,rt<<1);    }    if(R>mid) {        ret+=queryprime(L,R,mid+1,r,rt<<1|1);    }    return ret;}/*********************************************************************/int main() {    //freopen("D://imput.txt","r",stdin);    while(~scanf("%lld%lld",&N,&M)) {        build(1,N,1);        while(M--) {            scanf("%s",op);            if(op[0]=='Q') {                scanf("%lld%lld",&x,&y);                printf("%lld\n",queryprime(x,y,1,N,1));            } else if(op[0]=='S') {                scanf("%lld%lld",&x,&y);                printf("%lld\n",query(x,y,1,N,1));            } else {                scanf("%lld%lld%lld",&x,&y,&z);                update(x,y,z,1,N,1);            }        }    }    return 0;}/*********************************************************************/


0 0
原创粉丝点击