Submission #1272438

#TimeUsernameProblemLanguageResultExecution timeMemory
1272438huudaiExamination (JOI19_examination)C++20
100 / 100
135 ms6204 KiB
#include <bits/stdc++.h>
//#define int long long
#define pii pair<int, int>
#define fi first
#define se second
#define vi vector<int>
#define pb push_back
#define MASK(i) (1ll<<(i))
#define BI(mask,i) (((mask)>>(i))&1)
#define x0 ___x0
#define y0 ___y0
#define pos POSDFSD
using namespace std;

//const int mod = ;
//void add (int &a, const int&b){
//    a+=b;
//    if (a>=mod) a-=mod;
//}
//
//void sub (int&a, const int&b){
//    a-=b;
//    if (a<0) a+=mod;
//}
//
//void mul (int&a, const int&b){
//    a = 1ll*a*b%mod;
//}

template <class X, class Y>
    bool maximize (X&x, const Y&y){
        if (x>=y) return false;
        x = y;
        return true;
    }

template <class X, class Y>
    bool minimize (X&x, const Y&y){
        if (x<=y) return false;
        x = y;
        return true;
    }
////////////////////////////////////////////////////////////////////////////////////////////////////////
//const int lim = , limit =, mod = ;
const int lim = 1e5, limit = lim+5, lim2 = 2e5, limit2 = lim2+5;

struct ele{
    int t1, t2, sum, id;
};

ele query[limit], A[limit];
int n, q;

namespace sub1{
    void process(){
        for (int tv = 1; tv<=q; tv++){
            int T1 = query[tv].t1, T2 = query[tv].t2, SUM = query[tv].sum;
            int ret = 0;
            for (int i=1; i<=n; i++){
                if (A[i].t1>=T1 && A[i].t2>=T2 && A[i].sum>=SUM) ret++;
            }
            cout<<ret<<"\n";
        }
    }
}

bool compsum(const ele&a, const ele&b){
    return a.sum >b.sum;
}

namespace sub4{
    int BIT[limit2];
    vector <int> ds;
    int ans[limit];
    void update (int id, int val){
        while (id<=lim2){
            BIT[id] += val;
            id+=(id&(-id));
        }
    }
    //
    int get (int id){
        int ret = 0;
        while (id>0){
            ret += BIT[id];
            id&=id-1;
        }
        return ret;
    }
    //
    int finds (int val){
        int l = 1, r = ds.size()-1, ret = 1;
        while (l<=r){
            int mid = (l+r)/2;
            if (ds[mid]>=val){
                ret = mid;
                r = mid-1;
            }
            else l = mid+1;
        }
        return ret;
    }
    //
    void compress1 (){
        ds.pb(-1);
        for (int i=1; i<=n; i++){
            ds.pb(A[i].t1);
        }
        for (int i=1; i<=q; i++){
            ds.pb(query[i].t1);
        }
        sort (ds.begin(), ds.end());
        ds.erase (unique(ds.begin(), ds.end()), ds.end());
        for (int i=1; i<=n; i++){
            A[i].t1 = finds (A[i].t1);
        }
        for (int i=1; i<=q; i++){
            query[i].t1 = finds (query[i].t1);
        }
    }
    //
    void compress2 (){
        ds.clear();
        while (!ds.empty()) ds.pop_back();
        ds.pb(-1);
        for (int i=1; i<=n; i++){
            ds.pb(A[i].t2);
        }
        for (int i=1; i<=q; i++){
            ds.pb(query[i].t2);
        }
        sort (ds.begin(), ds.end());
        ds.erase (unique(ds.begin(), ds.end()), ds.end());
        for (int i=1; i<=n; i++){
            A[i].t2 = finds (A[i].t2);
        }
        for (int i=1; i<=q; i++){
            query[i].t2 = finds (query[i].t2);
        }
    }
    //
    void process(){
        compress1 ();
        compress2 ();
        sort (A+1, A+n+1, compsum);
        sort (query+1, query+q+1, compsum);
        int cur = 1;
        for (int i=1; i<=q; i++){
            int sumq = query[i].sum, id = query[i].id;
            while (cur<=n && A[cur].sum>=sumq){
                cur++;
            }
            ans[id] = cur-1;
        }
        //
        cur = 1;
        for (int i=1; i<=q; i++){
            int sumq = query[i].sum, id = query[i].id;
            while (cur<=n && A[cur].sum>=sumq){
                update (A[cur].t1, 1);
                cur++;
            }
            ans[id] -= get (query[i].t1-1);
        }
        //
        cur = 1;
        for (int i=1; i<=lim2; i++) BIT[i] = 0;
        for (int i=1; i<=q; i++){
            int sumq = query[i].sum, id = query[i].id;
            while (cur<=n && A[cur].sum>=sumq){
                update (A[cur].t2, 1);
                cur++;
            }
            ans[id] -= get (query[i].t2-1);
        }
        for (int i=1; i<=q; i++) cout<<ans[i]<<"\n";
    }
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    //
    // freopen("ANHDEP.INP", "r", stdin);
    // freopen("ANHDEP.OUT", "w", stdout);
    cin>>n>>q;
    for (int i=1; i<=n; i++){
        cin>>A[i].t1>>A[i].t2;
        A[i].sum = A[i].t1 + A[i].t2;
        A[i].id = 0;
    }
    for (int i=1; i<=q; i++){
        cin>>query[i].t1>>query[i].t2>>query[i].sum;
        maximize (query[i].sum, query[i].t1+query[i].t2);
        query[i].id = i;
    }
    if (n*q<=10000000) sub1::process();
    else sub4::process();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...