제출 #1216020

#제출 시각아이디문제언어결과실행 시간메모리
1216020alir3za_zar3운세 보기 2 (JOI14_fortune_telling2)C++20
0 / 100
1 ms576 KiB
// Alir3za.Zar3 -> Shiraz , Iran
#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//#define     int     long long

const int maxn = 6e5+7;
int n,k , a[maxn],b[maxn],t[maxn];
struct SEGMENT
{
    int T[maxn<<2] = {};
    void update 
    (int id , int v , int node=1 , int l=0 , int r=maxn)
    {
        if (l+1 == r)
        {
            T[node] = v;
            return;
        }
        int o=l+r>>1 , lc=node<<1 , rc=lc|1;
        if (id<o) update(id , v , lc , l , o);
        else update(id , v , rc , o , r);
        T[node] = max(T[lc] , T[rc]);
    }
    int query 
    (int lq , int rq , int node=1 , int l=0 , int r=maxn)
    {
        if (r<=lq or l>=rq) return 0;
        if (lq<=l and r<=rq) return T[node];
        int o=l+r>>1 , lc=node<<1 , rc=lc|1;
        return max( query(lq , rq , lc , l , o),
                    query(lq , rq , rc , o , r));
    }
} seg;
struct FENWICK
{
    int bit[maxn];
    void update (int id)
    {
        for (; id<maxn; id+=id&-id)
            bit[id]++;
    }
    int query (int id)
    {
        int out = 0;
        for (; id; id-=id&-id)
            out += bit[id];
        return out;
    }
} fen;

signed main ()
{
    ios::sync_with_stdio(false);
    cin.tie(0);     cout.tie(0);
    
    cin >> n >> k;
    vector<int> comp;
    for (int i=1; i<=n; i++)
    {
        cin >> a[i] >> b[i];
        comp.push_back(a[i]);
        comp.push_back(b[i]);
    }
    for (int i=1; i<=k; i++)
    {
        cin >> t[i];
        comp.push_back(t[i]);
    }
    sort(comp.begin() , comp.end());
    comp.resize(unique(comp.begin(),comp.end())-comp.begin());
    unordered_map<int , int> mp , mq;
    int sz = comp.size();
    for (int i=0; i<sz; i++)
        mp[comp[i]] = i+1 , mq[i+1] = comp[i];
    set<pair<int,int> , greater<pair<int,int>>> pq;
    for (int i=1; i<=k; i++)
        seg.update(mp[t[i]] , i),
        pq.insert({mp[t[i]] , i});
    vector<pair<int,int>> q;
    for (int i=1; i<=n; i++)
        a[i] = mp[a[i]] , b[i] = mp[b[i]],
        q.push_back({max(a[i] , b[i]) , i});
    sort(q.begin() , q.end() , greater<pair<int,int>>());
    int out = 0;
    for (auto [s , id] : q)
    {
        while (!pq.empty())
        {
            auto [v , T] = *pq.begin();
            if (v < s) break;
            pq.erase(pq.begin());
            fen.update(T);
        }
        int z = (a[id]==b[id] ? 0:seg.query(min(a[id] , b[id]) , s));
        int val = fen.query(maxn-1)-(z?fen.query(z):0);
        if (z == 0)
            if (val%2) out += mq[b[id]];
            else out += mq[a[id]];
        else
            if (val%2 == 0) out += mq[s];
            else out += min(mq[a[id]] , mq[b[id]]);
    }
    cout << out << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...