// 查询 [L, R] 区间的最小值 intquery(int L, int R){ int len = R - L + 1; // 查询区间的长度 int k = log2(len); // 找到最大的 k 满足 2^k <= len returnmin(st[L][k], st[R - (1 << k) + 1][k]); }
intmain(){ // 输入数组长度和元素 cin >> n; for (int i = 0; i < n; ++i) { cin >> arr[i]; }
// 预处理 ST 表 preprocess();
// 查询操作 int q; // 查询次数 cin >> q; while (q--) { int L, R; cin >> L >> R; // 查询区间 [L, R] cout << query(L, R) << endl; // 输出区间最小值 }
return0; }
ST表例题
A 是某公司的 CEO,每个月都会有员工把公司的盈利数据送给 A,A 是个与众不同的怪人,A 不注重盈利还是亏本,而是喜欢研究「完美序列」:一段连续的序列满足序列中的数互不相同。
int f[MAXN]; // f[i] 表示以第 i 个位置为结尾的最长完美序列的左端点位置 int st[MAXN][LOG]; // ST表,st[i][j]表示从i开始长度为2^j的区间内的最小值 int last[2][1000005]; // last[x]表示数字x最后一次出现的位置 int arr[MAXN]; // 输入数组 int n; // 数组长度
//no restriction here intquery_max(int L, int R){ int len = R - L + 1; int k = log2(len); //cout << "k" << k << endl; returnmax(st[L][k], st[R - (1 << k) + 1][k]); }
//Binary search intbinary_search(int L, int R, int target){ int low = L, high = R; while (low <= high) { int mid = (low + high) / 2; if (f[mid] >= target) { high = mid - 1; } else { low = mid + 1; } } return low; }
intmain(){ cin >> n; int m; cin >> m;
for (int i = 0; i < n; ++i) { cin >> arr[i]; }
preprocess_f(); preprocess_st();
while (m--) { int L, R; cin >> L >> R; int p = binary_search(L, R, L); //cout << "p" << p << endl;
voidprocess_f(){ // traverse for i memset(Hash, 0, sizeof(Hash)); for(int i = 1; i <= n; i++){ longlong val = arr[i]; longlong target = val ^ x; // 储存target到对应的哈希数组中 Hash[target] = i; // cout << "hash" << target << i << endl;
// 得到f[i]的值(扫描完全部的之前的数) f[i] = Hash[arr[i]]; } }
// 预处理 st表 voidprocess_st(){ // for j = 0 memset(st, 0, sizeof(st)); for(int i = 1; i <= n; i++){ st[i][0] = f[i]; }
for (int j = 1; j < LOG; ++j) { // 区间长度从 2^1 到 2^(LOG-1) for (int i = 1; i + (1 << j) <= n + 1; ++i) { // 确保区间不越界 st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]); } } }
//no restriction here boolquery_max(int L, int R){ int len = R - L + 1; int k = log2(len); //cout << "k" << k << endl; return (max(st[L][k], st[R - (1 << k) + 1][k]) >= L); }
intmain(){ cin >> n >> m >> x; for(int i = 1; i <= n; i++){ cin >> arr[i]; }
process_f(); process_st();
int l,r; while(m--){ // query cin >> l >> r; cout << (query_max(l,r) ? "Yes": "No")<< '\n';