---
title: 'AtCoder Beginner Contest 269'
disqus: hackmd
---
AtCoder Beginner Contest 269
===
[TOC]
:::info
直接做,水題
:::
### [A - Anyway Takahashi ](https://atcoder.jp/contests/abc269/tasks/abc269_a)
```csharp=
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fast ios::sync_with_stdio(0), cin.tie(0)
int main() {
fast;cout.tie(0);
ll a,b,c,d;
cin>>a>>b>>c>>d;
cout<<(a+b)*(c-d)<<endl;
cout<<"Takahashi";
return 0;
}
```
### [B - Rectangle Detection](https://atcoder.jp/contests/abc269/tasks/abc269_b)
:::info
直接做,水題
:::
```csharp=
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define sz(s) (int)s.size()
#define max(p,q)((p)>(q)?(p):(q))
#define fast ios::sync_with_stdio(0), cin.tie(0)
string s[10];
int main() {
fast;cout.tie(0);
ll a=-1,b=-1,c=-1,d=-1;
for(ll i=0;i<10;i++){
cin>>s[i];
}
for(ll i=0;i<10;i++){
for(ll j=0;j<10;j++){
if(a==-1 && s[i][j]=='#'){a=i;b=j;}
if(i+1<10 && j+1<10 && s[i][j]=='#' && s[i+1][j+1]=='.'){c=i;d=j;}
if(i+1<10 && j+1==10 && s[i][j]=='#' && s[i+1][j]=='.'){c=i;d=j;}
if(j+1<10 && i+1==10 && s[i][j]=='#' && s[i][j+1]=='.'){c=i;d=j;}
}
}
if(c==-1){c=9;d=9;}
cout<<a+1<<" "<<c+1<<endl;
cout<<b+1<<" "<<d+1;
return 0;
}
```
### [C - Submask](https://atcoder.jp/contests/abc269/tasks/abc269_c)
:::info
解題關鍵
1. 要用什麼資料結構存這些數字呢?
因為數字不會重複出現,又可以幫忙排序,當然選他阿
2. 通靈for loop 技巧: i = (i-1)&n
可以直接跳過n用二進位表達法有0的位數,同時i可表達成n有的二進位數字的組合。
:::
```csharp=
#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0); cin.tie(0);
#define int long long
using namespace std;
signed main(){
fastio
int n;
cin >> n;
set<int> st;
for(int i = n;i > 0; i = (i-1)&n){
cout<<i<<endl;
st.insert(i);//代表那些數字有
}
st.insert(0);
for(auto x : st){
cout << x << "\n";
}
}
```
### [D - Do use hexagon grid](https://atcoder.jp/contests/abc269/tasks/abc269_d)
:::info
關鍵:
1. 座標有負數,加上夠大的正數(1010)使其為正。
2. 對黑點 i BFS一圈。如果這一圈有黑點j且沒有被BFS過,那就BFS他。(連通就連續BFS)(不連續BFS,測資三不會過)
3. 怎麼檢查j是否為黑點?簡單,直接O(n)檢查是否在陣列裡面,複雜度O($n^2$)也不會爆開
:::
```csharp=
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pll pair<ll,ll>
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define sz(s) (int)s.size()
#define max(p,q)((p)>(q)?(p):(q))
#define fast ios::sync_with_stdio(0), cin.tie(0)
#define N 2020
ll vis[N][N],nx,ny,n;
ll dx[6]={-1,-1,0,0,1,1};
ll dy[6]={-1,0,1,-1,0,1};
vector<pll> np;
void bfs(ll p, ll q){
for(ll j=0;j<6;j++){
nx=p+dx[j];
ny=q+dy[j];
//cout<<"nx="<<nx<<"ny="<<ny<<endl;
if(nx>=0 && ny>=0 && !vis[nx][ny]) {
vis[nx][ny]=1;
for(ll k=0;k<n;k++){
if(nx==np[k].F && ny==np[k].S) bfs(nx,ny);//連通就連續BFS
}
}
}
}
int main() {
fast;cout.tie(0);
ll cnt=0;
ll x,y;
cin>>n;
for(ll i=0;i<n;i++){
cin>>x>>y;
np.pb(mp(x+1010,y+1010));//info 1.
}
for(ll i=0;i<n;i++){
if(vis[np[i].F][np[i].S]==1) bfs(np[i].F,np[i].S);;
if(!vis[np[i].F][np[i].S]){//沒有被BFS過就BFS他
vis[np[i].F][np[i].S]=1;
cnt+=1;//記錄連通塊
bfs(np[i].F,np[i].S);
}
}
cout<<cnt;
return 0;
}
```