hdu5057 分块处理,当数值大于数据范围时树状数组 真是巧 将大数据分为小数据来处理
2014-09-29 22:31
204 查看
这题说的给了100000个数有100000次操作 询问 L和R 区间内 在D位上为P的个数,用树状数组存 要开[10][10][100000]的int 开不了但是能开 这么大的unsign short 这样我们将这个树状数组一分为二 50000 个位前面 50000 为后面 我们知道unshort 范围在60000多显然这样是可以开的了
View Code
#include <iostream> #include <cstdio> #include <string.h> #include <vector> using namespace std; typedef __int64 ll; const int maxn=100005; int C[10][maxn]; int n,m; int eps[10]; int chose(int V, int t){ return V / eps[t] % 10; } int lowbit(int x){ return x&(-x); } void add( int x, int id , int v){ while(x<=n){ C[id][x]+=v; x+=lowbit(x); } } int sum( int x, int id ){ int ans=0; while(x>0){ ans+=C[id][x]; x-=lowbit(x); } return ans; } int A[maxn]; int B[maxn]; int ans[maxn]; int op[maxn],L[maxn],R[maxn],D[maxn],P[maxn]; bool use[11]; void inti(int lo){ memset( C , 0 , sizeof( C ) ); for(int i=1; i<=n; ++i){ B[i]=A[ i ]; int id=chose( B[ i ] , lo ); add(i,id,1); } } void solve(int los){ for(int i =0; i<m; ++i){ if(op[i]==1){ int x=L[i]; add(x,chose(B[x],los),-1); B[x]=R[ i ]; add( x , chose(B[x],los) , 1 ); }else if( op[i]==2 && D[i]==los ){ ans[i]=sum(R[i],P[i])-sum(L[i]-1,P[i]); } } } int main() { eps[1]=1; for(int i=2; i<=10; ++i) eps[i]=eps[i-1]*10; int cas; scanf("%d",&cas); while(cas--){ scanf("%d%d",&n,&m); for(int i=1; i<=n; ++ i){ scanf("%d",&A[i]); A[i]; } memset(use,false,sizeof(use)); char ch[2]; for(int i=0; i<m; ++i ){ scanf("%s",ch); if(ch[0]=='S'){ op[i]=1; scanf("%d%d",&L[i],&R[i]); }else{ op[i]=2; scanf("%d%d%d%d",&L[i],&R[i],&D[i],&P[i]); use[ D[i] ] = true ; } } for(int i=1; i<=10; ++i){ if(use[i]==false)continue; inti(i); solve(i); } for(int i=0; i<m; ++i){ if(op[i]==2) printf("%d\n",ans[i]); } } return 0; }
View Code
相关文章推荐
- 树状数组详解(处理在线数据,求逆序对)
- pandas擅长数据I/O处理numpy擅长数组数值计算
- Uva 11990 "Dynamic" Inversion(树状数组 + 数据结构分块)
- 一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它
- 线段树 树状数组 求大于某个值的第k小的数 hdu 2852 KiKi's K-Number
- jquery mvc ajax json 当返回json的数据为数组对象时。该如何处理?
- 数组array处理数据
- 如何处理Oledb中EXCEL驱动读取EXCEL文件中字段长度大于255字符时出现的"数据截断"问题.
- 一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。
- 一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。
- C语言中单精度和双精度浮点型数据的数值范围
- 计算机的数据存储及VC&GCC的数值范围
- Excel问题处理,如何实现数据表的单元格数值的动态变化。
- 数据结构之树状数组
- Problem Description 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。 Input 输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,不做处理。 Output 对于每组
- 计算机的数据存储及VC&GCC的数值范围
- SQL Server-数据类型-数值范围
- 在C#中将任意数值类型数据与字节数组相互转换的一个方法
- Delphi 整型数据类型 位与数值范围
- 十四周【任务1】建立专门的数组类处理有关数组的操作数组是几乎所支持的组织数据的方法。