๐Ÿค– ์•Œ๊ณ ๋ฆฌ์ฆ˜

[baekjoon] 2243 ์‚ฌํƒ• ์ƒ์ž (cpp)

be__simon 2021. 8. 3. 21:47

2243 ์‚ฌํƒ• ์ƒ์ž link

๋ฌธ์ œ


ํ’€์ด


๋ฌธ์ œ๋ฅผ ์ •๋ฆฌํ•˜๋ฉด

  1. ๋ฐฐ์—ด์— ์‚ฌํƒ•์ด ๋“ค์–ด์žˆ๊ณ , ์‚ฌํƒ•์˜ ๋ง›์€ ์ˆซ์ž๋กœ ํ‘œํ˜„๋œ๋‹ค. (์ตœ๋Œ€ 2,000,000,000๊ฐœ)
  2. A๊ฐ€ 1์ธ query๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๋ฐฐ์—ด์—์„œ B๋ฒˆ์งธ๋กœ ๋ง›์žˆ๋Š” (B๋ฒˆ์งธ๋กœ ์ž‘์€) ์‚ฌํƒ•์„ ๊บผ๋‚ด์ค€๋‹ค. (์ถœ๋ ฅํ•œ๋‹ค)

์‚ฌํƒ•์˜ ๋ง›์€ 1 ~ 1,000,000 ์ด๋ฏ€๋กœ ๋ฐฑ๋งŒ๊ฐœ ๊ธธ์ด์˜ ๋ฐฐ์—ด์„ ๋‘๊ณ  ๊ฐ Index์— ๊ทธ ๋ง›์„ ๊ฐ€์ง„ ์‚ฌํƒ•์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฐ ํ›„์— ์‚ฌํƒ•์„ ๊บผ๋‚ด๋ ค๋ฉด ์•ž์—์„œ๋ถ€ํ„ฐ B๋ฒˆ์งธ ์‚ฌํƒ•์˜ ๋ง›์„ ์ฐพ์•„ ๋– ๋‚˜์•ผํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด query๊ฐ€ ์ตœ๋Œ€ 100,000, ๋ฐฐ์—ด ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ 1,000,000์ด๋‹ˆ๊นŒ... ๋ฌด์กฐ๊ฑด ์‹œ๊ฐ„์ดˆ๊ณผ๊ณ  ๋” ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผํ•œ๋‹ค.

์กฐ๊ธˆ๋งŒ ์ƒ๊ฐ์„ ๋ฐ”๊ฟ”๋ณด์ž.
์•ž์—์„œ๋ถ€ํ„ฐ B๋ฒˆ์งธ ์‚ฌํƒ•์„ ์ฐพ๋Š”๋‹ค = ๋‚ฎ์€ ์ˆซ์ž๋ถ€ํ„ฐ ์‚ฌํƒ•์ด ๋ช‡๊ฐœ์”ฉ ์žˆ๋‚˜ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•ด์•ผํ•œ๋‹ค.
๋ˆ„์  ํ•˜๋ฉด ์—ญ์‹œ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ

์ด ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ํ’€์ด๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ฉด

  1. ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ์— ์‚ฌํƒ• ๋ง› ๊ตฌ๊ฐ„๋ณ„ ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•ด๋‘”๋‹ค.
  2. 1 ~ x ๊ตฌ๊ฐ„์˜ ์‚ฌํƒ• ๊ฐœ์ˆ˜๊ฐ€ B๊ฐ€ ๋˜๋Š” x ๊ฐ€ ์›ํ•˜๋Š” ์‚ฌํƒ• ๋ง›์ผ ๊ฒƒ์ด๋‹ค.

๊ทผ๋ฐ 2๋ฒˆ์—์„œ x๋ฅผ ๊ตฌํ•  ๋•Œ 1๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด linearํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“  ๋ณด๋žŒ์ด ์—†๋‹ค.
๋”ฐ๋ผ์„œ 1์€ ๊ณ ์ •ํ•ด๋‘๊ณ  ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ x๋ฅผ ๊ตฌํ•˜๋ฉด ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

Code

#include <iostream>
#define MAXN 1000000

int tree[1<<21];
int n;

int query(int node,  int s, int e, int l, int r) {
  if (r < s || e < l) 
    return 0;

  if (l <= s && e <= r) 
    return tree[node];

  int mid = (s + e) / 2;
  return query(node * 2, s, mid, l, r) + query(node * 2 + 1, mid + 1, e, l, r);

}

void update(int node, int s, int e, int idx, int val) {
  if (idx < s || e < idx)
    return;

  tree[node] += val;
  if (s == e) return;

  int mid = (s + e) / 2;
  update(node * 2, s, mid, idx, val);
  update(node * 2 + 1, mid + 1, e, idx, val);
}

int main() {
  scanf("%d", &n);
  for (int i = 0; i < n;i++) {
    int a, b, c;
    scanf("%d %d", &a, &b);
    if (a == 1) {
      int s = 1, e = MAXN;
      while (e - s > 0) {
        int mid = (s + e) / 2;
        int q = query(1, 1, MAXN, 1, mid);
        if (q < b)
          s = mid + 1;
        else 
          e = mid;
      }
      printf("%d\n", e);
      update(1, 1, MAXN, e, -1);
    } else if (a == 2) {
      scanf("%d", &c);
      update(1, 1, MAXN, b, c);
    }
  }
}

์‚ฌ์‹ค ๋กœ์ง์€ ์™„์ „ ๋™์ผํ•˜๋‚˜ ํŒŒ์ด์ฌ์œผ๋กœ ํ•˜๋‹ˆ ์ž๊พธ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์„œ... ๊ทธ๋ƒฅ cpp๋กœ ํ•˜๋‹ˆ ํ†ต๊ณผํ–ˆ๋‹ค.
ํŽธ๋ฆฌํ•จ์—๋Š” ๋Œ€๊ฐ€๊ฐ€ ์žˆ๋Š” ๋ฒ•...ใ… ใ