当前位置: 首页 > article >正文

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


http://www.kler.cn/a/308937.html

相关文章:

  • SQL集合运算
  • 【VIM】vim 常用命令
  • elementui el-table中给表头 el-table-column 加一个鼠标移入提示说明
  • 基于Java Web的传智播客crm企业管理系统的设计与实现
  • Elasticsearch 实战应用:高效搜索与数据分析
  • C++面试基础知识:排序算法 C++实现
  • 传知代码-KAN卷积:医学图像分割新前沿
  • 使用Pydantic模型和LangChain构建高效查询过滤器
  • 为什么在 JSON 序列化中不使用 transient
  • 复变函数论重大错误:将无穷多各异平面误为同一面
  • bev pool 原理及代码讲解
  • 通信工程学习:什么是AN-SMF接入网系统管理功能
  • jacoco生成单元测试覆盖率报告
  • 使用vant UI实现时间段选择
  • Linux系统终端中文件权限的10位字符是什么意思
  • 工厂模式 vs 简单工厂:解耦与扩展性的比较
  • React js Router 路由 2, (把写过的几个 app 组合起来)
  • 如何在 CentOS 上安装和使用 Neofetch(图文教程)
  • Java 技巧 如何在IDEA2024 中快速打出System.out.println();
  • (185)时序收敛--->(35)时序收敛三五
  • 【黑马点评】已解决java.lang.NullPointerException异常
  • Linux系统应用之知识补充——OpenEuler(欧拉)的安装和基础配置
  • goctl安装失败
  • Python 入门教程(3)基础知识 | 3.2、缩进规则
  • SIPp uac.xml 之我见
  • MySQL_数据库基本操作