답안 #1104933

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1104933 2024-10-24T18:49:13 Z Irate Meteors (POI11_met) C++17
100 / 100
777 ms 28784 KB
#include<cstdio>
#include<vector>
using namespace std;
const int mxN = 3e5 + 5;
long long fen[mxN];
vector<int> pos[mxN];
int sectors[mxN], need[mxN], ans[mxN];
int P = -1, n, m, q;
void Update(int pos, int val){
    while(pos < mxN){
        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;
}
struct Query{
    int l, r, a;
} queries[mxN];
void f(int l, int r, vector<int>&exist){
    int mid = (l + r) / 2;
    if(mid == q){
        for(int &sector : exist){
            ans[sector] = -1;       
        }
        return;
    }
    if(l == r){
        for(int &sector : exist){
            ans[sector] = l;
        }
        return;
    }
    while(P + 1 <= mid){
        P++;
        int l = queries[P].l, r = queries[P].r, a = queries[P].a;
        if(l <= r){
            Update(l, a);
            Update(r + 1, -a);
        }
        else{
            Update(l, a);
            Update(1, a);
            Update(r + 1, -a);
        }
    }
    while(P - 1 >= mid){
        int l = queries[P].l, r = queries[P].r, a = queries[P].a;
        if(l <= r){
            Update(l, -a);
            Update(r + 1, a);
        }
        else{
            Update(l, -a);
            Update(1, -a);
            Update(r + 1, a);
        }
        P--;
    }
    vector<int>left, right;
    for(int &sector : exist){
        long long tot = 0;
        for(int &i : pos[sector]){
            tot += Sum(i);
            if(tot >= need[sector]){
                break;
            }
        }
        if(tot >= need[sector]){
            left.push_back(sector);
        }
        else{
            right.push_back(sector);
        }
    }
    exist.clear();
    f(l, mid, left);
    f(mid + 1, r, right);
}
int main(){
    scanf("%d%d", &m, &n);
    for(int i = 1;i <= n;++i){
        scanf("%d", &sectors[i]);
        pos[sectors[i]].push_back(i);
    }
    vector<int>exist;
    for(int i = 1;i <= m;++i){
        scanf("%d", &need[i]);
        exist.push_back(i);
    }
    scanf("%d", &q);
    for(int i = 0;i < q;++i){
        int l, r, a;
        scanf("%d%d%d", &l, &r, &a);
        queries[i] = {l, r, a};
    }
    f(0, q, exist);
    for(int i = 1;i <= m;++i){
        if(ans[i] < 0){
            printf("NIE\n");
        }
        else{
            printf("%d\n", ans[i] + 1);
        }
    }
}

Compilation message

met.cpp: In function 'int main()':
met.cpp:87:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   87 |     scanf("%d%d", &m, &n);
      |     ~~~~~^~~~~~~~~~~~~~~~
met.cpp:89:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   89 |         scanf("%d", &sectors[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~
met.cpp:94:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |         scanf("%d", &need[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~
met.cpp:97:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |     scanf("%d", &q);
      |     ~~~~~^~~~~~~~~~
met.cpp:100:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  100 |         scanf("%d%d%d", &l, &r, &a);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 12624 KB Output is correct
2 Correct 3 ms 12624 KB Output is correct
3 Correct 3 ms 12624 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 12624 KB Output is correct
2 Correct 4 ms 12716 KB Output is correct
3 Correct 4 ms 12792 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 46 ms 13900 KB Output is correct
2 Correct 96 ms 15688 KB Output is correct
3 Correct 64 ms 14004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 73 ms 13904 KB Output is correct
2 Correct 75 ms 13904 KB Output is correct
3 Correct 97 ms 14924 KB Output is correct
4 Correct 18 ms 13904 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 67 ms 13792 KB Output is correct
2 Correct 106 ms 15176 KB Output is correct
3 Correct 58 ms 13136 KB Output is correct
4 Correct 65 ms 14256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 85 ms 13532 KB Output is correct
2 Correct 86 ms 13904 KB Output is correct
3 Correct 53 ms 13648 KB Output is correct
4 Correct 88 ms 14664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 622 ms 25716 KB Output is correct
2 Correct 366 ms 17996 KB Output is correct
3 Correct 336 ms 15696 KB Output is correct
4 Correct 671 ms 27176 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 578 ms 24128 KB Output is correct
2 Correct 379 ms 18076 KB Output is correct
3 Correct 272 ms 15696 KB Output is correct
4 Correct 777 ms 28784 KB Output is correct