SERIES · AtCoder Weekday Contest

Atcoder Weekday Contest 072

Atcoder Weekday Contest 072 풀이

6/1/2026 · 4 min read


Atcoder Weekday Contest 072 풀이

A - Matching of Notes

implementation

지문에 나온 내용대로 구현해주면 된다.

int n;
string s,t,res;
bool ng;
 
auto solve = [](){
    ri(n, s, t);
    for(int i = 0; i < n; i++){
        if(s[i] == t[i]) res += s[i];
        else{
            if(isalpha(s[i]) and isalpha(t[i])){
                ng = 1;
                res += '!';
            }
            else{
                if(isalpha(s[i])) res += s[i];
                else res += t[i];
            }
        }
    }
    po(res);
    Yes(ng);
};
TimeSpace

B - Tending the Flower Bed

prefix_sum

누적합을 이용해서 K개의 연속한 구간을 관리해주면 된다.

int n,k,mx = -inf;
 
auto solve = [](){
    ri(n, k);
    vi v(n); ri(v);
    auto p = psum(v);
    vi w(n);
    for(int i = 0; i < n; i++) w[i] = (v[i] > 0 ? v[i] : 0);
    auto pw = psum(w);
    for(int i = 0; i <= n - k; i++){
        int cur = p[i + k] - p[i];
        int l = pw[i] - pw[0];
        int r = pw[n] - pw[i + k];
        chmax(mx, cur + l + r);
    }
    po(mx);
};
TimeSpace

C - Battery Remaining

prefix_sumimos

imos법을 이용해서 QQ개의 쿼리를 처리한 다음 누적합을 만들고 출력해주면 간단하다.

int n,q, v[1 << 18], w[1 << 18];
 
auto solve = [](){
    ri(n, q);
    for(int i = 1; i <= n; i++) ri(v[i]);
    while(q--){
        int a,b; ri(a, b); w[a]++, w[b + 1]--;
    }
    for(int i = 1; i < (1 << 18); i++) w[i] += w[i - 1];
    for(int i = 1; i <= n; i++) cout << max<int>(0, v[i] - w[i]) << " ";
};
TimeSpace

D - Mountain Traverse

tree_dpdfs

tree dp를 이용해서 가장 긴 최장경로를 구해주면 된다.

dag dp도 가능

int n,m;
const int sz = 1 << 18;
vi g[sz];
int dp[sz], v[sz];
 
int dfs(int cur){
    int& ret = dp[cur];
    if(ret != -1) return ret;
    ret = 1;
    for(const auto& nxt : g[cur]){
        if(v[cur] > v[nxt]) continue;
        ret = max<int>(ret, dfs(nxt) + 1);
    }
    return ret;
}
 
auto solve = [](){
    ri(n, m);
    memset(dp, -1, sizeof(dp));
    for(int i = 1; i <= n; i++) ri(v[i]);
    while(m--){
        int a,b; ri(a, b);
        g[a].pb(b);
    }
    po(dfs(1));
};
TimeSpace

E - Checking Seats and Lunches

segment_tree

Si<PiSi < Pi인 곳인 중요하기 때문에 해당 인덱스를 체크한 다음에 이걸 세그로 관리해주면 된다.

int n,q;
 
struct segtree{
    const int sz = 1 << 18;
    vi tree;
    segtree():tree(sz << 1){}
 
    void update(int i, int val){
        --i |= sz; tree[i] += val;
        while(i >>= 1) tree[i] = tree[i << 1] + tree[i << 1 | 1];
    }
    int query(int l, int r){
        int ret = 0;
        --l |= sz; --r |= sz;
        while(l <= r){
            if(l & 1) ret += tree[l++];
            if(~r & 1) ret += tree[r--];
            l >>= 1, r >>= 1;
        }
        return ret;
    }
} seg;
 
auto solve = [](){
    ri(n, q);
    vi s(n + 1),p(n + 1);
    for(int i = 1; i <= n; i++) ri(s[i]);
    for(int i = 1; i <= n; i++) ri(p[i]);
    for(int i = 1; i <= n; i++){
        int r = (s[i] < p[i]);
        if(r) seg.update(i, 1);
    }
    while(q--){
        int l,r; ri(l, r);
        Yes(!seg.query(l, r));
    }
};
TimeSpace

총평

이번 세트는 쉬운 듯

Tags:Atcoder
SERIES11 / 15회차

AtCoder Weekday Contest

  1. 9.Atcoder Weekday Contest 070
  2. 10.Atcoder Weekday Contest 071
  3. 11.Atcoder Weekday Contest 072지금 읽는 중
  4. 12.Atcoder Weekday Contest 073
  5. 13.Atcoder Weekday Contest 074

관련 글