UVA1406 - A Sequence of Numbers(树状数组)

题目链接

题目大意:

给定N个数字。给两种操作:C x: 把这N个数字都加上x。

Q x:查询这N个数里面有多少个数字和2^x取且大于0.最后把每一个查询的结果求和作为答案。

解题思路:

查询与2^x取且为1,那么就意味这那个符合要求的数的第x位要是1。

可是这里还有所有加上x的操作,能够用一个变量来记录所有C操作的x的和。有这个加数的话,第x位为1的可能能够通过低位进位得到,所以这里开16个树状数组,第i个树状数组存放的是每一个数从低位開始。连续的i位的值。比如7:第0个树状数组就加上1, 第1个树状数组就加上3, 第2个树状数组就加上7...

接下来要分情况讨论:首先假设加数是1XXX 那么 1) 1xxx + 0xxx = 1xxx这是符合条件的。而1xxx的范围【1000,1111】 。 2) 1xxx + 1xxx = 11xxx 这是符合条件的,11xxx的范围【11000,11111】。

其次假设是 0xxx。也是分两种情况考虑,同理得到范围【1000,1111】.得到了最后符合条件的数,通过减去已知的加数。就能够求出符合查询要求的范围。

在通过树状数组统计一下这个范围内的数有多少个存在。

注意:推断某个位是否位1要用&,不要单纯的推断大小。

还有每一个加数在相应每次查询的时候记得要取模上2^(x + 1).由于仅仅有后面的x位是须要用的。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int M = 7e4;
const int N = 20; #define lowbit(x) ((x)&(-x))
typedef long long ll; int n;
int t[N], C[N][M]; void add (int k, int x, int v) { while (x < M) { C[k][x] += v;
x += lowbit(x);
}
} ll sum (int k, int x) { int ret = 0;
while(x > 0) { ret += C[k][x];
x -= lowbit(x);
}
return ret;
} void init () { t[0] = 1;
for (int i = 1; i < N; i++)
t[i] = t[i - 1] * 2;
} void handle (int num) { for (int i = N - 1; i >= 0; i--) { add(i, num + 1, 1);
if (num >= t[i])
num -= t[i];
}
} ll solve () { ll ans = 0;
int addnum = 0;
char str[10];
int x, l, r; while (scanf ("%s", str) && str[0] != 'E') { scanf ("%d", &x);
if (str[0] == 'C')
addnum = (addnum + x) % t[16];
else {
if (addnum & t[x]) { l = t[x + 1] + t[x] - addnum % t[x + 1];
r = min(t[x + 2] - 1 - addnum % t[x + 1], t[16] - 1);
ans += sum (x, r + 1) - sum (x, l);
} l = t[x] - addnum % t[x + 1];
r = t[x + 1] - 1 - addnum % t[x + 1];
ans += sum (x, r + 1) - sum (x, l);
// printf("%d %d %lld\n", min, max, ans);
}
}
return ans;
} int main () { init();
int cas = 0, num;
while (scanf ("%d", &n) && n != -1) { memset (C, 0, sizeof (C));
for (int i = 0; i < n; i++) {
scanf ("%d", &num);
handle(num);
}
printf ("Case %d: %lld\n", ++cas, solve());
}
return 0;
}

UVA1406 - A Sequence of Numbers(树状数组)的更多相关文章

  1. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  2. 树状数组 + 位运算 LA 4013 A Sequence of Numbers

    题目传送门 题意:n个数,两种操作,一是每个数字加x,二是查询& (1 << T) == 1 的个数 分析:因为累加是永远的,所以可以离线处理.树状数组点是c[16][M] 表示数 ...

  3. hdu 5147 Sequence II 树状数组

    Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Prob ...

  4. hdu 5147 Sequence II (树状数组 求逆序数)

    题目链接 Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. hdu6078 Wavel Sequence dp+二维树状数组

    //#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:h ...

  6. HDU 6078 Wavel Sequence 树状数组优化DP

    Wavel Sequence Problem Description Have you ever seen the wave? It's a wonderful view of nature. Lit ...

  7. “浪潮杯”第九届山东省ACM大学生程序设计竞赛(重现赛)E.sequence(树状数组求逆序对(划掉))

    传送门 E.sequence •题意 定义序列 p 中的 "good",只要 i 之前存在 pj < pi,那么,pi就是 "good": 求删除一个数, ...

  8. Codeforces 486E LIS of Sequence --树状数组求LIS

    题意: 一个序列可能有多个最长子序列,现在问每个元素是以下三个种类的哪一类: 1.不属于任何一个最长子序列 2.属于其中某些但不是全部最长子序列 3.属于全部最长子序列 解法: 我们先求出dp1[i] ...

  9. HDU 5057 Argestes and Sequence --树状数组(卡内存)

    题意:给n个数字,每次两种操作: 1.修改第x个数字为y. 2.查询[L,R]区间内第D位为P的数有多少个. 解法:这题当时被卡内存了,后来看了下别人代码发现可以用unsigned short神奇卡过 ...

随机推荐

  1. mysql环境变量配置(复制)

    前面步骤完成后安装好MySQL,为MySQL配置环境变量.MySQL默认安装在C:\Program Files下. 1)新建MYSQL_HOME变量,并配置:C:\Program Files\MySQ ...

  2. excel模板解析前后设计变化,以及我对此的看法和感受

    前言:近期也在做Excel模板的解析工作,目前来说,应该是第三版了.我最开始做的,就是垒鸡窝,虽然考虑了1.0提出的关于excel解析的一些建议和问题(单个模板),但是真的毫无设计可言.就几个工具类, ...

  3. UVALive 5987

    求第n个数,该数满足至少由3个不同的素数的乘机组成 #include #include #include #include #include using namespace std; int prim ...

  4. Ubuntu1804编译安装LNMP

    2018-06-05 21:25:55 Ubuntu Linux GP --generic #-Ubuntu SMP Wed May :: UTC x86_64 x86_64 x86_64 GNU/L ...

  5. SYZOJ 186 [额]你猜是不是DP(哈希+二分答案+二分搜索)

      题目描述 现在给两个仅包含小写字母的字符串a,b ,求a 与b的最长公共连续子串的长度. 输入格式 两个字符串 输出格式 一个整数,为输入的两个字符串的最长公共连续子串的长度 测试样例 输入 qa ...

  6. 超简单(super)

    超简单(super) 题目描述 有一个n面的骰子,第i面的数是vi,朝上的概率是pi. 教室的最后一排有一个人,不停地抛这个骰子,直到某一面朝上了两次,就停止抛骰子,但他不知道所有朝上的面的数字的和的 ...

  7. Java中Collections的sort方法和Comparable与Comparator的比较

    一.Comparable 新建Student1类,类实现Comparable接口,并重写compareTo方法 public class Student1 implements Comparable& ...

  8. .NET返回上一页

    原文发布时间为:2010-05-25 -- 来源于本人的百度文章 [由搬家工具导入] if (Request.UrlReferrer != null)                {         ...

  9. html执行.NET函数 html操作数据库 html与ashx结合

    原文发布时间为:2009-09-30 -- 来源于本人的百度文章 [由搬家工具导入] html页面执行.NET函数 html与ashx的结合 1、添加一般应用程序Handler.ashx <%@ ...

  10. [LeetCode] Balanced Binary Tree 深度搜索

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...