Submission #365503

#TimeUsernameProblemLanguageResultExecution timeMemory
365503dooweyNew Home (APIO18_new_home)C++14
100 / 100
3500 ms381344 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

const int N = (int)3e5 + 5;
const int inf = (int)1e9;
map<int, int> cnt[N];
int x[N], t[N], a[N], b[N];

vector<int> cors;

struct lin{
    int tim;
    int lef;
    int rig;
    int mode;
};

int cur;

vector<lin> lis;


const int M = (int)2e6 + 10;
map<int, int> low[M];
map<int, int> high[M];

int segt[M * 2][2];
int m;

int getid(int pp){
    return lower_bound(cors.begin(), cors.end(), pp) - cors.begin();
}

void segm(int li, int ri, int mod){
    lis.push_back({cur, li, ri, mod});
    cors.push_back((li + ri) / 2);
}

void setv(int id, int q, int vl){
    id += m;
    segt[id][q] = vl;
    id /= 2;
    while(id > 0){
        if(q == 0) segt[id][q] = max(segt[id*2][q], segt[id*2+1][q]);
        else segt[id][q] = min(segt[id*2][q], segt[id*2+1][q]);
        id /= 2;
    }
}

int get(int li, int ri, int q){
    li += m;
    ri += m;
    int ret = 0;
    if(q == 0) ret = -inf;
    else ret = inf;
    while(li <= ri){
        if(li % 2 == 1){
            if(q == 0) ret = max(ret, segt[li][0]);
            else ret = min(ret, segt[li][1]);
            li ++ ;
        }
        if(ri % 2 == 0){
            if(q == 0) ret = max(ret, segt[ri][0]);
            else ret = min(ret, segt[ri][1]);
            ri -- ;
        }
        li /= 2;
        ri /= 2;
    }
    return ret;
}

int fin_p(int pp){
    int ix = getid(pp);
    return max(pp - get(ix, m - 1, 1), get(0, ix, 0) - pp);
}

void add_line(lin nw){
    int li = nw.lef;
    int ri = nw.rig;
    int vv = nw.mode;
    int mid = (li + ri) / 2;
    int mi = getid(mid);
    if(nw.mode == 0){
        low[mi][li] ++ ;
        high[mi][ri] ++ ;
    }
    else{
        low[mi][li] -- ;
        if(low[mi][li] == 0)
            low[mi].erase(li);
        high[mi][ri] -- ;
        if(high[mi][ri] == 0)
            high[mi].erase(ri);
    }
    int lw = inf;
    int rw = -inf;
    if(!low[mi].empty()){
        auto it = low[mi].begin();
        lw = min(lw, it->fi);
    }
    if(!high[mi].empty()){
        auto it = high[mi].end();
        it -- ;
        rw = max(rw, it->fi);
    }
    setv(mi, 1, lw);
    setv(mi, 0, rw);
}

void add(int typ, int v){
    cnt[typ][v] ++ ;
    auto it = cnt[typ].find(v);
    auto nx = it;
    auto pv = it;
    if(cnt[typ][v] == 1){
        nx ++ ;
    }
    pv -- ;
    segm(pv->fi, nx->fi, 1);
    segm(pv->fi, it->fi, 0);
    segm(it->fi, nx->fi, 0);
}

void del(int typ, int v){
    auto it = cnt[typ].find(v);
    auto nx = it;
    auto pv = it;
    if(cnt[typ][v] == 1){
        nx ++ ;
    }
    pv -- ;

    segm(pv->fi, it->fi, 1);
    segm(it->fi, nx->fi, 1);
    segm(pv->fi, nx->fi, 0);
    cnt[typ][v] -- ;
    if(cnt[typ][v] == 0){
        cnt[typ].erase(v);
    }
}

int xx[N];
int yr[N];

int soln[N];

int main(){
    fastIO;
    int n, k, q;
    cin >> n >> k >> q;
    vector<pii> eve;
    for(int i = 1; i <= n; i ++ ){
        cin >> x[i] >> t[i] >> a[i] >> b[i];
        x[i] *= 2;
        cors.push_back(x[i]);
        eve.push_back(mp(a[i], i));
        eve.push_back(mp(b[i] + 1, i));
    }
    vector<pii> ord;
    for(int i = 1; i <= q; i ++ ){
        cin >> xx[i] >> yr[i];
        xx[i] *= 2;
        cors.push_back(xx[i]);
        ord.push_back(mp(yr[i], i));
    }
    sort(ord.begin(), ord.end());
    sort(eve.begin(), eve.end());
    for(int i = 1; i <= k ; i ++ ){
        cnt[i][-inf] ++ ;
        cnt[i][inf] ++ ;
        segm(-inf, inf, 0);
    }
    for(int i = 0 ; i < eve.size(); i ++ ){
        cur = eve[i].fi;
        if(cur == a[eve[i].se]){
            add(t[eve[i].se], x[eve[i].se]);
        }
        else{
            del(t[eve[i].se], x[eve[i].se]);
        }
    }
    sort(cors.begin(), cors.end());
    cors.resize(unique(cors.begin(), cors.end()) - cors.begin());
    m = cors.size();
    for(int i = 0 ; i < m * 2; i ++ ){
        segt[i][0]=-inf;
        segt[i][1]=inf;
    }
    int it = 0;
    int vv;
    for(auto e : ord){
        while(it < lis.size() && lis[it].tim <= e.fi){
            add_line(lis[it]);
            it ++ ;
        }
        vv = fin_p(xx[e.se]);
        vv /= 2;
        if(vv > (int)1e8)
            soln[e.se] = -1;
        else
            soln[e.se] = vv;
    }
    for(int i = 1; i <= q; i ++ ){
        cout << soln[i] << "\n";
    }
    return 0;
}

Compilation message (stderr)

new_home.cpp: In function 'void add_line(lin)':
new_home.cpp:90:9: warning: unused variable 'vv' [-Wunused-variable]
   90 |     int vv = nw.mode;
      |         ^~
new_home.cpp: In function 'int main()':
new_home.cpp:183:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  183 |     for(int i = 0 ; i < eve.size(); i ++ ){
      |                     ~~^~~~~~~~~~~~
new_home.cpp:202:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<lin>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  202 |         while(it < lis.size() && lis[it].tim <= e.fi){
      |               ~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...