SERIES · AtCoder Weekday Contest

Atcoder Weekday Contest 009

Atcoder Weekday Contest 009 풀이

6/4/2026 · 3 min read


A - Total Shopping Amount

implementation

구현하자!

int n,m,res,s;
 
void solve(){
	ri(n, m);
	for(int i = 0; i < n; i++){
		int x; ri(x);
		s += x;
	}
	po(s % m);
}

B - Dungeon Exploration

implementation

단순 구현

int n,s,res,c;
 
void solve(){
	ri(n, s, c);
	for(int i = 0; i < n; i++){
		int a, b; ri(a, b);
		if(s >= a) s -= a, s += b;
		else res++;
	}
	po(res * c);
}

C - Apple Harvest

implementation

최대값과 최솟값 찾기

int n,t,k,mx,res;
 
void solve(){
	int mn = INF;
	ri(n, t, k);
	vi v(n); for(auto& i : v){
		ri(i); mn = min<int>(mn, i);
	}
	mx = t + k + (mn - 1);
	for(int i = 0; i < n; i++){
		if(v[i] <= mx) res++;
	}
	po(res);
}

D - Planting Flower Seeds

sortingsweeping

웰노운 스위핑

int n,m,res;
 
void solve(){
	ri(n, m);
	vp v(m); for(auto& [a, b] : v) ri(a, b);
	if(m == 0){
		po(n);
		return;
	}
	sort(all(v));
	auto [st, en] = v[0];
	if(st > 1){
		int diff = st - 1;
		if(diff >= n){
			po(n);
			return;
		}
		n -= diff;
	}
	bool ok = 0;
	for(int i = 1; i < m; i++){
		auto [s, e] = v[i];
		if(s <= en) en = max<int>(en, e);
		else{
			int cnt = (s - en) - 1;
			if(n <= cnt){
				res = n + en;
				ok = 1;
				break;
			}
			else{
				n = max<int>(n - cnt, 0);
				st = s, en = e;
			}
		}
	}
	if(n > 0 and !ok) res = en + n;
	po(res);
}

E - Temperature Fluctuation Survey

segment_tree

minseg와 maxseg 두 개를 써서 QQ개의 쿼리를 처리해주면 된다

struct mxsegtree{
	const int sz = 1 << 17;
	vector<int> tree;
 
	mxsegtree():tree(sz << 1, -INF){}
	
	void update(int i, int val){
		--i |= sz; tree[i] = val;
		while(i >>= 1) tree[i] = max<int>(tree[i << 1], tree[i << 1 | 1]);
	}
	int query(int l, int r){
		int lv = -INF,rv = -INF;
		--l |= sz; --r |= sz;
		while(l <= r){
			if(l & 1) lv = max<int>(lv, tree[l++]);
			if(~r & 1) rv = max<int>(tree[r--], rv);
			l >>= 1, r >>= 1;
		}
		return max<int>(lv, rv);
	}
} seg1;
 
struct mnsegtree{
	const int sz = 1 << 17;
	vector<int> tree;
 
	mnsegtree():tree(sz << 1, INF){}
	
	void update(int i, int val){
		--i |= sz; tree[i] = val;
		while(i >>= 1) tree[i] = min<int>(tree[i << 1], tree[i << 1 | 1]);
	}
	int query(int l, int r){
		int lv = INF,rv = INF;
		--l |= sz; --r |= sz;
		while(l <= r){
			if(l & 1) lv = min<int>(lv, tree[l++]);
			if(~r & 1) rv = min<int>(tree[r--], rv);
			l >>= 1, r >>= 1;
		}
		return min<int>(lv, rv);
	}
} seg2;
 
int n,q;
 
void solve(){
	ri(n, q);
	for(int i = 1; i <= n; i++){
		int x; ri(x);
		seg1.update(i, x); seg2.update(i, x);
	}
	while(q--){
		int a,b; ri(a, b);
		if(a == b) po(0);
		else po(seg1.query(a, b) - seg2.query(a, b));
	}
}

총평

좀 많이 쉬운 셋인듯? EE번은 그냥 세그 구현..

Tags:Atcoder
SERIES2 / 15회차

AtCoder Weekday Contest

  1. 1.Atcoder Weekday Contest 5
  2. 2.Atcoder Weekday Contest 009지금 읽는 중
  3. 3.Atcoder Weekday Contest 015
  4. 4.Atcoder Weekday Contest 017
  5. 5.Atcoder Weekday Contest 050

관련 글