[hdu5654 xiaoxin and his watermelon candy]区间内不同数的个数
来源:互联网 发布:stm32f103tbu6编程 编辑:程序博客网 时间:2024/05/19 22:48
原题
思路:
首先求得所有合法的三元组(
回过头来看,这个题就是求“区间内不同的数的个数“,经典的离线做法也是可以的。
坑点:
#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 7;typedef long long ll;map<ll, int> mp;int n, m, l, r, T, cnt, a[N], b[N], root[N], last[N], p[N];struct SegTree { struct Node { int lp, rp, sum; }; int c; Node tree[N * 21]; void clear() { c = 0; memset(tree, 0, sizeof(tree)); } void build(int l, int r, int &rt) { rt = c++; if (l == r) return; int m = l + r >> 1; build(l, m, tree[rt].lp); build(m + 1, r, tree[rt].rp); } void update(int x, int v, int last, int l, int r, int &rt) { rt = c++; tree[rt] = tree[last]; tree[rt].sum += v; if (l == r) return; int m = l + r >> 1; if (x <= m) update(x, v, tree[last].lp, l, m, tree[rt].lp); else update(x, v, tree[last].rp, m + 1, r, tree[rt].rp); } int query(int R, int l, int r, int rt) { if (R >= r) return tree[rt].sum; int m = (l + r) >> 1; if (R <= m) return query(R, l, m, tree[rt].lp); else return query(R, l, m, tree[rt].lp) + query(R, m + 1, r, tree[rt].rp); }};SegTree st;int main() { cin >> T; while (T--) { cin >> n; for (int i = 1; i <= n; i++) { scanf("%d", a + i); p[i] = i; } cnt = 0; memset(b, 0, sizeof(b)); memset(last, 0, sizeof(last)); mp.clear(); for (int i = 1; i <= n - 2; i++) { if (a[i] > a[i + 1] || a[i + 1] > a[i + 2]) continue; ll x = ((ll)a[i] * 1000000ll + a[i + 1]) * 1000000ll + a[i + 2]; if (!mp[x]) b[i] = mp[x] = ++cnt; else b[i] = mp[x]; p[i] = last[b[i]]; last[b[i]] = i; } st.clear(); st.build(0, n, root[0]); for (int i = 1; i <= n; i++) st.update(p[i], 1, root[i - 1], 0, n, root[i]); cin >> m; while (m--) { scanf("%d%d", &l, &r); if (r - l < 2) puts("0"); else printf("%d\n", st.query(l - 1, 0, n, root[r - 2]) - l + 1); } } return 0;}
0 0
- [hdu5654 xiaoxin and his watermelon candy]区间内不同数的个数
- HDU5654 xiaoxin and his watermelon candy 莫队
- 【HDU5654 BestCoder Round 77 (div1) D】【前驱位置思想 排序 树状数组】xiaoxin and his watermelon candy 区间内多少个不同连续单升三元
- 线段树+离线 hdu5654 xiaoxin and his watermelon candy
- HDU 5654 xiaoxin and his watermelon candy
- dp hdu5653 xiaoxin and his watermelon candy
- HDU 5654 xiaoxin and his watermelon candy
- HDU 5654 xiaoxin and his watermelon candy 归并树
- 【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)
- 【没A】【HDU 5654】 xiaoxin and his watermelon candy|主席树
- SPOJ DQUERY 区间内不同数的个数 主席树
- SPOJ DQUERY 区间内不同数的个数
- 线段树离线处理(区间内不同的数的个数)hdu3333
- URAL 2080 Wallet 分块求无修改的区间内不同数的个数
- SPOJ DQUERY 求区间内不同数的个数 主席树
- SPOJ DQUERY 求区间内不同数的个数 (主席树)
- codeforces D. Mishka and Interesting sum 求区间内不同数的异或值
- 查询区间内不同数字的个数 lydsy1878
- Block的深入研究之Block的内存管理
- 71. Simplify Path
- Java异常处理
- 有趣的数 算法的题解(数位DP问题)
- QT21 Display selected row from QTableView to QlineEdit
- [hdu5654 xiaoxin and his watermelon candy]区间内不同数的个数
- Client:TSocketConnection和Server:Scktsrvr关系----压缩数据传输
- 历代C++标准整理
- QT22 database values in QLineEdit or textbox if select QListView
- K-Means聚类算法实现对路透社语料reuters聚类
- QT23 how to open a website in a default user browser
- Java连接数据库大全
- Jvm垃圾回收算法
- QT24&25 how to run exe file by clicking a button in Qt