标签:
题意:
给n个数字的序列,C v p 把v位上的数字置成p , S l r代表求区间[l,r]各数字相乘得数的符号,对于每个S输出所得符号(’+‘,’-‘,’0‘)
分析:
开两个数组表示区间负数的个数、0的个数、当数字被改时,更新数组、查询时区间含0符号是0,再根据负数的个数的奇偶判断。
#include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <string> #include <cctype> #include <complex> #include <cassert> #include <utility> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; typedef pair<int,int> PII; typedef long long ll; #define lson l,m,rt<<1 #define pi acos(-1.0) #define rson m+1,r,rt<<11 #define All 1,N,1 #define read freopen("in.txt", "r", stdin) #define N 100010 const ll INFll = 0x3f3f3f3f3f3f3f3fLL; const int INF= 0x7ffffff; const int mod = 1000000007; int zero[N],neg[N],n,m,a[N]; int sumn(int x){ int num=0; while(x>0){ num+=neg[x]; x-=(x&(-x)); } return num; } int sumz(int x){ int num=0; while(x>0){ num+=zero[x]; x-=(x&(-x)); } return num; } void add_init(int x){ if(a[x]<=0){ int tmp=a[x]; while(x<=n){ if(tmp==0) zero[x]+=1; else neg[x]+=1; x+=(x&(-x)); } } } void add(int x,int d){ int tmp; if(a[x]>0){ a[x]=d; if(d<=0){ while(x<=n){ if(d<0) neg[x]+=1; else zero[x]+=1; x+=(x&(-x)); } } } else if(a[x]==0){ a[x]=d; if(d!=0){ while(x<=n){ zero[x]-=1; if(d<0)neg[x]+=1; x+=(x&(-x)); } } } else{ a[x]=d; if(d>=0){ while(x<=n){ neg[x]-=1; if(d==0)zero[x]+=1; x+=(x&(-x)); } } } } int main() { char op[3]; string s; while(~scanf("%d%d",&n,&m)){ s=""; memset(neg,0,sizeof(neg)); memset(zero,0,sizeof(zero)); int b; for(int i=1;i<=n;++i){ scanf("%d",&a[i]); add_init(i); } /*for(int i=1;i<=n;++i) cout<<sumn(i)<<" "<<sumz(i)<<endl;*/ int p,v; while(m--){ scanf("%s%d%d",op,&p,&v); if(op[0]==‘C‘){ add(p,v); } else{ int tmp1=sumn(v)-sumn(p-1); int tmp2=sumz(v)-sumz(p-1); if(tmp2>0) s+=‘0‘; else{ if(tmp1%2) s+=‘-‘; else s+=‘+‘; } } } cout<<s<<endl; } return 0; }
UVA 12532-Interval Product(BIT)
标签:
原文地址:http://www.cnblogs.com/zsf123/p/4719118.html