Poj3784 Running Median

Description

动态维护中位数问题:依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数。

Input

The first line of input contains a single integer P, (1 ≤ P ≤ 1000), which is the number of data sets that follow. 
The first line of each data set contains the data set number, 
followed by a space, followed by an odd decimal integer M, (1 ≤ M ≤ 9999), 
giving the total number of signed integers to be processed. The remaining line(s) in the dataset consists of the values, 10 per line, separated by a single space. 
The last line in the dataset may contain less than 10 values.

Output

For each data set the first line of output contains the data set number, a single space and 
the number of medians output (which should be one-half the number of input values plus one). 
The output medians will be on the following lines, 10 per line separated by a single space. 
The last line may have less than 10 elements, but at least 1 element. There should be no blank lines in the output.

Sample Input

3 
1 9 
1 2 3 4 5 6 7 8 9 
2 9 
9 8 7 6 5 4 3 2 1 
3 23 
23 41 13 22 -3 24 -31 -11 -8 -7 
3 5 103 211 -311 -45 -67 -73 -81 -99 
-33 24 56

Sample Output

1 5
1 2 3 4 5
2 5
9 8 7 6 5
3 12
23 23 22 22 13 3 5 5 3 -3 
-7 -3
此题剧毒,格式坑死人!!!

10个输出一行!!10个输出一行!!10个输出一行!!!

其实我写这个就是来装逼的,网上还没有写splay的,我来填补这个空缺

此题spaly都是基本操作,就不用我讲了(不会自学,我不提供讲解):板子:splay板子

代码:

#include<stdio.h>
#include<string.h>
int t,n,m,rt,now,v[10001],size[10001],ch[10001][2],f[10001];
void update(int x)
{
    size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
}
void move(int x,int &k)
{
    int cnt=(ch[f[x]][1]==x),fa=f[x],faa=f[fa];
    if(fa==k)k=x;
    else if(faa)ch[faa][ch[faa][1]==fa]=x;
    ch[fa][cnt]=ch[x][cnt^1];
    f[ch[x][cnt^1]]=fa;
    ch[x][cnt^1]=fa;
    f[fa]=x;
    f[x]=faa;
    update(fa),update(x);
}
void splay(int x,int &k)
{
    while(x!=k)
    {
        int y=f[x],z=f[y];
        if(y!=k)
        {
            if((ch[y][0]==x)^(ch[z][0]==y))move(y,k);
            else move(x,k);
        }
        move(x,k);
    }
}
void ins(int x)
{
    if(rt==0){v[++now]=x,size[now]=1,rt=now;return ;}
    int root=rt;v[++now]=x;
    while(1)
    {
        if(v[root]<x)
        {
            if(!ch[root][1])
            {
                ch[root][1]=now;
                f[now]=root;
                size[now]=1;
                update(root);
                break;
            }
            root=ch[root][1];
        }
        else
        {
            if(!ch[root][0])
            {
                ch[root][0]=now;
                f[now]=root;
                size[now]=1;
                update(root);
                break;
            }
            root=ch[root][0];
        }
    }
    splay(now,rt);
}
int find(int x,int k)
{
    if(x<=size[ch[k][0]])return find(x,ch[k][0]);
    if(x==size[ch[k][0]]+1)return v[k];
    return find(x-size[ch[k][0]]-1,ch[k][1]);
} 
int main()
{
    scanf("%d",&t);
    for(int j=1;j<=t;j++)
    {
        now=0,rt=0;int sum=0;
        memset(ch,0,sizeof(ch));
        scanf("%d%d",&n,&m);
        printf("%d %d\n",j,m/2+1);
        for(int i=1,x;i<=m;i++)
        {
            scanf("%d",&x),ins(x);
            if(i&1)
            {
                if(sum==0)printf("%d",find(i/2+1,rt)),sum++;
                else printf(" %d",find(i/2+1,rt)),sum++;
                if(sum==10)sum=0,printf("\n");
            }
        }
        if(j!=t)printf("\n");
    }
}
祝大家早日AC!!!

根据提供的引用内容,这是一个关于二叉树遍历的问题。具体来说,给定二叉树的前序遍历和中序遍历,需要求出二叉树的后序遍历。 以下是一个Java实现的例子: ```java import java.util.Scanner; class Node { char value; Node left; Node right; public Node(char value) { this.value = value; } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int t = scanner.nextInt(); while (t-- > 0) { int n = scanner.nextInt(); String preOrder = scanner.next(); String inOrder = scanner.next(); Node root = buildTree(preOrder, inOrder); postOrder(root); System.out.println(); } scanner.close(); } private static Node buildTree(String preOrder, String inOrder) { if (preOrder.length() == 0) { return null; } char rootValue = preOrder.charAt(0); int rootIndex = inOrder.indexOf(rootValue); Node root = new Node(rootValue); root.left = buildTree(preOrder.substring(1, rootIndex + 1), inOrder.substring(0, rootIndex)); root.right = buildTree(preOrder.substring(rootIndex + 1), inOrder.substring(rootIndex + 1)); return root; } private static void postOrder(Node root) { if (root == null) { return; } postOrder(root.left); postOrder(root.right); System.out.print(root.value); } } ``` 这段代码首先读取输入的测试用例数量t,然后依次读取每个测试用例的节点数量n、前序遍历和中序遍历的字符串。接下来,通过递归构建二叉树,并使用后序遍历输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值