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
- ST
- ST
- ST
- 名词解释: ST SST *ST
- 1st
- 1st
- RMQ ^^^ st
- 1st
- ST测试
- st sdk
- ST算法
- ST算法
- ST超时
- st link
- RMQ-ST
- 2st
- 3st
- 4st
- 安卓快速解析xml工具类
- 马年生日(二)
- nedmalloc结构分析
- iOS 开源项目(三)
- 谁创造了百分百就业率
- ST
- 题目1366:栈的压入、弹出序列
- [CoffeeScript]图解C++、CoffeeScript 和 Ruby 的复杂度
- windows下获得DC句柄的几个方法
- 我在海上飘
- Android 判断某个APK是否已安装
- MinGW编译portaudio,win7
- Filter(过滤器)学习
- [CoffeeScript]以优美方式编写JavaScript代码