【Atcoder訓練記錄】AtCoder Beginner Contest 377

MNNUACM_2024ZY發表於2024-10-26

訓練情況

賽後反思

D題差一點點吧?可能不去樂跑就能寫出來了

A題

我們發現 ABC 是字典序單調遞增的,字串先排序再判斷是否為 ABC 即可。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	string s; cin>>s;
	sort(s.begin(),s.end());
	if(s == "ABC") cout<<"Yes"<<endl;
	else cout<<"No"<<endl;	
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

B題

記錄每一行每一列是否有棋子,有就不能放,最後每一格都列舉一遍,判斷當前行當前列是否有棋子即可,沒有棋子就答案加一。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	vector<string> s(8);
	for(int i = 0;i<8;i++) cin>>s[i];	
	vector<bool> r(8),c(8);
	int ans = 0;
	for(int i = 0;i<8;i++){
		for(int j = 0;j<8;j++){
			if(s[i][j] == '#') r[i] = 1,c[j] = 1;
		}
	}
	for(int i = 0;i<8;i++){
		for(int j = 0;j<8;j++){
			if(!r[i]&&!c[j]) ans++;
		}
	}
	cout<<ans<<endl;
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

C題

上一題的加強版?這次可以往八個方向,考慮到可能會出現重複被佔的點,所以我們用 set 進行去重即可,最後判斷棋子是否在棋盤上,求被佔的格子,最後再用全部的減一下即可。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n,m; cin>>n>>m;
	set<pair<int,int>> s;
	for(int i = 1;i<=m;i++){
		int x,y; cin>>x>>y;
		s.insert({x,y});
		s.insert({x+2,y+1});
		s.insert({x+1,y+2}); 
		s.insert({x-1,y+2});
		s.insert({x-2,y+1});
		s.insert({x-2,y-1});
		s.insert({x-1,y-2});
		s.insert({x+1,y-2});
		s.insert({x+2,y-1});
	}
	int ans = 0;
	for(auto i:s){
		if(i.first>=1&&i.first<=n&&i.second>=1&&i.second<=n) ans++;
	}
	cout<<n*n-ans<<endl;
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

D題

考慮 \(O(m)\) 的同時,維護一個左邊界,就是當前位置能最多往前多少是剛好不完全覆蓋的,最後這個左邊界需要取個 max,因為如果前面的左邊界更右,那後面的左邊界也要和前面一樣。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n,m; cin>>n>>m;
	vector<int> d(m + 1,1);
	for(int i = 1;i<=n;i++){
		int l,r; cin>>l>>r;
		d[r] = max(d[r],l+1);
	}	
	for(int i = 1;i<=m;i++){
		d[i] = max(d[i],d[i-1]);
	}
	int ans = 0;
	for(int i = 1;i<=m;i++){
		ans += i - d[i] + 1;
	}
	cout<<ans<<endl;
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

相關文章