답안 #358619

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
358619 2021-01-26T02:09:55 Z mjhmjh1104 Meteors (POI11_met) C++17
74 / 100
1225 ms 29696 KB
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

long long tree[300006];

long long query(int x) {
    long long ret = 0;
    while (x > 0) {
        ret += tree[x];
        x -= x & -x;
    }
    return ret;
}

void update_fenwick(int x, long long v) {
    while (x < 300006) {
        tree[x] += v;
        x += x & -x;
    }
}

void update(int l, int r, long long v) {
    update_fenwick(l, v);
    update_fenwick(r + 1, -v);
}

struct Query {
    int q;
    int l;
    int r;
    int m;
};

int n, m, p[300006], q;
vector<pair<pair<int, int>, int>> updates;
vector<Query> queries;
vector<int> o[300006];

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; i++) {
        int t;
        scanf("%d", &t);
        o[t - 1].push_back(i);
    }
    for (int i = 0; i < n; i++) scanf("%d", p + i);
    scanf("%d", &q);
    for (int i = 0; i < q; i++) {
        int a, b, x;
        scanf("%d%d%d", &a, &b, &x);
        a--, b--;
        updates.push_back({ { a, b }, x });
    }
    for (int i = 0; i < n; i++) queries.push_back(Query{ i, 0, 300002, 150000 });
    for (int t = 0; t < 20; t++) {
        sort(queries.begin(), queries.end(), [](const Query &a, const Query &b) {
            return a.m < b.m;
        });
        fill(tree, tree + 300006, 0);
        int k = 0;
        for (int i = 0; i < q; i++) {
            while (k < n && i > queries[k].m) {
                if (queries[k].l < queries[k].r) {
                    long long sum = 0;
                    for (auto &j: o[queries[k].q]) sum += query(j + 1);
                    if (sum >= p[queries[k].q]) queries[k].r = queries[k].m;
                    else queries[k].l = queries[k].m + 1;
                    queries[k].m = (queries[k].l + queries[k].r) / 2;
                }
                k++;
            }
            if (updates[i].first.first <= updates[i].first.second) update(updates[i].first.first + 1, updates[i].first.second + 1, updates[i].second);
            else update(updates[i].first.first + 1, m, updates[i].second), update(1, updates[i].first.second + 1, updates[i].second);
        }
        for (; k < n; k++) if (queries[k].l < queries[k].r) {
            long long sum = 0;
            for (auto &j: o[queries[k].q]) sum += query(j + 1);
            if (sum >= p[queries[k].q]) queries[k].r = queries[k].m;
            else queries[k].l = queries[k].m + 1;
            queries[k].m = (queries[k].l + queries[k].r) / 2;
        }
    }
    sort(queries.begin(), queries.end(), [](const Query &a, const Query &b) {
        return a.q < b.q;
    });
    for (auto &i: queries) {
        if (i.l >= 300002) puts("NIE");
        else printf("%d\n", i.l + 1);
    }
}

Compilation message

met.cpp: In function 'int main()':
met.cpp:42:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   42 |     scanf("%d%d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~
met.cpp:45:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   45 |         scanf("%d", &t);
      |         ~~~~~^~~~~~~~~~
met.cpp:48:38: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   48 |     for (int i = 0; i < n; i++) scanf("%d", p + i);
      |                                 ~~~~~^~~~~~~~~~~~~
met.cpp:49:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   49 |     scanf("%d", &q);
      |     ~~~~~^~~~~~~~~~
met.cpp:52:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   52 |         scanf("%d%d%d", &a, &b, &x);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 9708 KB Output is correct
2 Correct 16 ms 9708 KB Output is correct
3 Correct 16 ms 9708 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 9708 KB Output is correct
2 Correct 16 ms 9836 KB Output is correct
3 Correct 17 ms 9836 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 108 ms 11748 KB Output is correct
2 Correct 233 ms 13284 KB Output is correct
3 Correct 147 ms 12516 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 169 ms 12404 KB Output is correct
2 Correct 175 ms 12388 KB Output is correct
3 Correct 222 ms 13288 KB Output is correct
4 Correct 61 ms 11240 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 135 ms 11772 KB Output is correct
2 Correct 233 ms 13416 KB Output is correct
3 Correct 200 ms 10980 KB Output is correct
4 Correct 155 ms 13028 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 180 ms 11796 KB Output is correct
2 Correct 215 ms 12524 KB Output is correct
3 Correct 120 ms 11876 KB Output is correct
4 Correct 226 ms 13412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1225 ms 29696 KB Output is correct
2 Incorrect 746 ms 22792 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1205 ms 28756 KB Output is correct
2 Incorrect 724 ms 21328 KB Output isn't correct
3 Halted 0 ms 0 KB -