AtCoder ABC370 A-D题解

比赛链接:ABC370

AT 上 400 分寄。

Problem A:

Code

#include <bits/stdc++.h>
using namespace std;
int main(){
	int L,R;
	cin>>L>>R;
	if(L==R)
		cout<<"Invalid"<<endl;
	else if(L==1)
		cout<<"YES"<<endl;
	else
		cout<<"NO"<<endl;
	return 0;
}

Problem B:

思路

拿一个二维数组模拟即可。

Code

#include <bits/stdc++.h>
using namespace std;
int A[105][105];
int main(){
	int N;
	cin>>N;
	for(int i=1;i<=N;i++){
		for(int j=1;j<=i;j++)
			cin>>A[i][j];
	}
	int ans=A[1][1];
	for(int i=2;i<=N;i++){
		if(ans>=i)
			ans=A[ans][i];
		else
			ans=A[i][ans];
	}
	cout<<ans<<endl;
}

Problem C:

思路

算是一道模拟。mark_i表示第 i 位有没有处理好;pos数组存需要处理的下标;v用来记录位置和对应的字符串。我语文不大好,不会解释,看到代码你就懂了。

Code

#include <bits/stdc++.h>
using namespace std;
int mark[105];
int main(){
	string S,T;
	cin>>S>>T;
	vector<pair<string,int>> v;
	vector<int> pos;
	for(int i=0;i<S.size();i++){
		if(S[i]!=T[i]){
			pos.push_back(i);
			mark[i]=1;
		}
	}
	int cnt=pos.size();
	cout<<pos.size()<<endl;
	while(S!=T){
		for(int i=0;i<pos.size();i++){
			if(!mark[pos[i]])
				break;
			string tmp=S;
			tmp[pos[i]]=T[pos[i]];
			v.push_back(make_pair(tmp,pos[i]));
		}
		sort(v.begin(),v.end());
		cout<<v[0].first<<endl;
		S=v[0].first;
		mark[v[0].second]=0;
		v.clear();
	}
	return 0;
}

Problem D:

思路

维护row_icol_i表示第 i 行剩余的列的集合以及第 j 列剩余的行的集合。

先判断是否(r,c)位置上有墙,有的话直接删除掉。记得同时更新 row 和 col。

如果没有就在集合内二分,使用提供的 upper_bound 函数找到第一个比自己大的位置。之后往前走一个就可以得到比自己小的位置。

每一次尝试删除元素都要判断迭代器是否合法。

最后把所有row_i内的元素个数加起来就是答案。

Code

#include <bits/stdc++.h>
using namespace std;
const int maxn=400005;
set<int> row[maxn],col[maxn];
void del(int r,int c){
    row[r].erase(c);
    col[c].erase(r);
}
int main(){
	int H,W,Q;
    cin>>H>>W>>Q;
    for(int i=1;i<=H;i++){
        for(int j=1;j<=W;j++){
            row[i].insert(j);
            col[j].insert(i);
        }
    }
    while(Q--){
        int r,c;
        cin>>r>>c;
        if(row[r].count(c)){
            del(r,c);
            continue;
        }
        if(!row[r].empty()){
            auto itr=row[r].upper_bound(c);
            if(itr!=row[r].end())
                del(r,*itr);
            if(!row[r].empty()){
                itr=row[r].upper_bound(c);
                if(itr!=row[r].begin()){
                    itr--;
					del(r,*itr);
				}
            }
        }
        if(!col[c].empty()){
            auto itr=col[c].upper_bound(r);
            if(itr!=col[c].end())
                del(*itr,c);
            if(!col[c].empty()){
                itr=col[c].upper_bound(r);
                if(itr!=col[c].begin()){
                    itr--;
					del(*itr,c);
				}
            }
        }
    }
    int ans;
    for(int i=1;i<=H;i++)
        ans+=row[i].size();
    cout<<ans<<endl;
    return 0;
}

友情提醒:不要无脑Ctrl C+Ctrl V

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值