UVA1406 - A Sequence of Numbers(树状数组)
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(树状数组)的更多相关文章
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- 树状数组 + 位运算 LA 4013 A Sequence of Numbers
题目传送门 题意:n个数,两种操作,一是每个数字加x,二是查询& (1 << T) == 1 的个数 分析:因为累加是永远的,所以可以离线处理.树状数组点是c[16][M] 表示数 ...
- hdu 5147 Sequence II 树状数组
Sequence II Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Prob ...
- hdu 5147 Sequence II (树状数组 求逆序数)
题目链接 Sequence II Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu6078 Wavel Sequence dp+二维树状数组
//#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:h ...
- HDU 6078 Wavel Sequence 树状数组优化DP
Wavel Sequence Problem Description Have you ever seen the wave? It's a wonderful view of nature. Lit ...
- “浪潮杯”第九届山东省ACM大学生程序设计竞赛(重现赛)E.sequence(树状数组求逆序对(划掉))
传送门 E.sequence •题意 定义序列 p 中的 "good",只要 i 之前存在 pj < pi,那么,pi就是 "good": 求删除一个数, ...
- Codeforces 486E LIS of Sequence --树状数组求LIS
题意: 一个序列可能有多个最长子序列,现在问每个元素是以下三个种类的哪一类: 1.不属于任何一个最长子序列 2.属于其中某些但不是全部最长子序列 3.属于全部最长子序列 解法: 我们先求出dp1[i] ...
- HDU 5057 Argestes and Sequence --树状数组(卡内存)
题意:给n个数字,每次两种操作: 1.修改第x个数字为y. 2.查询[L,R]区间内第D位为P的数有多少个. 解法:这题当时被卡内存了,后来看了下别人代码发现可以用unsigned short神奇卡过 ...
随机推荐
- Selenium - WebDriver: Page Objects
This chapter is a tutorial introduction to page objects design pattern. A page object represents an ...
- 删除ARCSDE表空间和用户后,新建时出现error -1:O的解决办法
对于刚开始使用arcsde的用户,可能会出现各种问题,慢慢来就会找到解决办法 当我们删除用户和表空间时,在服务器本地还保留这sde.dbf文件(删除时选择了删除本地文件,不知道为什么), 我们可以换一 ...
- 将npm改成默认使用cnpm下载
淘宝的cnpm下载安装的命令为 npm install -g cnpm --registry=https://registry.npm.taobao.org 但是仅仅这样是不够的,这样只有主动去下载资 ...
- pat 团体天梯赛 L2-007. 家庭房产
L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产 ...
- Mongoose 参考手册
转自:https://cnodejs.org/topic/548e54d157fd3ae46b233502 Mongoose 是什么? 一般我们不直接用MongoDB的函数来操作MongoDB数据库 ...
- .net显示今天农历的代码!
原文发布时间为:2010-04-11 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Globalization;//namespace Proje ...
- bzoj 1031 [JSOI2007]字符加密Cipher 后缀数组模板
题目链接 题目描述 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: ...
- Python_代码练习_写一个判断是否为小数的函数
这两天在学习函数,练习写一个判断是否为小数的函数,看起来蛮简单的,飞速写完很是得意,然后测了一下,发现差得好多呀,这个并不像想象那样简单,我得到的教训是,想要把一个需求哪怕再小的需求考虑周全,都不是件 ...
- C#反射(Reflection)详解
1. 什么是反射2. 命名空间与装配件的关系3. 运行期得到类型信息有什么用4. 如何使用反射获取类型5. 如何根据类型来动态创建对象6. 如何获取方法以及动态调用方法7. 动态创建委托 1.什么是反 ...
- iptables介绍iptables和netfilter
随着互联网技术的方兴未艾,各种网络应用层出不穷,网络攻击.黑客入侵也成了网民畅游互联网的心头大患,互联网安全也愈加受到了人们的重视.网络防火墙,作为一种简单高效的互联网防御手段,逐渐成为了网民畅游网络 ...