Disjoint Sparse Table(不相交散列表)模板
来源:互联网 发布:水晶古筝知乎 编辑:程序博客网 时间:2024/06/07 00:58
今天看到一道题,有1e6个数,2e7个询问,每个询问给出区间[l,r],对每个询问输出区间内的数的乘积mod p,由于时间限制很紧,每个询问基本要O(1)回答,然后我了解到这个数据结构可以解决这类问题,下面是求和的模板。0 indexed
# include <bits/stdc++.h>using namespace std;const int N = 1058576, LOGN = 22;long long v[N][LOGN];long long a[N], n, q;void build(int i, int s, int e){if(s == e) return;int m = (s + e)/2;v[m][i] = a[m];for(int j = m-1; j >= s; j--){v[j][i] = v[j+1][i]+a[j];//改成乘号就是区间乘积}if(m + 1 <= e){v[m+1][i] = a[m+1];for(int j = m+2; j <= e; j++){v[j][i] = v[j-1][i]+a[j];//改成乘号就是区间乘积}}build(i+1, s, m);build(i+1, m+1, e);}int main(){ scanf("%d%d",&n,&q);//n个数,q个询问 int LEV = __builtin_clz(n); int size = 1<<(31-LEV); if(n != size)LEV--, size *= 2; for(int i=0; i<n; ++i) scanf("%d",&a[i]); build(0,0,size-1); int q; while(q--) { int l, r; scanf("%d%d",&l,&r); --l;--r; if(l==r) { printf("%d\n",a[l]); continue; } unsigned int temp = __builtin_clz(l^r); unsigned int lev = temp-LEV-1; int ans = v[r][lev]+v[l][lev]; printf("%d\n",ans); } return 0;}
阅读全文
0 0
- Disjoint Sparse Table(不相交散列表)模板
- (Algorithm)不相交集(Disjoint-set)
- 不相交集(The Disjoint Set ADT)
- ACM Sparse Table(模板+区间相关)
- ST表(Sparse Table)
- sparse-table
- Sparse-Table
- HDU 5726 GCD(Sparse-Table+二分)
- uva11235 frequent values(Sparse Table)
- 散列表(hash table)
- 散列表(Hash table)
- table列表中不换行处理(适应不同分辨率)
- 2维Sparse Table
- Sparse Table算法
- RMQ sparse-table
- Sparse Table讲解
- ST算法(Sparse Table)
- ST算法(Sparse-Table)
- win10 Python3.6.0下安装pytorch
- OSI七层模型
- Hadoop平台搭建
- 自然语言处理(二 RNN语言模型)
- gulp配置笔记
- Disjoint Sparse Table(不相交散列表)模板
- TCP连接的建立与终止
- leetCode-Shortest Unsorted Continuous Subarray
- windows10下JAVA中环境变量的设置
- I
- BP神经网络示例(Matlab)
- 我使用过的Linux命令之file
- 教程篇(5.4) NSE4 21. 诊断 ❀ 飞塔 (Fortinet) 网络安全专家
- mysql5.7官网直译SQL语句优化--行结构表达式的优化