# 主席树几道题目

Poj2104 主席树静态区间第k值

const int MAXN = 100010;
const int MOD = 1000000;
int a[MAXN], t[MAXN];
int T[MAXN * 30], lson[MAXN * 30],rson[MAXN * 30], c[MAXN * 30];
int n, sz, q;
int tot;
void init_hash()
{
FE(i, 1, n) t[i] = a[i];
sort(t + 1, t + 1 + n);
sz = unique(t + 1, t + 1 + n) - t - 1;
}
int build(int l, int r)
{
int rt = tot++;
c[rt] = 0;
if (l != r)
{
int m = (l + r) >> 1;
lson[rt] = build(l, m);
rson[rt] = build(m + 1, r);
}
return rt;
}

int hash(int x)
{
returnlower_bound(t + 1, t + 1 + n, x) - t;
}

int update(int rt, int pos, int val)
{
int new_rt = tot++;
int tmp = new_rt;
c[new_rt] = c[rt] + val;
int l = 1, r = sz;
while (l < r)
{
int m = (l + r) >> 1;
if (pos <= m)
{
lson[new_rt] = tot++; rson[new_rt] = rson[rt];
new_rt = lson[new_rt]; rt = lson[rt];
r = m;
}
else
{
rson[new_rt] = tot++; lson[new_rt] = lson[rt];
new_rt = rson[new_rt]; rt = rson[rt];
l = m + 1;
}
c[new_rt] = c[rt] + val;
}
return tmp;
}

int query(int L, int  R, int k)
{
int l = 1, r = sz;
while (l < r)
{
int m = (l + r) >> 1;
if (c[lson[L]] - c[lson[R]] >= k)
{
L = lson[L]; R = lson[R];
r = m;
}
else
{
k -= c[lson[L]] - c[lson[R]];///!!!
L = rson[L]; R = rson[R];
l = m + 1;
}
}
return l;
}

int main()
{
int x, y, z;
while (cin >> n >> q)
{
tot = 0;
FE(i, 1, n) RI(a[i]);
init_hash();
T[n + 1] = build(1, sz);///!!!
FED(i, n, 1)
{
int pos = hash(a[i]);
T[i] = update(T[i + 1], pos, 1);
}
while (q--)
{
RIII(x, y, z);
printf("%d\n", t[query(T[x], T[y + 1], z)]);
}
}
}

spoj EQUERY 静态区间，区间中不同值的数的个数

const int MAXN = 100010;
const int MOD = 1000000;

int a[MAXN], t[MAXN];
int T[MAXN * 60], lson[MAXN * 60],rson[MAXN * 60], c[MAXN * 60];
int n, q;
int tot;
map<int, int> mp;

int build(int l, int r)
{
int rt = tot++;
c[rt] = 0;
if (l != r)
{
int m = (l + r) >> 1;
lson[rt] = build(l, m);
rson[rt] = build(m + 1, r);
}
return rt;
}

int update(int rt, int pos, int val)
{
int new_rt = tot++;
int tmp = new_rt;
c[new_rt] = c[rt] + val;
int l = 1, r = n;
while (l < r)
{
int m = (l + r) >> 1;
if (pos <= m)
{
lson[new_rt] = tot++; rson[new_rt] = rson[rt];
new_rt = lson[new_rt]; rt = lson[rt];
r = m;
}
else
{
rson[new_rt] = tot++; lson[new_rt] = lson[rt];
new_rt = rson[new_rt]; rt = rson[rt];
l = m + 1;
}
c[new_rt] = c[rt] + val;
}
return tmp;
}

int query(int rt, int pos)
{
int ans = 0;
int l = 1, r = n;
while (l < r)///(pos < r)
{
int m = (l + r) >> 1;

if (pos <= m)
{
rt = lson[rt];
r = m;
}
else
{
ans += c[lson[rt]];
rt = rson[rt];
l = m + 1;
}
}
return ans + c[rt];
}

int main()
{
int x, y, z;
while (cin >> n)
{
tot = 0;
FE(i, 1, n) RI(a[i]);
mp.clear();
T[n + 1] = build(1, n);
FED(i, n, 1)
{
if (mp.find(a[i]) == mp.end())
{
T[i] = update(T[i + 1], i, 1);
}
else
{
int tmp = update(T[i + 1],mp[a[i]], -1);
T[i] = update(tmp, i, 1);
}
mp[a[i]] = i;
}
cin >> q;
while (q--)
{
RII(x, y);
printf("%d\n", query(T[x], y));
}
}
}


、、、

• 本文已收录于以下专栏：

## 主席树专题

• cx_lzx
• 2017年04月15日 11:21
• 333

## 主席树小结

• u012288458
• 2015年08月05日 23:43
• 2417

## 对主席树的一点理解 -- 例题POJ 2104

• aozil_yang
• 2017年03月22日 21:50
• 451

## 【BZOJ 2653】middle 主席树好题推荐

• pbihao
• 2016年12月25日 21:36
• 136

## 主席树 专题

poj2104poj 2104 静态区间第k大，没有修改，所以时间是O(nlogn),空间也是O(nlogn)静态区间第k大，没有修改，所以时间是O(nlogn),空间也是O(nlogn) 模版，...
• Miracle_ma
• 2016年09月28日 23:39
• 389

## POJ 2104 K-th Number 主席树模板题

• discreeter
• 2016年09月02日 15:36
• 527

## 主席树

• lvmaooi
• 2018年01月29日 16:43
• 11

## 系统分析师考试通过了，一点感想

• yuanbocsut
• 2007年01月06日 12:22
• 1372

## java 笔试之继承基础（看看你能做对几道题）初学者不要小看啊

• a564663276
• 2013年05月20日 21:40
• 3102

## 主席树几道题目

• guognib
• 2013年12月04日 16:54
• 1360

举报原因： 您举报文章：主席树几道题目 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)