牛客练习赛11

链接:https://www.nowcoder.com/acm/contest/59/D
来源:牛客网

求距离
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给你一个1 -> n的排列,现在有一次机会可以交换两个数的位置,求交换后最小值和最大值之间的最大距离是多少?

输入描述:

第一行一个数n
之后一行n个数表示这个排列

输出描述:

输出一行一个数表示答案
示例1

输入

5
4 5 1 3 2

输出

3

说明

把1和2交换后
序列为4 5 2 3 1
最大值5在数组的2位置,最小值1在数组的5位置
距离为3

备注:

对于100%的数据,1 <= n <= 100

这个题目很简单,找到最大的和最小的,看他们到1和n的最大距离就好

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,ma,mi;
    scanf("%d",&n);
    for(int i=1,x;i<=n;i++)
    {
        scanf("%d",&x);
        if(x==1)ma=i;
        if(x==n)mi=i;
    }
    if(mi>ma)swap(mi,ma);
    printf("%d",max(n-mi,ma-1));
    return 0;
}

假如不是1到n就是去维护下这个值

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,mi,ma,maf,mif;
    scanf("%d",&n);
    scanf("%d",&mi);
    ma=mi,maf=mif=1;
    for(int i=2,x;i<=n;i++)
    {
        scanf("%d",&x);
        if(x>ma)ma=x,maf=i;
        else if(x<mi)mi=x,mif=i;
    }
    printf("%d",max(max(n-maf,maf-1),max(n-mif,mif-1)));
    return 0;
}

假如有相同的,就可以直接找到这些值,然后从两头遍历啊,只要一半就好了

链接:https://www.nowcoder.com/acm/contest/59/A
来源:牛客网

假的线段树
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给你一个长为n的序列a,有m次操作

1.把区间[l,r]内所有x变成y

2.查询区间[l,r]内第k小值

输入描述:

第一行两个数n,m
第二行n个数表示序列a
后面m行
1 l r x y :把区间[l,r]中所有x变成y
2 l r k :查询区间[l,r]中的第k小值

输出描述:

对于每个询问,输出一个数表示答案
示例1

输入

3 3
2 3 3
2 1 3 1
1 1 3 3 1
2 1 3 2

输出

2
1

备注:

对于100%的数据,1 <= n, m ,ai <= 1000

n太小了,直接上啊

#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N],s[N];
int main()
{
    int x,y,n,m,c,l,r;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1; i<=n; i++)scanf("%d",&a[i]);
        while(m--)
        {
            scanf("%d",&c);
            if(c==1)
            {
                scanf("%d%d%d%d",&l,&r,&x,&y);
                for(; l<=r; l++)
                {
                    if(a[l]==x)a[l]=y;
                }
            }
            else
            {
                memset(s,0,sizeof s);
                scanf("%d%d%d",&l,&r,&x);
                for(; l<=r; l++)s[a[l]]++;
                for(int i=1; i<1001; i++)
                {
                    if(s[i]>=x)
                    {
                        printf("%d\n",i);
                        break;
                    }
                    x-=s[i];
                }
            }
        }
    }
    return 0;
}

慢点的做法

#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N],s[N];
int main()
{
    int x,y,n,m,c,l,r;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1; i<=n; i++)scanf("%d",&a[i]);
        while(m--)
        {
            scanf("%d",&c);
            if(c==1)
            {
                scanf("%d%d%d%d",&l,&r,&x,&y);
                for(; l<=r; l++)
                    if(a[l]==x)a[l]=y;
            }
            else
            {
                scanf("%d%d%d",&l,&r,&x);
                for(int j=1; j<=(r-l+1); j++)
                    s[j]=a[j+l-1];
                sort(s+1,s+2+r-l);
                printf("%d\n",s[x]);
            }
        }
    }
    return 0;
}

 

posted @ 2018-01-27 18:12  暴力都不会的蒟蒻  阅读(517)  评论(0编辑  收藏  举报