竞赛讨论区 > B题史山求助(52.38%) 造不出错误数据TAT
头像
是卷子啊
发布于 02-05 03:50
+ 关注

B题史山求助(52.38%) 造不出错误数据TAT

#include <iostream>
#include <map>

#define int long long int

using namespace std;

int flag1, flag2;
map <int,int> mp;
int ans;

void solve ( int x1, int x2 ) {
		if ( x2 == 0 && x1 != 0  && ( flag1 == -1 || flag2 == -1 ) ) {
			if ( flag2 == -1 && mp[x2 + 1] != 1) {
				mp[ x2 + 1 ] = 1;
				flag2 = 1, ans += 1;
			}
			if ( flag1 == -1 && mp[ x2 - 1 ] != 1 ) {
				mp[ x2 - 1 ] = 1;
				flag1 = 1, ans += 1;
				solve( mp[x2 - 1], x2 - 1 );
			}	
		}
		if ( x1 == 1  && ( flag1 == -1 || flag2 == -1 ) ) {
			if ( x2 > 0 ) {
				if ( flag2 == -1 && mp[x2 - 1] != 2 ) {
					mp[ x2 - 1 ] = 2;
					flag2 = 1, ans += 1;
					solve( mp[x2 - 1], x2 - 1 );
				}
				else flag2 = 1;
			}
			else {
				if ( flag1 == -1 && mp[ x2 + 1 ] != 2 ) {
					mp[ x2 + 1 ] = 2;
					flag1 = 1, ans += 1;
				}	
				else flag1 = 1;
			}
		}
		else if ( x1 == 2  && ( flag1 == -1 || flag2 == -1 ) ) {
			if ( x2 > 0 ) {
				if ( flag2 == -1 && mp[x2 - 1] != 1) {
					mp[ x2 - 1 ] = 1;
					flag2 = 1, ans += 1;
					solve( mp[x2 - 1], x2 - 1 );
				}
			}
			else {
				if ( flag1 == -1 && mp[ x2 + 1 ] != 1 ) {
					mp[ x2 + 1 ] = 1;
					flag1 = 1, ans += 1;
				}	
				else flag1 = 1;
			}
		}  //第二次遍历开始计算需要增加的最小的数量
	return;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t;
	cin >> t;
	while ( t-- ) {
		int n;
		ans = 0;
		flag1 = -1, flag2 = -1;
		int ans2 = 100;
		cin >> n;
		for ( int i = 1; i <= n; i++ ) {
				int r,c;
				cin >> r >> c;
				if ( mp[c] == 0 )	
					mp[c] = r;
				else if ( mp[c] != 0 ) 
					mp[c] = 3; // 上下同时具有堵住的位置
		}
		if ( ( mp[1] == 1 && mp[-1] == 1 && mp[0] != 2 ) || ( mp[1] == 1 && mp[-1] != 1 && mp[0] == 2 ) ||  ( mp[1] != 1 && mp[-1] == 1 && mp[0] == 2 ) ) {
			if ( flag1 == -1 || flag2 == -1 )
				ans2 = 1;
		}
		for ( auto & x : mp ) {
			int x1 = x.second; //  value 1或2
			int x2 = x.first; // key 横坐标
			if ( x2 == 0 && x1 != 0 && ( flag1 == -1 || flag2 == -1 ) ) {
				if ( mp[x2 - 1] == 1 )
					flag1 = 1;
				if ( mp[x2 + 1] == 1 )
					flag2 = 1;
			}
			else if ( x1 == 3&& ( flag1 == -1 || flag2 == -1 )  ) {
				if ( x2 > 0 )
					flag2 = 1;
				else flag1 = 1;	
			} 
			else if ( x1 == 1 && ( flag1 == -1 || flag2 == -1 ) ) { 
				if (  mp[x2 - 1] == 2 || mp[x2 + 1] == 2 ) {
					if ( x2 > 0 )
						flag2 = 1;
					else flag1 = 1;
				}
			}
			else if ( x1 == 2 && ( flag1 == -1 || flag2 == -1 ) ) {
				if ( mp[x2 - 1] == 1 || mp[x2 + 1] == 1 ) {
					if ( x2 > 0 )
						flag2 = 1;
					else flag1 = 1;
				}
			}  
		}
		for ( auto & x : mp ) 
			solve( x.second, x.first );
		
		if ( flag2 == -1 )
			ans += 2;
		if ( flag1 == -1 )
			ans += 2;
		
		ans = min( ans, ans2 );
			
		if ( ans >= 3 )
			cout << 3 <<endl;
		else cout << ans << endl;
		
		mp.clear();
	}
	return 0;
}

全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐