atcoder abc230 部分題解
阿新 • • 發佈:2021-12-06
A AtCoder Quiz 3
大於42加一即可
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n , fa[N];
int main()
{
cin >> n;
cout << "AGC";
if( n >= 42 ) n ++;
printf("%03d\n", n);
}
B Triple Metre
通過前兩個字元判斷出起點,然後迴圈判斷是否符合條件
#include<bits/stdc++.h> using namespace std; string s , f = "oxx"; int main() { cin >> s; int i; if( s.size() == 1 && ( s[0] == 'o' || s[0] == 'x' ) ) { cout << "Yes\n"; return 0; } if( s[0] == 'o' && s[1] == 'x' ) i = 0; else if( s[0] == 'x' && s[1] == 'x' ) i = 1; else if( s[0] == 'x' && s[1] == 'o' ) i = 2; else { cout << "No\n"; return 0; } for( auto it : s ) { if( it == f[i] ) i ++ , i %= 3; else { cout << "No\n"; return 0; } } cout << "Yes\n"; return 0; }
C X drawing
首先\((A,B)\)是一定被塗成黑色的,其他的點是\((A+k,B-k),(A+k,B+k)\)可知\(|\frac{(A+k)-A}{(B+k)-B}|=|\frac{(A+k)-A}{(B-k)-B}|=1\),所以這些點構成兩條斜率為正負一的直線,結合樣例易知直線和四個邊界有四個交點,即圖中所有與\((A,B)\)連線斜率為正負一的點都是黑色點
#include<bits/stdc++.h> using namespace std; long long n , a , b , p , q , r , s; int main() { cin >> n >> a >> b >> p >> q >> r >> s; for( long long i = p ; i <= q ; i ++ ) { for( long long j = r ; j <= s ; j ++ ) { if( abs( i - a ) == abs( j - b ) ) printf("#"); else printf("."); } printf("\n"); } }
D Destroyer Takahashi
題目給定了一些線段、一個攻擊的寬度。對於每個線段只要有一個點被破壞,就認為該線段被破壞。對於每次攻擊,穿透力是無限的,意思就是說,在只要有任意線段的任意一個點在本次攻擊的範圍中,線段就會被摧毀。
我們將所有的線段按照右端點從小到大排序,每次找到一個沒有被摧毀的線段,那麼該線段的右端點就是本次攻擊的起點,因為知道攻擊範圍可以很簡單求出本次攻擊的終點,那麼所有右端點在本次攻擊終點之前的線段都可以被摧毀
#include<bits/stdc++.h> using namespace std; const int N = 2e5 + 5; int n , m , cnt ; bool vis[N]; vector< pair< int , int > > line; int read() { int x = 0, ch = getchar(); while( ch < '0' || ch > '9' ) ch = getchar(); while( ch >= '0' && ch <= '9' ) x = ( x << 3 ) + ( x << 1 ) + ch - '0' , ch = getchar(); return x; } int main() { n = read() , m = read(); line.push_back( { 0 , 0 } ); for( int i = 1 , l , r ; i <= n ; i ++ ) { l = read() , r = read() ; line.push_back( { r , l } ); } n = line.size() - 1; sort( line.begin() + 1 , line.end() ); for( int i = 1 , r ; i <= n ; i ++ ) { if( vis[i] ) continue; cnt ++ , vis[i] = 1 , r = line[i].first + m - 1; for( int j = i + 1 ; line[j].second <= r && j <= n ; j ++ ) vis[j] = 1 ; } cout << cnt << endl; }