大样例没过 但是 100 pts?
查看原帖
大样例没过 但是 100 pts?
563650
haochengw920楼主2024/12/1 16:45

rt,考场上调了近三个小时,对拍也拍不出错,但是大样例一直是错的,回来一写民间数据过了。。

求 hack

#include<cstdio> 
#include<cctype> 
#include<array> 
#include<ctime> 
#include<vector>
#include<algorithm> 
#include<initializer_list> 
using namespace std;

namespace Main {

#define ld long double 
#define Pii array<int, 2> 
#define rep(i, l, r) for(int i(l); i <= (r); ++ i) 
#define per(i, r, l) for(int i(r); i >= (l); -- i) 

template<class T> 
inline void cmin(T& x, const T& y) { x = min(x, y); } 
template<class T> 
inline void cmax(T& x, const T& y) { x = max(x, y); }  

const int N = 1e5 + 5; 

int n, ans; 
int s[2][N]; 
int t[2][N]; 
void Input() {
	scanf ("%d", &n); 
	static char str[N]; 
	rep(fg, 0, 1) { 
		scanf ("%s", str + 1); 
		rep(i, 1, n)
			s[fg][i] = str[i] - '0'; 
	} rep(fg, 0, 1) {
		scanf ("%s", str + 1); 
		rep(i, 1, n)
			t[fg][i] = str[i] - '0'; 
	} 
}

int bel[2][N]; 
vector<Pii>b[2]; 
vector<Pii>ctb[2]; 
vector<Pii>sm; 
vector<bool>tf[2]; 
vector<int>bl[2]; 
void Prew() { 
	b[0].clear(); b[1].clear(); ctb[0].clear(); ctb[1].clear(); 
	rep(fg, 0, 1) for (int l = 1, r; l <= n; l = r + 1) {
		r = l; 
		if (!t[fg][l]) continue; 
		while (t[fg][r + 1]) ++ r; 
		array<int, 2>ct = {0, 0}; 
		rep(i, l, r) ++ ct[s[fg][i]], 
			bel[fg][i] = b[fg].size(); 
		b[fg].emplace_back((Pii){l, r}); 
		ctb[fg].emplace_back(ct);  
	} rep(fg, 0, 1) rep(i, 1, n) {
		if (t[fg][i]) continue; 
		if (!t[fg ^ 1][i]) 
			ans += fg * (s[0][i] == s[1][i]); 
		else if (ctb[fg ^ 1][bel[fg ^ 1][i]][s[fg][i]]) 
			++ ans, -- ctb[fg ^ 1][bel[fg ^ 1][i]][s[fg][i]]; 
		else -- ctb[fg ^ 1][bel[fg ^ 1][i]][s[fg][i] ^ 1]; 
	} sm.clear(); tf[0].clear(); tf[1].clear(); bl[0].clear(); bl[1].clear(); 
	for (int l = 1, r; l <= n; l = r + 1) {
		r = l; 
		if (!t[0][l] || !t[1][l]) continue; 
		while (t[0][r + 1] && t[1][r + 1]) ++ r; 
		sm.emplace_back((Pii){l, r});  
		rep(fg, 0, 1) { 
			bl[fg].emplace_back(bel[fg][l]); 
			tf[fg].emplace_back(!t[fg][r + 1]); 
		} 
	} 
} 
void Solve() { 
	int len = sm.size() - 1; 
	rep(i, 0, len) {
		int ct[2]; 
		ct[0] = min(ctb[0][bl[0][i]][0], ctb[1][bl[1][i]][0]); 
		ct[1] = min(ctb[0][bl[0][i]][1], ctb[1][bl[1][i]][1]); 
		ans += ct[0] + ct[1]; 
		if (tf[0][i] && tf[1][i]) continue; 
		int tr = 0, fl = 1; 
		if (tf[1][i]) swap(tr, fl); 
		rep(t, 0, 1) 
			ctb[fl][bl[fl][i]][t] -= ct[t], 
			ctb[tr][bl[tr][i]][t] -= ct[t]; 
		rep(t, 0, 1) 
			ctb[fl][bl[fl][i]][t] -= ctb[tr][bl[tr][i]][t ^ 1]; 
	}
}

void ERoRain() {
	Input(); ans = 0; 
	Prew(); Solve(); 
	printf ("%d\n", ans); 
}

signed main() {
	ld start_time = clock(); 
	int T; scanf ("%d", &T); 
	while (T --) ERoRain(); 
	fprintf(stderr, "Time : %Lfs\n", (clock() - start_time) / CLOCKS_PER_SEC); 
	return 0; 
} 

} signed main() { 
//	freopen("edit.in", "r", stdin); 
//	freopen("edit.out", "w", stdout); 
	
	Main::main(); 
	return 0; 
}
2024/12/1 16:45
加载中...