POJ 2104 - K-th Number 【开坑!
2014-07-24 11:10
295 查看
先来朴素的排序解法:
然后特地学了主席树(还不会套树状数组):
#include <cstdio> #include <algorithm> using namespace std; struct D { int pos, val; } sorted[100000]; int cmp(const struct D &a, const struct D &b) { return a.val < b.val; } int main(void) { int N, M; scanf("%d%d", &N, &M); for(int i=0; i<N; ++i) { scanf("%d", &sorted[i].val); sorted[i].pos = i + 1; } sort(sorted, sorted + N, cmp); for(int c=0; c<M; ++c) { int i, j, k; scanf("%d%d%d", &i, &j, &k); int u; for(u=0; u<N; ++u) if (sorted[u].pos >= i && sorted[u].pos <= j) if (!--k) break; printf("%d\n", sorted[u].val); } return 0; }
2104 | Accepted | 1140K | 6625MS | G++ | 605B | 2014-07-24 11:06:26 |
#include <cstdio> #include <algorithm> using namespace std; #define MAXN 100007 int a[MAXN], mapa[MAXN], QN; int lsi[MAXN*100], rsi[MAXN*100], v[MAXN*100], totv; #define lsn l, m #define rsn m+1, r int build(int l, int r) { int root = totv++; v[root] = 0; if (l == r) { lsi[root] = rsi[root] = 0; return root; } int m = (l + r) >> 1; build(lsn); build(rsn); return root; } int lshift(int T, int p) { int root, t; root = t = totv++; int l = 0, r = QN - 1; while(l < r) { v[t] = v[T] + 1; int m = (l+r) >> 1; if (p <= m) { lsi[t] = totv++, rsi[t] = rsi[T]; T = lsi[T], t = lsi[t], r = m; } else { rsi[t] = totv++, lsi[t] = lsi[T]; T = rsi[T], t = rsi[t], l = m + 1; } } v[t] = v[T] + 1; return root; } int query(int Tl, int Tr, int k) { int l = 0, r = QN-1; while(l < r) { int m = (l+r) >> 1; if (v[lsi[Tl]] - v[lsi] >= k) Tl = lsi[Tl], Tr = lsi , r = m; else { k -= v[lsi[Tl]] - v[lsi ]; Tl = rsi[Tl], Tr = rsi , l = m+1; } } return l; } int T[MAXN + 1]; int main(void) { int N, M; scanf("%d%d", &N, &M); for(int i=0;i<N; ++i) { scanf("%d", &a[i]); mapa[i] = a[i]; } sort(mapa, mapa + N); QN = unique(mapa, mapa + N) - mapa; T = build(0, QN-1); for(int i=N; i-->0;) { a[i] = lower_bound(mapa, mapa + QN, a[i]) - mapa; T[i] = lshift(T[i+1], a[i]); } for(int u=0; u<M; ++u) { int i, j, k; scanf("%d%d%d", &i, &j, &k); printf("%d\n", mapa[query(T[i-1], T[j], k)]); } return 0; } 看到时间差距了?
2104 Accepted 24700K 1610MS G++ 1577B 2014-07-24 14:05:17 相关文章推荐
- POJ 2104 K-th Number
- K-th Number - POJ 2104 划分树
- POJ 2104 K-th number 主席树 函数式线段树
- POJ 2104(K-th Number-区间第k大-主席树)
- POJ 2104 K-th Number 主席树
- POJ 2104 . K-th Number
- Poj 2104 K-th Number
- 用线段树求区间第K大(POJ 2104 K-th Number)
- POJ 2104 K-th Number (划分树)
- poj 2104 -- K-th Number (主席树模版题)
- POJ_2104_K-th Number_线段树(归并树)
- POJ 2104 K-th Number - 主席树
- poj 2104 K-th Number
- 主席树(可持久化线段树)讲解 [POJ 2104] K-th Number
- poj 2104 K-th Number(主席树)
- POJ 2104 K-th Number 主席树
- POJ 2104 & HDU 2665 K-th Number (划分树)
- POJ 2104 K-th Number(划分树)
- K-th Number (POJ_2104) 划分树
- poj 2104 K-th Number