C&E: career & experience/Contest

새벽에 끝내는 scpc 2024

KMS studio 2024. 7. 8. 08:45

 

입시가 끝났다... 본인은 이제 응애 학부 1학년생이다.

학부생이라면 반드시 해봐야 하는 것 중 하나가 있다면 바도 ps대회이다. 진짜로.

ucpc와 scpc를 모두 나갈려고 했으나 귀찮은 관계로 생략, scpc만 신청했다. (대회 마지막날에 신청한 건 비밀)

 

토요일 기자단발대식 + 월요일 마감 통계학 과제 + 일요일 미팅이 있어서 시간이 좀 부족할 수도 있겠다 싶었는데 오히려 시간은 널널했다. koi처럼 시간으로 변별하는 느낌은 아닌 듯.

뭐 그냥 예선도 아니고 예선 1차라서 오후에 두 분메 새벽에 두 분제 풀고 5번문제는 쿨하게 때려치고 잤다.

 

round1_01.c

더보기
#include <stdio.h>
#include <stdlib.h>

#define max(a, b)   (((a)>(b))?(a):(b))

int Fnc(char f){ return (f == 'A')?1:-1; }

void solve(int t){
    int N;
    char str[500002];
    int cur, dy = -1;
    int cnt = 0;
    scanf("%d", &N); scanf("%s", str);
    for(cur = 1; cur < N;cur++){
        dy = max(dy, Fnc(str[cur-1])) + Fnc(str[cur]);
        if(dy > 0){ cnt += dy; dy=0; } // add 'B' on it
    }
    printf("Case #%d\n", t);
    printf("%d\n", cnt);
    return;
}

int main(void){
    int T;
    setbuf(stdout, NULL);
    scanf("%d", &T);
    for(int i=0;i<T;i++){ solve(i+1); }
    return 0;
}

round1_02.cpp

더보기
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

void solve(int t){
    int N;
    vector<int> V;
    long long res = 0;
    scanf("%d", &N);
    V.resize(N);
    for(int i=0;i<N;i++){ scanf("%d", V.begin()+i); }
    sort(V.begin(), V.end());
    for(int i=0;i<N/4;i++){
        res += (V[N-1-i] - V[i]) * 2; }
    printf("Case #%d\n", t);
    printf("%lld\n", res);
    return;
}

int main(void){
    int T;
    setbuf(stdout, NULL);
    scanf("%d", &T);
    for(int i=0;i<T;i++){ solve(i+1); }
    return 0;
}

round1_03.cpp

더보기
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

long long makeRes(int v){
    if(v < 2){ return 0; }
    return (long long)v * (v-1) / 2;
}

void solve(int t){
    int N;
    int a, b;
    int ext[2] = { 0, 0 };
    int extIdx = 0;
    
    int len[2] = { 0, 0 };
    int lenIdx = 0;
    int cur, vis, tmp;
    int met = 0;

    long long res;

    vector< vector< int > > edge;
    scanf("%d", &N);
    edge.resize(N+1);
    for(int i=0;i<N+1;i++){
        scanf("%d %d", &a, &b);
        edge[a].push_back(b); edge[b].push_back(a);
        if(edge[a].size() >= 3){ ext[extIdx++] = a; }
        if(edge[b].size() >= 3){ ext[extIdx++] = b; }
    }
    for(int i=0;i<3;i++){
        vis = ext[0];
        cur = edge[ext[0]][i];
        if(cur == ext[1]){ continue; }
        for(met=1;cur != ext[1];){
            tmp = cur;
            cur = (edge[cur][0] != vis)?edge[cur][0]:edge[cur][1];
            vis = tmp;
            met++;
        }
        len[lenIdx++] = met;
    }
    res = makeRes(len[0]) + makeRes(len[1]);
    printf("Case #%d\n", t);
    printf("%lld\n", res);
    return;
}

int main(void){
    int T;
    setbuf(stdout, NULL);
    scanf("%d", &T);
    for(int i=0;i<T;i++){ solve(i+1); }
    return 0;
}

round1_04.cpp

더보기
#include <iostream>
#include <climits>
#include <algorithm>
#include <vector>

#define max(a, b)   (((a)>(b))?(a):(b))
#define min(a, b)   (((a)<(b))?(a):(b))

using namespace std;

typedef long long lint;

int solve(){
    int N, L;
    vector< int > A;
    vector< int > B;
    int res = -1;
    int anc, hok;
    int tmp;
    scanf("%d %d", &N, &L);
    A.resize(N); B.resize(N);
    for(int i=0;i<N;i++){ scanf("%d", A.begin()+i); }
    for(int i=0;i<N;i++){ scanf("%d", B.begin()+i); }
    sort(A.begin(), A.end()); sort(B.begin(), B.end());
    for(int i=0;i<N;i++){ res = max(res, abs(A[i] - B[i])); }
    //
    if(res > L){ return -1; }
    //
    for(anc=hok=0;hok<N;hok++){
        tmp = (int)(lower_bound(B.begin(), B.begin()+hok, A[hok]-L) - B.begin());
        res = max(res, abs(A[hok]-B[max(anc, tmp)]));
        if(abs(A[hok]-B[hok+1])>L){ anc=hok+1; }
    }
    for(anc=hok=N-1;hok>=0;hok--){
        tmp = (int)(upper_bound(B.begin()+hok, B.end(), A[hok]+L) - B.begin())-1;
        res = max(res, abs(A[hok]-B[min(anc, tmp)]));
        if(abs(A[hok]-B[hok-1])>L){ anc=hok-1; }
    }
    return res;
}

int main(void){
    int T, res;
    setbuf(stdout, NULL);
    scanf("%d", &T);
    for(int i=0;i<T;i++){ 
        res = solve();
        printf("Case #%d\n", i+1);
        printf("%d\n", res); }
    return 0;
}