HDU - 4417_Super Mario_主席树模板题
2017-11-11 19:42
465 查看
题意
区间【1, n】上,每个点都有一块处在某高度的石头。给 m 个询问,区间【l, r】上高度不大于 h 的石头有多少块。思路
主席树模板题链接
https://vjudge.net/contest/177348#problem/N代码
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int maxn = 1e5 + 10; int t, n, m; int A[maxn]; int node[maxn << 3]; int rot[maxn], lson[maxn << 3], rson[maxn << 3], num[maxn << 3], tt; int dct[maxn<<1], len; int a[maxn], b[maxn], h[maxn]; void ins(int l, int r, int pre, int& now, int x) { now = ++tt; if(l == r){ num[now] = num[pre] + 1; return; } lson[now] = lson[pre], rson[now] = rson[pre]; int mid = (l + r) >> 1; if(x <= mid) ins(l, mid, lson[pre], lson[now], x); else ins(mid+1, r, rson[pre], rson[now], x); num[now] = num[lson[now]] + num[rson[now]]; } int query(int l, int r, int a, int b, int x, int y) { if(x > y) return 0; if(x <= l && r <= y) return num[b] - num[a]; int mid = (l + r) >> 1; int res = 0; if(x <= mid) res += query(l, mid, lson[a], lson[b], x, y); if(y > mid) res += query(mid+1, r, rson[a], rson[b], x, y); return res; } int main() { //freopen("in.txt", "r", stdin); scanf("%d", &t); int cas = 0; while(t--) { printf("Case %d:\n", ++cas); tt = 0; scanf("%d %d", &n, &m); for(int i = 1; i <= n; i++) { scanf("%d", A + i); dct[i] = A[i]; } for(int i = 1; i <= m; i++) { scanf("%d %d %d", a+i, b+i, h+i); dct[n+i] = h[i]; a[i]++, b[i]++; } sort(dct + 1, dct + 1 + n + m); len = unique(dct + 1, dct + n + m + 1) - dct - 1; for(int i = 1; i <= n; i++) { int d = lower_bound(dct + 1, dct + len + 1, A[i]) - dct; ins(1, len, rot[i-1], rot[i], d); } for(int i = 1; i <= m; i++) { int d = lower_bound(dct + 1, dct + len + 1, h[i]) - dct; printf("%d\n", query(1, len, rot[a[i]-1], rot[b[i]], 1, d)); } } return 0; }
相关文章推荐
- [Hdu] 4417 Super Mario (主席树模板题)
- HDU 4417 Super Mario [可持久化线段树 主席树]
- hdu 4417:Super Mario(主席树或离线操作)
- hdu_4417_Super Mario(主席树)
- 主席树:HDU 4417 Super Mario
- HDU 4417 Super Mario(主席树)
- HDU 4417 Super Mario (主席树,区间小于k的个数)
- HDU-4417 Super Mario (主席树)
- hdu-4417-Super Mario(无修改的主席树-求小于等于k的个数)
- 【主席树】 HDU 4417 Super Mario 区间内小于某值的个数
- hdu 4417 Super Mario 树状数组||主席树
- hdu 4417 Super Mario(主席树||cdq分治+树状数组)
- hdu-4417-Super Mario-只查询的主席树
- hdu 4417 Super Mario(主席树)
- Hdu 4417 Super Mario(主席树+二分)
- hdu 4417 Super Mario (主席树+离线)
- hdu 4417 Super Mario (主席树+二分)
- [hdu 4417 Super Mario] 主席树+离散化 OR 分块
- HDU 4417 Super Mario 主席树
- HDU - 4417 Super Mario (主席树)