ZOJ 3633 Alice's present【线段树】

来源:互联网 发布:ui设计前景 知乎 编辑:程序博客网 时间:2024/05/16 17:00
/*<span style="font-family:Arial,Helvetica,Verdana,sans-serif;"><span style="font-size:14px;">用线段树记录每个点的左边离他最近的数出现的位置,这样就转化为了求区间最值问题,碰到一个询问区间[l,r],求区间最值,如果区间最值为x,x>=l,那么结果即是a[l],否则说明没有出现重复的数</span></span>*/#include<iostream>using namespace std;#include<algorithm>#include<map>#define maxn 500004#define maxm 50004int a[maxn],b[maxn];struct node{int l;int r;int big;}tree [4*maxn];//线段树要开4倍点的个数void build(int id, int l, int r){tree[id].l = l;tree[id].r = r;if (l == r){tree[id].big = b[l];return;}int mid = (l + r) / 2;build(2 * id, l, mid);build(2 * id + 1, mid + 1, r);tree[id].big = max(tree[2*id].big,tree[2*id+1].big);}int query(int x, int y,int id){if (tree[id].l==x&&tree[id].r==y){return tree[id].big;}int mid = (tree[id].l + tree[id].r) / 2;if (y <= mid)return query(x, y, 2 * id);else if (x > mid)return query(x, y, 2 * id + 1);elsereturn max(query(x, mid, 2 * id), query(mid + 1, y, 2 * id + 1));}int main(){int n = 0,i=0,j=0,m=0;map<int, int> mymap;while (cin>>n){mymap.clear();for (i = 1; i <= n; i++){cin >> a[i];if (mymap.count(a[i]) == 0){mymap.insert(make_pair(a[i],i));b[i] = 0;}else{b[i] = mymap[a[i]];mymap[a[i]] = i;}}build(1,1,n);cin >> m;for ( i = 0; i < m; i++){int x = 0, y = 0;cin >> x >> y;int ans = query(x, y,1);if (ans >= x) cout << a[ans] << endl;else cout << "OK" << endl;}cout << endl;}return 0;}

0 0
原创粉丝点击