蒟蒻提问:关于昨晚 ARC 第二题
  • 板块学术版
  • 楼主WilliamFranklin
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/2/26 15:52
  • 上次更新2023/10/23 23:41:15
查看原帖
蒟蒻提问:关于昨晚 ARC 第二题
330901
WilliamFranklin楼主2023/2/26 15:52

不知道为什么昨天 ARC 的第二题 WA 了11个测试点,请大佬帮帮吧! 给出来 hack 数据也可以!感谢!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <sstream>

using namespace std;

const int N = 2e5 + 5;

int jian[N], c;

int main() {
	int n, k;
	string s;
	
	cin >> n >> k;
	cin >> s;
	
	int cnt = 0;
	bool f = 0;
	int bf = 0;
	int now = 0;
	bool g = 0;
	for (int i = 0; i < s.size(); i++) {
		if (i != 0 && s[i] == 'X' && s[i - 1] == 'Y') {
			c++;
			bf += now - 1;
		}
		
		if (s[i] == 'X') {
			now = 0;
			cnt++;
		} else {
			f = 1;
			now++;
		}
		
		if (f) {
			if (s[i] == 'X') {
				jian[c]++;
			}
		}
	}
	
	c--;
	
	if (cnt < k) {
		int cc = 0;
		for (int i = 0; i < s.size(); i++) {
			if (s[i] == 'X') {
				s[i] = 'Y';
				cc++;
			} else {
				s[i] = 'X';
			}
		}
		
		k -= cc;
		
		cnt = 0;
		f = 0;
		bf = 0;
		now = 0;
		c = 0;
		memset(jian, 0, sizeof(jian));
		for (int i = 0; i < s.size(); i++) {
			if (i != 0 && s[i] == 'X' && s[i - 1] == 'Y') {
				c++;
				bf += now - 1;
			}
			
			if (s[i] == 'X') {
				now = 0;
				cnt++;
			} else {
				f = 1;
				now++;
			}
			
			if (f) {
				if (s[i] == 'X') {
					jian[c]++;
				}
			}
		}
		
		c--;
		
		k = cnt - k;
	}
	
	for (int i = 0; i < s.size(); i++) {
		if (s[i] == 'Y') g = 1;
	}
	
	if (!g) {
		cout << max(k - 1, 0) << endl;
		
		return 0;
	}
	
	sort(jian, jian + c + 1);
	
	//cout << k << ' ' << s << ' ' << cnt << endl;
	
	if (cnt == k) cout << n - 1;
	else if (cnt > k) {
		//cout << 111 << endl;
		int cnt1 = cnt;
		int l = 0, r = 0;
		
		for (int i = 0; i < s.size(); i++) {
			if (s[i] == 'X') {
				cnt1--;
			}
			
			if (s[i] == 'Y') {
				l = i;
				break;
			}
		}
		
		for (int i = s.size() - 1; i >= 0; i--) {
			if (s[i] == 'X') {
				cnt1--;
			}
			
			if (s[i] == 'Y') {
				r = i;
				break;
			}
		}
		
		if (cnt1 == k) {
			cout << r - l;
		} else if (cnt1 < k) {
			cout << r - l + (k - cnt1);
		} else {
			//cout << 111 << endl;
			
			int add = 0;
			
			for (int j = 1; j <= c; j++) {
				if (k < jian[j]) break;
				else {
					k -= jian[j];
					add += jian[j] + 1;
				}
			}
			
			add += k;
			
			cout << bf + add << endl;
		}
	}
	
	return 0;
}
2023/2/26 15:52
加载中...