Submission #1100890

#TimeUsernameProblemLanguageResultExecution timeMemory
1100890giaminh2211Fortune Telling 2 (JOI14_fortune_telling2)C++14
100 / 100
533 ms51348 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define all(x) begin(x), end(x)

using namespace std;
using ll=long long;
using pii=pair<int, int>;

const int N=2e5+13;
int qr[N];

struct Segtree{
    vector<int> st[N << 2];

    void build(int id, int l, int r){
        if(l==r){
            st[id].push_back(qr[l]);
            return;
        }
        int mid=l+r >> 1;
        build(id << 1, l, mid);
        build(id << 1 | 1, mid+1, r);
        st[id].resize(st[id << 1].size() + st[id << 1 | 1].size());
        merge(all(st[id << 1]), all(st[id << 1 | 1]), begin(st[id]));
    }

    int get(int id, int l, int r, int u, int v, int x, int y){
        if(l > v || r < u) return 0;
        if(u<=l && r<=v){
            return upper_bound(all(st[id]), y)-lower_bound(all(st[id]), x);
        }
        int mid=l+r >> 1;
        int get1=get(id << 1, l, mid, u, v, x, y);
        int get2=get(id << 1 | 1, mid+1, r, u, v, x, y);
        return get1+get2;
    }

    int walk(int id, int l, int r, int x, int y){
        if(upper_bound(all(st[id]), y) == lower_bound(all(st[id]), x)) return -1;
        if(l==r) return l;
        int mid=l+r >> 1;
        int sus=walk(id << 1 | 1, mid+1, r, x, y);
        if(sus!=-1) return sus;
        return walk(id << 1, l, mid, x, y);
    }
} st;

int n, q;
pii a[N];
bool sus[N];
ll res=0;

void scan(){
    cin >> n >> q;
    for(int i=1; i<=n; i++){
        cin >> a[i].fi >> a[i].se;
        if(a[i].fi > a[i].se){
            swap(a[i].fi, a[i].se);
            sus[i]=1;
        }
    }
    for(int i=1; i<=q; i++){
        cin >> qr[i];
    }
    st.build(1, 1, q);
}

void solve(){
    for(int i=1; i<=n; i++){
        if(a[i].fi == a[i].se){
            res += a[i].fi;
            continue;
        }
        int id=st.walk(1, 1, q, a[i].fi, a[i].se-1);
       // cerr << i << ' ' << id << '\n';
        if(id==-1){
        	int cnt=st.get(1, 1, q, 1, q, a[i].se, 1e9);
        	//cerr << "? " << a[i].se << ' ' << cnt << '\n';
        	cnt%=2;
        	sus[i]^=cnt;
            if(sus[i]) res += a[i].se;
            else res += a[i].fi;
            continue;
        }
        int cnt=st.get(1, 1, q, id+1, q, a[i].se, 1e9);
        if(cnt%2==0){
        	res += a[i].se;
        	//cout << i << ' ' << a[i].se << '\n';
        }
        else{
        	res += a[i].fi;
        	//cout << i << ' ' << a[i].fi << '\n';
        }
    }
    cout << res;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    scan();
    solve();
}

Compilation message (stderr)

fortune_telling2.cpp: In member function 'void Segtree::build(int, int, int)':
fortune_telling2.cpp:21:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   21 |         int mid=l+r >> 1;
      |                 ~^~
fortune_telling2.cpp: In member function 'int Segtree::get(int, int, int, int, int, int, int)':
fortune_telling2.cpp:33:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   33 |         int mid=l+r >> 1;
      |                 ~^~
fortune_telling2.cpp: In member function 'int Segtree::walk(int, int, int, int, int)':
fortune_telling2.cpp:42:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   42 |         int mid=l+r >> 1;
      |                 ~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...