D2T1服务器需求——毒?瘤题(并不是

这题我第一眼居然差点错了\(OTZ\)
然后写了线段树,还写挂了……
写好了\(query\)操作,发现似乎不需要区间查询,然后又删掉……
看着这熟悉的操作,似乎在哪里见过……
然后我莫名其妙把一个\(now\)打成了\(x\)\(x\)从来没有被定义过,\(DEVc++\)居然还给我编译过了???莫名其妙卡了两小时,不然也不止\(160\)
然后标程出来,是\(set\)……
为什么我没想到,佛枯了\(QWQ\)

题目描述

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

小多计划在接下来的\(n\)天里租用一些服务器,所有的服务器都是相同的。接下来\(n\)天中,第\(i\)天需要\(a_i\)台服务器工作,每台服务器只能在这\(n\)天中工作\(m\)天,这\(m\)天可以不连续。

但是计划不是一成不变的,接下来有\(q\)次修改计划(修改是永久的),每次修改某一天\(k\)的需求量\(a_k\)

小多希望知道每次修改之后,最少需要多少台服务器。

输入描述:

第一行三个正整数\(n,m,q\),分别表示计划的天数,每台服务器能工作的天数和修改次数。

随后一行\(n\)个非负整数,第\(i\)个数字\(a_i\)表示原计划第\(i\)天需要多少台服务器工作。

随后\(q\)行,每行两个正整数\(p_i, c_i\),表示把第\(p_i\) 天需要的服务器数目改成$c_i $

输出描述:

第一行输出原计划需要的最少服务器数量。

随后\(q\)行,每行输出对应的修改之后,需要的最少的服务器的数量。

有没有觉得很水,求平均值和最大值,一眼秒……
然后再求平均值和最大值二者中的较大值就是答案
但是我当时一下子没有想到最大值是会变的
然后问题转化成了维护全局最大值
多么熟悉的问题
\(set\)就完事儿了,\(O(qlogn)\)
可能你也想写线段树?

代码:

#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define ll long long
const int MAX = 4e5 + 10;
int n, q, a[MAX + 2], maxn;
ll ans, m, tans;
struct tree{
    ll m;
}t[(MAX<<2) + 2];
inline void build( int x, int l, int r ){
    if( l == r ){
        t[x].m = a[l];
        return;
    }
    int mid = ( l + r ) >> 1;
    build( x << 1, l, mid); build( x << 1 | 1, mid + 1, r);
    t[x].m = max( t[x<<1].m, t[x<<1|1].m );
}
inline void pushup( int x ){
    t[x].m = max( t[x << 1].m, t[x << 1 | 1].m );
}
inline void update( int now, int pos, ll val, int l, int r ){
    if( l == r ){
        t[now].m = val; return ;
    }
    int mid = ( l + r ) >> 1;
    if( pos <= mid ) update( now << 1, pos, val, l, mid );
    else update( now << 1 | 1, pos, val, mid + 1, r );
    pushup( now );
}
inline int read( void ){
    register ll re = 0;
    char ch = getchar();
    while( ch < '0' || ch > '9' ) ch = getchar();
    while(ch >= '0' && ch <= '9' ){
        re = re * 10 + ch - '0';
        ch = getchar();
    }
    return re;
}
int main( void ){
    n = read(); m = read(); q = read();
    int maxn = 0;
    for( int i = 1; i <= n ; i++ ){
        a[i] = read(); ans += a[i];
        if( maxn < a[i] ) maxn = a[i];
    }      
    tans = ( ans - 1 ) / m + 1;
    if( maxn > tans ) cout << maxn << endl; else cout << tans << endl;
    build( 1, 1, n );
    for( rint i = 1; i <= q; i++ ){
        int t1, t2; t1 = read(); t2 = read();
        ans = ans + t2 - a[t1];
        a[t1] = t2;
        tans = ( ans - 1 ) / m + 1;
        update( 1, t1, t2, 1, n );
        if( tans > t[1].m ) printf( "%lld\n", tans );
        else printf( "%lld\n", t[1].m );
    }
    return 0;
}
posted @ 2019-11-01 18:41  Indigo_Zeppeli  阅读(135)  评论(0编辑  收藏  举报