답안 #1104925

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1104925 2024-10-24T18:00:12 Z Irate Meteors (POI11_met) C++17
100 / 100
2673 ms 58044 KB
#include<bits/stdc++.h>
using namespace std;
const int LOG = 20;
struct Query{
    int l, r, a;
};
struct T{
    int l, r, ans = -1;
};
struct BIT{
    vector<long long>fen;
    int sz;
    BIT(int n){
        sz = n;
        fen.resize(n + 1);
    }
    void Update(int pos, int val){
        while(pos <= sz){
            fen[pos] += val;
            pos += (pos & -pos);
        }
    }
    long long Sum(int pos){
        long long sum = 0;
        while(pos > 0){
            sum += fen[pos];
            pos -= (pos & -pos);
        }
        return sum;
    }
};
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m;
    cin >> m >> n;
    vector<int>v(n + 1), need(m + 1);
    vector<vector<int>>pos(m + 1);
    vector<T>intervals(m + 1);
    for(int i = 1;i <= n;++i){
        cin >> v[i];
        pos[v[i]].push_back(i);
    }
    for(int i = 1;i <= m;++i){
        cin >> need[i];
    }
    int q;
    cin >> q;
    vector<vector<int>>timeline(q);
    vector<Query>queries(q);
    for(int i = 1;i <= m;++i){
        timeline[(q - 1) / 2].push_back(i);
        intervals[i] = {0, q - 1};
    }
    for(int i = 0;i < q;++i){
        int l, r, a;
        cin >> l >> r >> a;
        queries[i] = {l, r, a};
    }
    BIT tree(n + 1);
    for(int i = 0;i < LOG;++i){
        for(int j = 0;j < q;++j){
            int l = queries[j].l, r = queries[j].r, a = queries[j].a;
            if(l <= r){
                tree.Update(l, a);
                tree.Update(r + 1, -a);
            }
            else{
                tree.Update(l, a);
                tree.Update(n + 1, -a);
                tree.Update(1, a);
                tree.Update(r + 1, -a);
            }
            while(!timeline[j].empty()){
                int base = timeline[j].back();
                timeline[j].pop_back();
                l = intervals[base].l, r = intervals[base].r;
                int ans = intervals[base].ans;
                long long tot = 0;
                for(int &p : pos[base]){
                    tot += tree.Sum(p);
                    if(tot >= need[base]){
                        break;
                    }
                }
                if(tot >= need[base]){
                    intervals[base] = {l, (l + r) / 2 - 1, (l + r) / 2};
                }
                else{
                    intervals[base] = {(l + r) / 2 + 1, r, ans};
                }
            }
        }
        for(int j = 1;j <= m;++j){
            timeline[(intervals[j].l + intervals[j].r) / 2].push_back(j);
        }
        for(int j = 0;j < q;++j){
            int l = queries[j].l, r = queries[j].r, a = queries[j].a;
            if(l <= r){
                tree.Update(l, -a);
                tree.Update(r + 1, a);
            }
            else{
                tree.Update(l, -a);
                tree.Update(n + 1, a);
                tree.Update(1, -a);
                tree.Update(r + 1, a);
            }
        }
    }
    for(int i = 1;i <= m;++i){
        int ans = intervals[i].ans;
        if(ans < 0){
            cout << "NIE\n";
        }
        else{
            cout << ans + 1 << '\n';
        }
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 336 KB Output is correct
2 Correct 2 ms 336 KB Output is correct
3 Correct 2 ms 336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 336 KB Output is correct
2 Correct 2 ms 336 KB Output is correct
3 Correct 2 ms 592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 91 ms 3656 KB Output is correct
2 Correct 187 ms 6284 KB Output is correct
3 Correct 123 ms 5452 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 137 ms 4904 KB Output is correct
2 Correct 126 ms 4744 KB Output is correct
3 Correct 193 ms 6216 KB Output is correct
4 Correct 32 ms 3384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 111 ms 4168 KB Output is correct
2 Correct 120 ms 6728 KB Output is correct
3 Correct 72 ms 2128 KB Output is correct
4 Correct 121 ms 5960 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 170 ms 3152 KB Output is correct
2 Correct 171 ms 4740 KB Output is correct
3 Correct 91 ms 3288 KB Output is correct
4 Correct 176 ms 7464 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2129 ms 30716 KB Output is correct
2 Correct 1452 ms 15820 KB Output is correct
3 Correct 304 ms 9296 KB Output is correct
4 Correct 2495 ms 53072 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2298 ms 29068 KB Output is correct
2 Correct 1531 ms 15808 KB Output is correct
3 Correct 247 ms 7504 KB Output is correct
4 Correct 2673 ms 58044 KB Output is correct