HDU4251 The Famous ICPC Team Again (主席树)

来源:互联网 发布:nginx检查配置文件 编辑:程序博客网 时间:2024/06/05 15:33

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4251


题目大意:求区间[L,R]的中位数。


解题思路:主席树。把求中位数看作求第(R-L+1)小的数即可。


/* ***********************************************┆  ┏┓   ┏┓ ┆┆┏┛┻━━━┛┻┓ ┆┆┃       ┃ ┆┆┃   ━   ┃ ┆┆┃ ┳┛ ┗┳ ┃ ┆┆┃       ┃ ┆┆┃   ┻   ┃ ┆┆┗━┓ 马 ┏━┛ ┆┆  ┃ 勒 ┃  ┆      ┆  ┃ 戈 ┗━━━┓ ┆┆  ┃ 壁     ┣┓┆┆  ┃ 的草泥马  ┏┛┆┆  ┗┓┓┏━┳┓┏┛ ┆┆   ┃┫┫ ┃┫┫ ┆┆   ┗┻┛ ┗┻┛ ┆************************************************ *///#pragma comment(linker, "/STACK:102400000,102400000")#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <bitset>using namespace std;#define rep(i,a,b) for (int i=(a),_ed=(b);i<=_ed;i++)#define per(i,a,b) for (int i=(b),_ed=(a);i>=_ed;i--)#define pb push_back#define mp make_pairconst int inf_int = 2e9;const long long inf_ll = 2e18;#define inf_add 0x3f3f3f3f#define mod 1000000007#define LL long long#define ULL unsigned long long#define MS0(X) memset((X), 0, sizeof((X)))#define SelfType intSelfType Gcd(SelfType p,SelfType q){return q==0?p:Gcd(q,p%q);}SelfType Pow(SelfType p,SelfType q){SelfType ans=1;while(q){if(q&1)ans=ans*p;p=p*p;q>>=1;}return ans;}#define Sd(X) int (X); scanf("%d", &X)#define Sdd(X, Y) int X, Y; scanf("%d%d", &X, &Y)#define Sddd(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)#define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin())#define all(a) a.begin(), a.end()#define   mem(x,v)      memset(x,v,sizeof(x))typedef pair<int, int> pii;typedef pair<long long, long long> pll;typedef vector<int> vi;typedef vector<long long> vll;inline int read(){int ra,fh;char rx;rx=getchar(),ra=0,fh=1;while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();if(rx=='-')fh=-1,rx=getchar();while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;}const int N = 1e5 + 5;vi v;inline int getid(int x){    return lower_bound(all(v),x) - v.begin() + 1;}struct node{    int l,r,sum;}tree[N*20];int tot,cnt;int rt[N];void update(int l,int r,int &x,int y,int k){    x = ++tot;    tree[x] = tree[y]; tree[x].sum++;    if(l==r) return;    int mid = (l+r) >> 1;    if(k<=mid) update(l,mid,tree[x].l,tree[y].l,k);    else update(mid+1,r,tree[x].r,tree[y].r,k);}int query(int l,int r,int x,int y,int k){    if(l==r) return l;    int mid = (l+r) >> 1;    int sum = tree[tree[y].l].sum - tree[tree[x].l].sum;    if(k<=sum) return query(l,mid,tree[x].l,tree[y].l,k);    else return query(mid+1,r,tree[x].r,tree[y].r,k-sum);}int a[N];int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);//ios::sync_with_stdio(0);//cin.tie(0);int cas = 1;int n;while(~scanf("%d",&n))    {        tot = cnt = 0;        MS0(rt);        v.clear();        for(int i=1;i<=n;i++)        {            a[i] = read();            v.pb(a[i]);        }        sort(all(v));        v.erase(unique(all(v)),v.end());        cnt = v.size();        for(int i=1;i<=n;i++)        {            update(1,cnt,rt[i],rt[i-1],getid(a[i]));        }        int q = read();        printf("Case %d:\n",cas++);        for(int i=1;i<=q;i++)        {            int x = read(), y = read();            int z = (y-x)/2 + 1;            printf("%d\n",v[query(1,cnt,rt[x-1],rt[y],z)-1]);        }    }return 0;}


0 0
原创粉丝点击