POJ-3784 Running Median(链表)

题意

读入 n n 个整数,当读入奇数个数时,输出目前读到数的中位数。
1T1000
1n9999 1 ≤ n ≤ 9999 n%2=0 n % 2 = 0

思路

题面上这是一道在线的题,不难想到用两个 set s e t 进行维护。首先要明白一点,很多在线的题目用离线的数据结构反而可以更方便地完成。这道题可以先将数排序再根据输入顺序做好索引。每次按照输入顺序倒序删掉数字,更新链表,在记录此时的答案。最后输出答案时再反向输出即可。

代码

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define FOR(i,x,y) for(int i=(x);i<=(y);i++)
#define DOR(i,x,y) for(int i=(x);i>=(y);i--)
#define N 10003
typedef long long LL;
using namespace std;
const int radix=(1<<16)-1;
struct node
{
    int id,v;
    bool operator <(const node &_)const{return v<_.v;}
}a[N],t[N];
int f[N],ans[N],L[N],R[N];

int del(int k){L[R[k]]=L[k],R[L[k]]=R[k];}

int main()
{
    int T,kase,n;
    scanf("%d",&T);
    FOR(Ti,1,T)
    {
        scanf("%d%d",&kase,&n);
        FOR(i,1,n)scanf("%d",&a[i].v);
        FOR(i,1,n)a[i].id=i;
        sort(a+1,a+1+n);
        FOR(i,1,n)f[a[i].id]=i;
        R[0]=1;
        FOR(i,1,n)L[i]=i-1,R[i]=i+1;
        L[n+1]=n;
        int median=n+1>>1,cnt=0;
        for(int i=n;;i-=2)
        {
            if(i&1)ans[++cnt]=a[median].v;
            if(i==1)break;
            if(f[i]>=median&&f[i-1]>=median)
                median=L[median];
            else if(f[i]<=median&&f[i-1]<=median)
                median=R[median];
            del(f[i]);
            del(f[i-1]);
        }
        printf("%d %d\n",kase,cnt);
        int per=0;
        DOR(i,cnt,1)
        {
            per++;
            printf("%d",ans[i]);
            if(per%10==0||i==1)printf("\n");
            else printf(" ");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值