哈尔滨理工大学第七届程序设计竞赛决赛(现场赛-高年级组)E-求最大值

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

题目描述

给出一个序列,你的任务是求每次操作之后序列中 (a[j]-a[i])/(j-i)【1<=i<j<=n】的最大值。
操作次数有Q次,每次操作需要将位子p处的数字变成y.

输入描述:

本题包含多组输入,每组输入第一行一个数字n,表示序列的长度。
然后接下来一行输入n个数,表示原先序列的样子。
再接下来一行一个数字Q,表示需要进行的操作的次数。
最后Q行每行两个元素p,y,表示本操作需要将位子p处的数字变成y.
数据范围:
3<=n<=200000
1<=Q<=200000
-1000000000<=a[i]<=1000000000

题解:
最大值一定是相邻的两个数相减得到的。
注:map中默认按key的值排序。
代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=200007;
int a[maxn];
map<int,int>mp;
int main()
{
    int n,Q;
    while(~scanf("%d",&n))
    {
        int i,j;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(i!=1)
            {
                int t=a[i]-a[i-1];
                if(!mp[t])mp[t]=1;
                else mp[t]++;
            }
        }
        scanf("%d",&Q);
        while(Q--)
        {
            int x,y;scanf("%d%d",&x,&y);
            int t1,t2;
            if(x!=1)
            {
                t1=a[x]-a[x-1];
                mp[t1]--;
                if(mp[t1]==0)mp.erase(t1);
                t1=y-a[x-1];
                if(!mp[t1])mp[t1]=1;
                else mp[t1]++;
            }
            if(x!=n)
            {
                t2=a[x+1]-a[x];
                mp[t2]--;
                if(mp[t2]==0)mp.erase(t2);
                t2=a[x+1]-y;
                if(!mp[t2])mp[t2]=1;
                else mp[t2]++;
            }
            a[x]=y;
            map<int,int>::iterator it=mp.end();
            it--;//it指向最后一个元素
            pair<int,int>item=*it;
            printf("%d",item.first);
            printf(".00\n");
        }
        mp.clear();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值