这题我第一眼居然差点错了\(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;
}
原文:https://www.cnblogs.com/with6676/p/11778692.html