题意:

给N个数。a[1]....a[N]。

M种操作:

S X Y:令a[X]=Y

Q L R D P:查询a[L]...a[R]中满足第D位上数字为P的数的个数

数据范围:

1<=T<= 50
1<=N, M<=100000
0<=a[i]<=$2^{31}$ - 1
1<=X<=N
0<=Y<=$2^{31}$ - 1
1<=L<=R<=N
1<=D<=10
0<=P<=9

思路:

直接开tree[maxn][10][10]记录第i位上数字为j的个数,铁定MLE,采用离线省去一维。

枚举位置(第i位),每一次枚举,扫一下M个操作,记录。

额.. 直接看代码

代码:

#include <cstdio>
#include <iostream>
#include <string.h>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
#include <map>
#include <stack>
using namespace std;
int const uu[4] = {1,-1,0,0};
int const vv[4] = {0,0,1,-1};
typedef long long ll;
int const inf = 0x3f3f3f3f;
ll const INF = 0x7fffffffffffffffll;
double eps = 1e-10;
double pi = acos(-1.0);
#define rep(i,s,n) for(int i=(s);i<=(n);++i)
#define rep2(i,s,n) for(int i=(s);i>=(n);--i)
#define mem(v,n) memset(v,(n),sizeof(v))
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define lowbit(x) (x)&(-(x))
struct node1{
int kind, L, R, D, P, pos, value; //kind=0,Q操作 kind=1,S操作
}O[100005]; int const maxn=100005;
int T,n,m;
int a[maxn], aa[maxn];
int C[maxn][10]; //第二维:位上的数字
int ans[maxn]; void update(int kind,int p,int x){ //x:位上的数字
for(int i=p;i<=n;i+=lowbit(i)){
if(kind==0)
++C[i][x];
else
--C[i][x];
}
} int sum(int p,int P){
int ret=0;
for(int i=p;i>0;i-=lowbit(i))
ret+=C[i][P];
return ret;
} int query(int L,int R,int P){
return sum(R,P)-sum(L-1,P);
} int POW(int base,int k){
int ret=1;
while(k--) ret*=10;
return ret;
} int main(){
cin>>T;
while(T--){
scanf("%d%d",&n,&m); rep(i,1,n){
scanf("%d",&a[i]);
aa[i]=a[i];
} char op[10];
rep(kk,1,m){
scanf("%s",op);
int x,y,L,R,D,P;
if(op[0]=='S'){
scanf("%d%d",&x,&y);
O[kk].kind=1, O[kk].pos=x, O[kk].value=y;
}else{
scanf("%d%d%d%d",&L,&R,&D,&P);
O[kk].kind=0, O[kk].L=L, O[kk].R=R, O[kk].D=D, O[kk].P=P;
}
} rep(i,1,10){// 第i位
mem(C,0);
rep(j,1,n){
a[j]=aa[j];
int t1=a[j]/POW(10,i-1)%10; //第i位上的数字
update(0,j,t1);
}
rep(j,1,m){
if(O[j].kind==1){ //更改操作
int t1=a[O[j].pos]/POW(10,i-1)%10;
update(1, O[j].pos, t1);
int t2=O[j].value/POW(10,i-1)%10;
update(0, O[j].pos, t2);
a[O[j].pos]=O[j].value;
}else{
if(O[j].D==i){ //查询操作
ans[j]=query(O[j].L,O[j].R,O[j].P);
}
}
}
}
rep(i,1,m) if(O[i].kind==0) printf("%d\n",ans[i]);
}
return 0;
}

hdu 5057 Argestes and Sequence (数状数组+离线处理)的更多相关文章

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

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

  2. HDU 1166 敌兵布阵 (数状数组,或线段树)

    题意:... 析:可以直接用数状数组进行模拟,也可以用线段树. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&quo ...

  3. Necklace HDU - 3874 (线段树/树状数组 + 离线处理)

    Necklace HDU - 3874  Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...

  4. hdu 5057 Argestes and Sequence

    Argestes and Sequence Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  5. HDU 2492 Ping pong (数状数组)

    Ping pong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. HDU 4893 Wow! Such Sequence! (树状数组)

    题意:给有三种操作,一种是 1 k d,把第 k 个数加d,第二种是2 l r,查询区间 l, r的和,第三种是 3 l r,把区间 l,r 的所有数都变成离它最近的Fib数, 并且是最小的那个. 析 ...

  7. hdu 5057 Argestes and Sequence(分块算法)

    Argestes and Sequence Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. HDU 3584 Cube (三维数状数组)

    Cube Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submi ...

  9. poj 2481 Cows(数状数组 或 线段树)

    题意:对于两个区间,[si,ei] 和 [sj,ej],若 si <= sj and ei >= ej and ei - si > ej - sj 则说明区间 [si,ei] 比 [ ...

随机推荐

  1. 洛谷P1781——宇宙总统(高精度排序)

    题目描述 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竟选总统,现在票数已经统计完毕,请你算出谁能够当上总统. 输入输出格式 输入格式: 第一行为一个整数n,代表竞选 ...

  2. 引人遐想,用 Python 获取你想要的 “某个人” 摄像头照片

    仅用来学习,希望给你们有提供到学习上的作用. 1.安装库 需要安装python3.5以上版本,在官网下载即可.然后安装库opencv-python,安装方式为打开终端输入命令行. 2.更改收件人和发件 ...

  3. ARP-NAT(MAC Address Translation)的原理

    本文部分图片来自: http://wiki.deliberant.com/faq/wireless-bridge-routing-arpnat/ https://wiki.openwrt.org/do ...

  4. (一)es 概述与安装

    一.基本概念介绍 1. es 核心术语 核心概念 ES -> 数据库 索引index -> 表 文档 document -> 行(记录) 字段 fields -> 列 早期版本 ...

  5. 如何快速下载ubuntu镜像

    使用国内镜像地址下载: 中科大http://mirrors.ustc.edu.cn/ubuntu-releases/ 阿里云开源镜像站http://mirrors.aliyun.com/ubuntu- ...

  6. Selenium+Tesseract-OCR智能识别验证码爬取网页数据

    1.项目需求描述 通过订单号获取某系统内订单的详细数据,不需要账号密码的登录验证,但有图片验证码的动态识别,将获取到的数据存到数据库. 2.整体思路 1.通过Selenium技术,无窗口模式打开浏览器 ...

  7. c++ class里面成员和分配内存问题

    慢慢开始学c++啦,记录学习的大体过程 class中神奇的内存(sizeof) 1.内存补齐 便于管理类(生成的对象)的内存,类总内存总是为最大成员字节大小的倍数,不足的会进行内存补齐 类的整体内存就 ...

  8. Shiro 550反序列化漏洞分析

    Shiro 550反序列化漏洞分析 一.漏洞简介 影响版本:Apache Shiro < 1.2.4 特征判断:返回包中包含rememberMe=deleteMe字段. Apache Shiro ...

  9. css新增属性之边框

    css3新增属性 边框属性 背景属性 文字属性 颜色属性 边框属性 属性 说明 border-radius 设置边框圆角 border-image 设置图像边框 border-shadow 设置边框阴 ...

  10. Jave Hbase AP

    Hbase API 类和数据模型的对应关系 HBaseAdmin 类:org.apache.hadoop.hbase.client.HBaseAdmin 作用:提供了一个接口来管理 HBase 数据库 ...