UVALive 6139 Interval Product(樹狀數組)

題目諒解:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34987

題意:C x  y:   a[x]=y;   P l  r :  輸出這段區間的數連乘是正(‘+’)、負(‘-’)還是0(‘0’)。

題解:開兩個樹狀數組,一個維護負數的個數,一個維護0的個數。

//#pragma comment(linker, "/STACK:102400000,102400000")
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int maxn=1e5+5;

int a[maxn],b[maxn],c[maxn];
int n,k;

void add(int i,int v,int * a) {
    while(i<=n) {
        a[i]+=v;
        i+=i&-i;
    }
}

int sum(int i,int *a) {
    int res=0;
    while(i>0) {
        res+=a[i];
        i-=i&-i;
    }
    return res;
}

int main() {
#ifdef ONLINE_JUDGE
#else
    freopen("test.in", "r", stdin);
#endif
    while(~scanf("%d%d",&n,&k)) {
        memset(b,0,sizeof(b));
        memset(a,0,sizeof(a));
        int x,y;
        for(int i=1; i<=n; i++) {
            scanf("%d",&x);
            if(x<0)  add(i,1,a);
            if(x==0) add(i,1,b);
            c[i]=x;
        }
        char s[5];
        for(int i=0; i<k; i++) {
            scanf("%s%d%d",s,&x,&y);
            if(s[0]=='C') {
                if(y==0) {
                    if(c[x]==0)continue;
                    add(x,1,b);
                    if(c[x]<0)add(x,-1,a);
                    c[x]=y;
                    continue;
                } else {
                    if(c[x]==0)      add(x,-1,b);
                    if(y<0&&c[x]>=0) add(x,1,a);
                    if(y>0&&c[x]<0)  add(x,-1,a);
                    c[x]=y;
                }
            } else {
                int has_0=sum(y,b)-sum(x-1,b);
                char c;
                if(has_0) c='0';
                else {
                    int num=sum(y,a)-sum(x-1,a);
                    c=num&1?'-':'+';
                }
                putchar(c);
            }
        }
        putchar(10);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章