首先结论很好猜就是设mi为有多少个milestone的ui=i,答案为∑max(0,ai-mi)。
而且答案肯定不可能优于这个了,应为这其实是吧所有的milestone都用上了(除了mi>ai 时只用了ai个)
要证明这样就足够了,如下:
首先把所有的production都生产max(0,ai-mi)个,如下绿色部分:
那除了这些是否还可以继续往上且 for free。可以反正,如果到达某一个状态所有的milestone 的si都>i 已经生产的个数 则没法继续免费生产图片如下:
红色部分为si
但这显然是不可能的应为所有没有填上绿的格子数>了红格子数(没有填上绿格子数一定<=milestone 的个数)
就算全部填满那最上面的一行也不能有红色的格子 ,because:
"
A bonus is never awarded for 0 of any resource, neither for reaching the goal ai nor for going past the goal — formally, for every milestone 0<tj < asj.
"
所以一直存在在绿格子下的未使用过的 milestone ,直到所有都满了。
代码实现:
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define niv vector<int>
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define KEEP while(1)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
typedef pair<mp,mp> superpair;
LL ans;
int itself[200000+10],n;
map<pair<int,int> ,int> MP;
int main(){
ios::sync_with_stdio(false);
cin>>n;
rb(i,1,n){
cin>>itself[i];
ans+=itself[i];
}
int q;
cin>>q;
rb(i,1,q){
int si,ti,ui;
cin>>si>>ti>>ui;
int OK=0;
if(MP[II(si,ti)]){
if(++itself[MP[II(si,ti)]]>0){
ans++;
}
MP[II(si,ti)]=0;
}
if(ui)
{
MP[II(si,ti)]=ui;
if(itself[ui]>0){
ans--;
}
itself[ui]--;
}
cout<<ans<<endl;
}
return 0;
}
来源:CSDN
作者:qq_42925924
链接:https://blog.csdn.net/qq_42925924/article/details/103639186