답안 #479170

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
479170 2021-10-10T14:05:04 Z Bogdan1110 Meteors (POI11_met) C++14
74 / 100
1959 ms 52148 KB
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define pb push_back
#define fi first
#define se second
#define ld long double
#define n_4 10010
#define n_5 100010
#define n_6 1000010
#define n_7 10000010
#define n_8 100000010
#define pii pair<int,int>
#define pll pair<long long,long long>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
 
#define ordered_set tree<ld, null_type,less<ld>, rb_tree_tag,tree_order_statistics_node_update>
// order_of_key -> # less than k
// find_by_order -> k-th element
// pq max element
const int NMAX = 30 + 6*1e5;
int N, M, K, l[NMAX], r[NMAX], L[NMAX], R[NMAX], res[NMAX];
ll bit[NMAX], potrebno[NMAX], x[NMAX];
vector<int>sec[NMAX];
vector<int>q[NMAX];


void update(int ind, ll koliko) {
    while(ind < NMAX) {
        bit[ind] += koliko;
        ind += ind&(-ind);
    }
}

ll query(int ind) {
    ll sum = 0;
    while(ind > 0) {
        sum += bit[ind];
        ind -= ind&-ind;
    }
    return sum;
}

void solve() {
    cin >> N >> M;
    for (int i = 1 ; i <= M ; i++ ) {
        int o;
        cin >> o;
        sec[o].pb(i);
    }
    for (int i = 1 ; i <= N ; i++ ) {
        int p ;
        cin >> p;
        potrebno[i] = p;
    }

    cin >> K;

    for (int i = 1; i <= K ; i++) {
        cin >> l[i] >> r[i] >> x[i];
    }
    for (int i = 1 ; i <= N ; i++ ) {
        L[i] = 1;
        R[i] = K;
        res[i] = K+1;
        //cout << sec[i].size() << endl;
    }

    bool changed = 1;
    while(changed) {
        changed = 0;
        fill(bit, bit+NMAX, 0LL);
        for (int i = 1 ; i <= K ; i++ ) q[i].clear();

        for (int i = 1 ; i <= N ; i++ ) {
            if ( L[i] <= R[i] ) {
                changed = 1;
                int mid = (L[i] + R[i])/2;
                q[mid].pb(i);
            }
        }

        for (int i = 1 ; i <= K ; i++ ) {
            if ( l[i] <= r[i] ) {
                update(l[i], x[i]);
                update(r[i]+1, -x[i]);
            }
            else {
                update(1,x[i]);
                update(r[i]+1, -x[i]);
                update(l[i], x[i]);
            }

            for (auto u : q[i]) {
                ll sum = 0;
                for (int s : sec[u]) {
                    sum += query(s);
                    //if ( sum >= potrebno[u] ) break;
                }
                if ( sum >= potrebno[u] ) {
                    res[u] = i;
                    R[u] = i-1;
                }
                else L[u] = i+1;
                //cout << i << ' ' << u << ' ' << sum << endl ;
            }
        }


    }

    for (int i = 1 ; i <= N ; i++ ) {
        //cout << L[i] << ' ' << R[i] << ' ';
        if ( res[i] == K+1 ) {
            puts("NIE");
        }
        else cout << res[i] << endl ;
    }

} 
 
int main () {
        solve(); 
} 
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 33236 KB Output is correct
2 Correct 22 ms 33228 KB Output is correct
3 Correct 22 ms 33244 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 33264 KB Output is correct
2 Correct 23 ms 33256 KB Output is correct
3 Correct 22 ms 33332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 143 ms 34884 KB Output is correct
2 Correct 230 ms 36952 KB Output is correct
3 Correct 211 ms 36508 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 236 ms 35908 KB Output is correct
2 Correct 238 ms 35940 KB Output is correct
3 Correct 270 ms 37036 KB Output is correct
4 Correct 77 ms 35140 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 212 ms 35296 KB Output is correct
2 Correct 316 ms 37588 KB Output is correct
3 Correct 209 ms 34116 KB Output is correct
4 Correct 213 ms 36944 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 223 ms 34388 KB Output is correct
2 Correct 249 ms 35888 KB Output is correct
3 Correct 168 ms 34620 KB Output is correct
4 Correct 260 ms 38256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1959 ms 52148 KB Output is correct
2 Incorrect 1863 ms 39228 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1588 ms 50788 KB Output is correct
2 Incorrect 1175 ms 39104 KB Output isn't correct
3 Halted 0 ms 0 KB -