ZOJ3633 Alice's present 线段树离线 || 主席树在线
来源:互联网 发布:北京应聘求职软件 编辑:程序博客网 时间:2024/06/05 16:54
题目大意
题目链接
给一个长度为N的序列,有M个询问,每次询问区间内的数是否全都不一样,如果全都不一样就输出OK,如果有重复的就输出从右到左第一个重复的数。
解题思路
主席树在线非常直观,每一个数对应一个历史版本,然后询问的时候询问那个区间对应的线段树里面有多少个元素,如果最大值是1就表示OK,否则的话就输出最右的非1,对于位置做做处理就行。
线段树离线就不太好办了,由于我前几天刚做完杭州H,那就简单了,首先可以找到对应每一个数,它的左边离它最近的与它相同的数的位置,把它放入线段树这个数的位置,那么我们按照数值为主,位置为副的排序之后,然后就可以O(n)解决这个问题,然后我们对于每一个询问,我们询问区间最大值,如果最大值比左端点小,说明没有重复的,否则的话我们就直接找到最大值的位置的数就是从右往左数第一个重复的数。
AC代码
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1const int maxn = (int)5e5 + 10;struct data{ int val, pos; friend bool operator < (const data &a, const data &b){ if (a.val != b.val) return a.val < b.val; else return a.pos < b.pos; }}x[maxn];int mx[maxn << 2], X[maxn], n, m;void PushUp(int rt){ mx[rt] = max(mx[rt << 1], mx[rt << 1 | 1]);}void build(int l, int r, int rt){ if (l == r){ mx[rt] = 0; return; } int m = (l + r) >> 1; build(lson); build(rson); PushUp(rt);}void update(int pos, int c, int l, int r, int rt){ if (l == r){ mx[rt] = c; return; } int m = (l + r) >> 1; if (pos <= m) update(pos, c, lson); else update(pos, c, rson); PushUp(rt);}int query(int ll, int rr, int l, int r, int rt){ if (ll == l && rr == r) return mx[rt]; int m = (l + r) >> 1; if (rr <= m) return query(ll, rr, lson); else if (ll > m) return query(ll, rr, rson); else return max(query(ll, m, lson), query(m + 1, rr, rson));}int main(){ while(~scanf("%d", &n)){ for (int i = 1; i <= n; i++){ scanf("%d", &X[i]); x[i].val = X[i]; x[i].pos = i; } sort(x + 1, x + 1 + n); build(1, n, 1); for (int i = 1; i <= n; i++) if (x[i].val == x[i - 1].val) update(x[i].pos, x[i - 1].pos, 1, n, 1); scanf("%d", &m); for (int i = 1; i <= m; i++){ int a, b; scanf("%d%d", &a, &b); int ans = query(a, b, 1, n, 1); if (ans < a) puts("OK"); else printf("%d\n", X[ans]); } puts(""); } return 0;}
- ZOJ3633 Alice's present 线段树离线 || 主席树在线
- zoj 3633 Alice's present(离线+线段树)
- zoj-3633 Alice's present 离线线段树
- [ZOJ 3633]Alice's present 离线分块/线段树
- zoj 3633 Alice's present 线段树
- ZOJ 3633 Alice's present【线段树】
- zoj 3363 线段树维护最大值 Alice's present
- zoj 3633 Alice's present(线段树)
- ZOJ 3633 Alice's present(线段树)
- SPOJ3267--D-query(离线线段树||在线主席树)
- HDU 4417 线段树离线&&主席树在线
- 线段树:ZOJ1610、ZOJ3635、ZOJ3633、ZOJ3349
- SPOJ 3267 主席树||线段树+离线
- HDU 4605 Magic Ball Game (在线主席树|| 离线 线段树)
- HDU 4605 Magic Ball Game (在线主席树|| 离线 线段树)
- HDU 4605 Magic Ball Game (在线主席树|| 离线 线段树)
- ZOJ:3633 Alice's present(离线处理)
- HDU6162-Ch’s gift((离线+树链剖分)或(在线+树上主席树))
- HTML5+CSS3(二)
- 获取本机的IP地址
- oracle存储过程学习经典[语法+实例+调用]
- 云寻觅中文分词 (Yunxunmi Chinese Word Segmentation) ,词汇440万,10万字文章分词并计算频率不超过1秒
- python字符串操作(序)
- ZOJ3633 Alice's present 线段树离线 || 主席树在线
- Hadoop介绍
- AndroidのActivity之回顾跳转动画
- 【Java TCP/IP Socket】深入剖析socket——数据传输的底层实现
- 什么是Shell
- POJ1936——All in All
- 一些比较重要的算法
- CSipSimple 拨打电话的触发按键
- 使用Struts2的iterator标签遍历复杂的Map类型