设为首页 加入收藏

TOP

uva 1406 - A Sequence of Numbers(树状数组)
2015-07-20 17:48:08 来源: 作者: 【 】 浏览:3
Tags:uva 1406 Sequence Numbers

题目链接:uva 1406 - A Sequence of Numbers

题目大意;给定n个数,有两种操作:

  • Q x:计算与2x取且不为0的数的个数
  • C x:每个数加上x
    输出所有Q操作的和。

    解题思路:因为x最大为15,所以开16个树状数组,fenx[x]记录的是每个数取模2x+1的情况,然后有一个add值标记总共加了多少。根据add值确定原先数的范围。

    #include 
         
           #include 
          
            #include 
           
             using namespace std; #define lowbit(x) ((x)&(-x)) const int maxn = 1<<16; const int maxr = 16; int base[maxr+5], fenx[maxr+5][maxn+5]; int N, add; int query_treeArr (int* bit, int x) { int ret = 0; while (x) { ret += bit[x]; x -= lowbit(x); } return ret; } void insert_treeArr (int* bit, int x, int v) { while (x <= maxn) { bit[x] += v; x += lowbit(x); } } void init () { add = 0; for (int i = 0; i < maxr; i++) memset(fenx, 0, sizeof(fenx)); int x; for (int i = 0; i < N; i++) { scanf("%d", &x); for (int j = 1; j <= maxr; j++) { insert_treeArr(fenx[j-1], x % base[j] + 1, 1); } } } long long solve () { long long ret = 0; int x; char order[5]; while (scanf("%s", order) == 1 && strcmp(order, "E")) { scanf("%d", &x); if (order[0] == 'Q') { int have = add % base[x]; if (add & base[x]) { ret += query_treeArr(fenx[x], base[x] - have); ret += query_treeArr(fenx[x], base[x+1]) - query_treeArr(fenx[x], base[x+1] - have); } else ret += query_treeArr(fenx[x], base[x+1] - have) - query_treeArr(fenx[x], base[x] - have); } else add = (add + x) % base[16]; } return ret; } int main () { int cas = 1; base[0] = 1; for (int i = 1; i <= maxr; i++) base[i] = base[i-1] * 2; while (scanf("%d", &N) == 1 && N != -1) { init(); printf("Case %d: %lld\n", cas++, solve()); } return 0; }
           
          
         
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 4027 Can you answer these q.. 下一篇C++普通函数与模板函数以及特化函..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何利用Python做数 (2025-12-24 23:48:36)
·如何使用python进行 (2025-12-24 23:48:34)
·python 爬虫入门该怎 (2025-12-24 23:48:31)
·Java 实现多个大文件 (2025-12-24 23:22:00)
·Java多线程编程在工 (2025-12-24 23:21:56)