0分树状数组求助
查看原帖
0分树状数组求助
176843
LiveZoom楼主2021/8/8 17:48

样例过了,提交全WA

#include <cstdio>

const int N = 1e5 + 5;
const int kMax = 1e5;

typedef long long LL;

int n, m, a[N], exi[N];
int x, y;
char c;

class BIT {
  public:
    BIT () {}
    ~BIT () {}
    
    void upd (int x, int v) {
      for ( ; x <= kMax; x += x & -x)
        c[x] += v;
    }
    LL qry (int x) {
      LL rs = 0;;
      for ( ; x; x -= x & -x)
        rs += c[x];
      return rs;
    }
    
  private:
    int c[N];
} GF, cnt ;

int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
    exi[i] = 1;
    GF.upd(i, a[i]), 
    cnt.upd(i, 1);
  }
  getchar();
  for (int i = 1; i <= m; ++i) {
    scanf("%c", &c);
    if (c == 'C') {
      scanf("%d%d", &x, &y);
      GF.upd(x, -y);
    }
    else if (c == 'I') {
      scanf("%d%d", &x, &y);
      GF.upd(x, y - a[x]), a[x] = y;
      if (!exi[x]) {
        cnt.upd(x, 1), exi[x] = 1;
      }
    }
    else if (c == 'D') {
      scanf("%d", &x);
      int L = x - 1, R = kMax + 1;
      while (L + 1 < R) {
        int mid = (L + R) >> 1;
//        printf("****%d %d %d\n", L, R, mid);
        if (cnt.qry(mid) <= x) L = mid;
        else R = mid;
      }
      GF.upd(L, -a[L]), a[L] = 0;
      cnt.upd(L, -1), exi[L] = 0;
    }
    else {
      printf("%lld\n", GF.qry(kMax));
    }
    getchar();
  }
  return 0;
}
2021/8/8 17:48
加载中...