Submission #375291

# Submission time Handle Problem Language Result Execution time Memory
375291 2021-03-09T06:37:09 Z hhh07 Meteors (POI11_met) C++14
100 / 100
3106 ms 43456 KB
#include <iostream>
#include <algorithm>
#include <cmath>
#include <map>
#include <climits>
#include <vector>
#include <utility>

using namespace std;

typedef unsigned long long ll;
typedef pair<ll, ll> ii;

vector<ll> fen(3e5 + 3, 0);
ll n, m;

ll sum(ll k){
    ll s = 0;
    while(k > 0){
        s += fen[k];
        k -= k&-k;
    }
    return s;
}

void add(ll k, ll x){
    while(k <= m + 2){
        fen[k] += x;
        k += k&-k;
    }
}

struct query{
    ll l, r, val;
};

int main(){
    cin >> n >> m;
    ll p[n];
    int o;
    vector<vector<ll>> states(n + 1, vector<ll> ());
    for (ll i = 0; i < m; i++){
        cin >> o;
        states[o - 1].push_back(i);
    }
    for (ll i = 0; i < n; i++)
        cin >> p[i];
    
    ll k;
    cin >> k;
    vector<query> q; query Q;
    for (ll i = 0; i < k; i++){
        cin >> Q.l >> Q.r >> Q.val;
        Q.l--; Q.r--;
        q.push_back(Q);
    }
    vector<ll> lo(n, 0), hi(n, k), rj(n, -1);
    ll cnt = 0;
    while(cnt < n){
        vector<ii> mid(n);
        for (ll i = 0; i < n; i++)
            mid[i] = {(lo[i] + hi[i])/2, i};
        sort(mid.begin(), mid.end());
        for (int i = 0; i <= m + 2; i++)
            fen[i] = 0;
        ll j = 0;
        for (ll i = 0; i < k; i++){
            if (q[i].l <= q[i].r){
                add(q[i].l + 1, q[i].val);
                add(q[i].r + 2, -q[i].val);
            }
            else{
                add(q[i].l + 1, q[i].val);
                add(m + 1, -q[i].val);
                add(1, q[i].val);
                add(q[i].r + 2, -q[i].val);
            }

            while(j < n && mid[j].first == i){
                ll idx = mid[j].second;
                if (rj[idx] == -1){
                    ll suma = 0;
                    for (ll l = 0; l < states[idx].size(); l++){
                        suma += sum(states[idx][l] + 1);
                        if (suma >= p[idx])
                            break;
                    }
                    
                    if (suma >= p[idx])
                        hi[idx] = i;
                    else
                        lo[idx] = i + 1;
                    
                    if (lo[idx] >= hi[idx]){
                        cnt++;
                        rj[idx] = lo[idx];
                    }
                }
                j++;
            }
        }
        
        
    }
    for (ll i = 0; i < n; i++){
        if (rj[i] == k)
            cout << "NIE" << endl;
        else
            cout << rj[i] + 1 << endl;
    }
    return 0;
    
}

Compilation message

met.cpp: In function 'int main()':
met.cpp:64:27: warning: comparison of integer expressions of different signedness: 'int' and 'll' {aka 'long long unsigned int'} [-Wsign-compare]
   64 |         for (int i = 0; i <= m + 2; i++)
      |                         ~~^~~~~~~~
met.cpp:81:29: warning: comparison of integer expressions of different signedness: '__gnu_cxx::__alloc_traits<std::allocator<long long unsigned int>, long long unsigned int>::value_type' {aka 'long long unsigned int'} and 'int' [-Wsign-compare]
   81 |                 if (rj[idx] == -1){
# Verdict Execution time Memory Grader output
1 Correct 4 ms 2804 KB Output is correct
2 Correct 6 ms 2796 KB Output is correct
3 Correct 4 ms 2796 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 2796 KB Output is correct
2 Correct 5 ms 2796 KB Output is correct
3 Correct 6 ms 2796 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 124 ms 5932 KB Output is correct
2 Correct 241 ms 7780 KB Output is correct
3 Correct 184 ms 6752 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 174 ms 6248 KB Output is correct
2 Correct 195 ms 6376 KB Output is correct
3 Correct 243 ms 7776 KB Output is correct
4 Correct 89 ms 5184 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 127 ms 5988 KB Output is correct
2 Correct 233 ms 7676 KB Output is correct
3 Correct 77 ms 4964 KB Output is correct
4 Correct 205 ms 7012 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 137 ms 5732 KB Output is correct
2 Correct 188 ms 6368 KB Output is correct
3 Correct 122 ms 5992 KB Output is correct
4 Correct 260 ms 8164 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1782 ms 30932 KB Output is correct
2 Correct 881 ms 25316 KB Output is correct
3 Correct 386 ms 11216 KB Output is correct
4 Correct 2835 ms 39876 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1740 ms 30160 KB Output is correct
2 Correct 847 ms 23920 KB Output is correct
3 Correct 361 ms 11484 KB Output is correct
4 Correct 3106 ms 43456 KB Output is correct