F. Curfew
- 题意:
\(n\)个房间,\(2\)个舍监从两端向中间查房,所有房间总共有\(nb\)个人,但每个房间初始只有\(a_i\)个人在第0个单位时间,所有人可以先跑到距离原来所在房间不大于\(d\)的房间,然后两个舍监开始查第\(1,n\)间房.
以此类推,如果某一次某个舍监查到的房人数小于\(b\),则这个舍监money++,求一个最优跑动策略,使得两个舍监的money的较大值最小.
\(n\le 100000,1\le d\le n-1, 1\le b\le 10000, a_i\le 10^9\)
首先注意到所有房间的总人数是\(nb\),也就是如果舍监不动,那么所有房间应该是满人的.
我们的贪心策略必然是:
- 当舍监在查第\(i\)个房间的时候,如果此时满人,则必然移动一部分人往中间走.
- 反之,如果没满,则看一下是否能通过调人来填满,如果不行,则必然是把这个宿舍的所有人都往中间移动
现在问题的关键是证明如果调人后能填满,调走那一部分人后不会对另外一个舍监产生任何影响.
假设现在查到了第\(i\)间房,那么能调人的一段区间必然是\(i-i*d\sim i+i*d\),如果两个舍监调人的区间有交集,则才可能产生影响.
而如果有交集,则我们必然是先把不是交集且靠近一个舍监的一段区间中的所有人先调过去.
又因为所有人总是等于\(n*b\)的,所以另外一个舍监所能涉及到的区域\(n-i+1-i*d\sim n-i+1+i*d\)总是够人的,并且以后一直都够人(由于人总是跑的比舍监快).
所以移动那一部分人后对另外一个舍监不会有任何影响.
所以直接一个前缀和就可以搞定.