Logo냥냠감자기술 블로그
Skip to Content
작성일: 2024-01-12

문제

백준 1275 - 커피숍2 

  • 난이도: 골드1
  • 알고리즘: 세그먼트 트리

코드

#include <iostream> #include <vector> #include <algorithm> using namespace std; long long init(int start, int end, int node, vector<long long>& inputs, vector<long long>& segTree) { if(start==end) { return segTree[node]=inputs[start]; } int mid=(start+end)/2; return segTree[node]=init(start, mid, node*2, inputs, segTree)+init(mid+1, end, node*2+1, inputs, segTree); } long long find(int start, int end, int node, int rangeLow, int rangeHigh, vector<long long>& segTree) { if(rangeHigh<start || rangeLow>end) return 0; if(start>=rangeLow && end<=rangeHigh) return segTree[node]; int mid=(start+end)/2; return find(start, mid, node*2, rangeLow, rangeHigh, segTree)+find(mid+1, end, node*2+1, rangeLow, rangeHigh, segTree); } long long change(int start, int end, int node, int targetIndex, long long changeTo, vector<long long>& segTree) { if(start>targetIndex || end<targetIndex) return segTree[node]; if(start==end) return segTree[node]=changeTo; int mid=(start+end)/2; return segTree[node]=change(start, mid, node*2, targetIndex, changeTo, segTree)+change(mid+1, end, node*2+1, targetIndex, changeTo, segTree); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int nodeNum, calNum; cin>>nodeNum>>calNum; vector<long long> inputs(nodeNum); for(int i=0; i<nodeNum; i++) { cin>>inputs[i]; } vector<long long> segTree(400000, -1); init(0, nodeNum-1, 1, inputs, segTree); for(int i=0; i<calNum; i++) { int rangeLow, rangeHigh; cin>>rangeLow>>rangeHigh; if(rangeLow>rangeHigh) { swap(rangeLow, rangeHigh); } int targetIndex, changeTo; cin>>targetIndex>>changeTo; cout<<find(0, nodeNum-1, 1, rangeLow-1, rangeHigh-1, segTree)<<"\n"; change(0, nodeNum-1, 1, targetIndex-1, changeTo, segTree); } }

회고

또 한번 틀렸다…이번엔 좀 억울한게 문제가 이상하다…! x~y까지의 구간 합을 구하는 문제였는데 알고보니 x가 y보다 클 수도 있었다. 밑에 노트에 적혀 있었으니 문제를 잘 보지 않은 내 잘못이다…이정도면 세그먼트 트리는 한번에 풀지 못하도록 세상이 억까하는게 아닐까.