1. 程式人生 > 其它 >atcoder abc230 部分題解

atcoder abc230 部分題解

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;
}