【题解】240907ABC370

t1:模拟

void solve(){
	int l, r;
	cin >> l >>r;
	if(l==1&&r==1||l==0&&r==0){
		cout <<"Invalid" <<endl;
	}
	else if(l == 1 && r == 0){
		yes;
	}
	else {
		no;
	}
}

t2:取代模拟

void solve() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= i; j++) {
			cin >> q[i][j];
		}
	}
	int ans = 1;
	for (int i = 1; i <= n; i++) {
		if (i >= ans) {
			ans = q[i][ans];
		} else {
			ans = q[ans][i];
		}
	}
	cout << ans << endl;
}

t3:

只需要对于每个si和ti不同的位置更改即可,最优的方法是:

如果si>ti,那就优先更改当前位,这样改后的 s的字典序更小。

如果 si<ti,那就先更改后面位的,最后再改当前位,这样得到的 s的字典序最小。

void solve() {
	string a, b;
	cin >> a >> b;
	vector<string> alls;
	while ( a != b) {
		vector<int>temp;
		for (int i = 0; i < a.size(); i++) {
			if (a[i] != b[i]) {
				temp.push_back(i);
			}
		}
		bool f = false;
		for (auto i  : temp) {
			if (a[i] > b[i]) {
				a[i] = b[i];
				f = true;
				break;
			}
		}
		if (!f) {
			int t = temp.back();
			a[t] = b[t];
		}
		alls.push_back(a);
	}
	cout << alls.size() << endl;
	for (auto i : alls)cout << i << endl;
}

t4:对于存在墙的地方,直接消除当前墙即可,对于当前无墙的地方需要上下左右到有墙,或者到底。

用两个set记录一下剩余的墙的行,列坐标,在查询里使用lwb即可在限制之内

int n,m,q;
vector<set<int>> S,T;
vector<vector<bool>>st;

void erase(int x,int y){
	S[x].erase(y);
	T[y].erase(x);
	st[x][y]=false;
}
set<int>::iterator F(set<int>::iterator x){
	x--;
	return x;
}
void solve(){
	cin >> n >> m >> q;
	S.resize(n+1);
	T.resize(m+1);
	st.resize(n+1);
	
	for(int i = 1;i<=n;i++){
		st[i].resize(m+1);
		for(int j = 1;j<=m;j++){
			S[i].insert(j);
			T[j].insert(i);
			st[i][j] = true;
		}
	}
	while(q--){
		int x,y;
		cin >> x >> y;
		if(st[x][y]){
			erase(x,y);
		}
		else{
			if(S[x].size()&&*S[x].begin()<y){
				erase(x,S[x].size()==1?*S[x].begin():*F(S[x].lower_bound(y)));
			}
			if(S[x].size()&&*S[x].rbegin()>y){
				erase(x,*S[x].lower_bound(y));
			}
			if(T[y].size()&&*T[y].begin()<x){
				erase(T[y].size()==1 ? *T[y].begin():*F(T[y].lower_bound(x)),y);
			}
			if(T[y].size()&&*T[y].rbegin()>x){
				erase(*T[y].lower_bound(x),y);
			}
		}
	}
	int ans = 0;
	for(int i = 1;i<=n;i++){
		for(int j = 1;j<=m;j++){
			ans += st[i][j];
		}
	}
	cout << ans << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值