20分求助
查看原帖
20分求助
895690
gghack_Nythix楼主2023/9/23 22:58

rt,比赛时写了个按块枚举的做法,20分,同机房的却暴力100分过了,有点想不通我的这个为什么不可行

#include<bits/stdc++.h>
using namespace std;
int a[1000005];
struct blocker{
	int num,st,ed,id;
}blsz[1000005];
bool cmp(blocker x,blocker y){
	if(x.num != y.num)return x.num > y.num;
	return x.id > y.id;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	register int t;
	cin >> t;
	while(t--){
		int n,m,k;
		int block = 0,ans = 0,color = 0;
		cin >> n >> m >> k;
		memset(blsz,0,sizeof(blsz));
		for(register int i = 1;i <= n;++i){
			cin >> a[i];
			if(a[i] != a[i - 1]){
				blsz[++block].num = 1;
				blsz[block].st = i;
				blsz[block - 1].ed = i - 1;
				blsz[block].id = i;
			}
			else ++blsz[block].num;
		}
		ans = block;
		color = block;
		int cz = 0;
		int f = 2;
		sort(blsz + 1,blsz + n + 1,cmp);
		for(register int i = 1;i <= block && cz <= m;i++){
			if(blsz[i].num > 2){
				if(2 <= k && cz + blsz[i].num - 2 <= m){
					ans += blsz[i].num - 1;
					cz += blsz[i].num - 2;
				}
				else{
					ans++;
					for(register int j = 1;j <= m-cz;j++){
						ans ++;
					}
					break;
				}
			}
			else if(blsz[i].num == 2){
				int gs = a[blsz[i].ed + 1] != a[blsz[i].st - 1];
				if(gs <= k && cz + 1 <= m){
					++ans;
					++cz;
				}
			}
		}
		cout << ans << '\n';
	}
	return 0;
}
2023/9/23 22:58
加载中...