CF1266E Spaceship Solitaire Global Round 6 题解+证明

你。 提交于 2019-12-21 09:36:10

首先结论很好猜就是设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;	
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!