Submission #230014

# Submission time Handle Problem Language Result Execution time Memory
230014 2020-05-07T18:20:31 Z Vimmer Sunčanje (COCI18_suncanje) C++14
130 / 130
2862 ms 94236 KB
#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("-O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("fast-math")
//#pragma GCC optimize("no-stack-protector")

#define F first
#define S second
#define sz(x) int(x.size())
#define pb push_back
#define N 100005
#define MOD ll(998244353)

using namespace std;

using namespace __gnu_pbds;

typedef long double ld;
typedef long long ll;

typedef short int si;

typedef tree <int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

void del(vector <int> &g)
{
    sort(g.begin(), g.end());

    g.resize(unique(g.begin(), g.end()) - g.begin());
}
struct st{

    vector <int> g, fen;

    int kol;

    st() : kol(0), g(0), fen(0) {}

    void build()
    {
        del(g);

        fen.resize(sz(g));
    }

    void upd(int y)
    {
        int v = upper_bound(g.begin(), g.end(), y) - g.begin() - 1;

        for (; v < sz(g); v = (v | (v + 1))) fen[v]++;

        kol++;
    }
    int sm(int y)
    {
        int ans = 0;

        int v = upper_bound(g.begin(), g.end(), y) - g.begin() - 1;

        for (; v >= 0; v = (v & (v + 1)) - 1) ans += fen[v];

        return ans;
    }
};

ordered_set lf, rg, up, dw;

st t[4][N];

vector <int> x1, x2;

int calcer(int x, int y, int xr, int yr)
{
    int kol = 0;

    int v = upper_bound(x2.begin(), x2.end(), x) - x2.begin() - 1;

    for (; v >= 0; v = (v & (v + 1)) - 1) kol += t[0][v].kol - t[0][v].sm(yr - 1);

    v = upper_bound(x2.begin(), x2.end(), x) - x2.begin() - 1;

    for (; v >= 0; v = (v & (v + 1)) - 1) kol += t[2][v].sm(y);

    v = sz(x1) - (lower_bound(x1.begin(), x1.end(), xr) - x1.begin()) - 1;

    for (; v >= 0; v = (v & (v + 1)) - 1) kol += t[1][v].kol - t[1][v].sm(yr - 1);

    v = sz(x1) - (lower_bound(x1.begin(), x1.end(), xr) - x1.begin()) - 1;

    for (; v >= 0; v = (v & (v + 1)) - 1) kol += t[3][v].sm(y);

    return kol;
}

void add(int x, int y, int xr, int yr)
{
    lf.insert(x);

    rg.insert(xr);

    up.insert(yr);

    dw.insert(y);

    int v = lower_bound(x2.begin(), x2.end(), xr) - x2.begin();

    for (; v < sz(x2); v = (v | (v + 1))) t[0][v].upd(y);

    v = lower_bound(x2.begin(), x2.end(), xr) - x2.begin();

    for (; v < sz(x2); v = (v | (v + 1))) t[2][v].upd(yr);

    v = sz(x1) - (lower_bound(x1.begin(), x1.end(), x) - x1.begin()) - 1;

    for (; v < sz(x1); v = (v | (v + 1))) t[1][v].upd(y);

    v = sz(x1) - (lower_bound(x1.begin(), x1.end(), x) - x1.begin()) - 1;

    for (; v < sz(x1); v = (v | (v + 1))) t[3][v].upd(yr);
}

int calc(int x, int y, int xr, int yr)
{
    int kol = 0;

    kol += rg.order_of_key(x + 1);

    kol += up.order_of_key(y + 1);

    kol += sz(lf) - lf.order_of_key(xr);

    kol += sz(dw) - dw.order_of_key(yr);

    return kol;
}

int main()
{
   // freopen("input.txt", "r", stdin);// freopen("output.txt", "w", stdout);

    ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int n;

    cin >> n;

    int x[n], y[n], xr[n], yr[n];

    for (int i = 0; i < n; i++)
    {
        cin >> x[i] >> y[i] >> xr[i] >> yr[i];

        xr[i] += x[i];

        yr[i] += y[i];

        x1.pb(x[i]);

        x2.pb(xr[i]);
    }

    del(x1); del(x2);

    for (int i = 0; i < n; i++)
    {
        int v = lower_bound(x2.begin(), x2.end(), xr[i]) - x2.begin();

        for (; v < sz(x2); v = (v | (v + 1))) t[0][v].g.pb(y[i]);

        v = lower_bound(x2.begin(), x2.end(), xr[i]) - x2.begin();

        for (; v < sz(x2); v = (v | (v + 1))) t[2][v].g.pb(yr[i]);

        v = sz(x1) - (lower_bound(x1.begin(), x1.end(), x[i]) - x1.begin()) - 1;

        for (; v < sz(x1); v = (v | (v + 1))) t[1][v].g.pb(y[i]);

        v = sz(x1) - (lower_bound(x1.begin(), x1.end(), x[i]) - x1.begin()) - 1;

        for (; v < sz(x1); v = (v | (v + 1))) t[3][v].g.pb(yr[i]);
    }

    for (int i = 0; i < sz(x1); i++) {t[1][i].build(); t[3][i].build();}

    for (int i = 0; i < sz(x2); i++) {t[2][i].build(); t[0][i].build();}

    bool ans[n];

    for (int i = n - 1; i >= 0; i--)
    {
        int cx = x[i], cy = y[i], xc = xr[i], yc = yr[i];

        int kol = calc(cx, cy, xc, yc);

        kol -= calcer(cx, cy, xc, yc);

        ans[i] = (kol == n - i - 1);

        add(cx, cy, xc, yc);
    }

    for (int i = 0; i < n; i++) cout << (ans[i] ? "DA" : "NE") << '\n';
}

Compilation message

suncanje.cpp: In constructor 'st::st()':
suncanje.cpp:40:9: warning: 'st::kol' will be initialized after [-Wreorder]
     int kol;
         ^~~
suncanje.cpp:38:18: warning:   'std::vector<int> st::g' [-Wreorder]
     vector <int> g, fen;
                  ^
suncanje.cpp:42:5: warning:   when initialized here [-Wreorder]
     st() : kol(0), g(0), fen(0) {}
     ^~
# Verdict Execution time Memory Grader output
1 Correct 68 ms 25336 KB Output is correct
2 Correct 95 ms 26748 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 199 ms 30200 KB Output is correct
2 Correct 985 ms 53108 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 415 ms 36652 KB Output is correct
2 Correct 1295 ms 60432 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 626 ms 42432 KB Output is correct
2 Correct 1030 ms 54260 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1124 ms 54480 KB Output is correct
2 Correct 1429 ms 63640 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1216 ms 56156 KB Output is correct
2 Correct 1392 ms 61428 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1202 ms 55912 KB Output is correct
2 Correct 1663 ms 67128 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2056 ms 72352 KB Output is correct
2 Correct 1323 ms 58508 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2257 ms 77268 KB Output is correct
2 Correct 2220 ms 80092 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2738 ms 88656 KB Output is correct
2 Correct 2862 ms 94236 KB Output is correct