제출 #1172270

#제출 시각아이디문제언어결과실행 시간메모리
1172270AlgorithmWarriorFortune Telling 2 (JOI14_fortune_telling2)C++20
100 / 100
202 ms5116 KiB
#include <bits/stdc++.h> using namespace std; int const MAX=2e5+5; int const LOG=20; int n,q; struct valpoz{ int val,poz; bool operator<(valpoz ot){ return val<ot.val; } }qry[MAX]; struct card{ int a,b; bool operator<(card ot){ return max(a,b)<max(ot.a,ot.b); } }cards[MAX]; int ub(int x){ return x&(-x); } struct AIB{ int maxim[MAX],cnt[MAX]; int n; void init(int n){ this->n=n; int i; for(i=1;i<=n;++i){ maxim[i]=0; cnt[i]=ub(i); } } int bin_search(int val){ int poz=0; int i; for(i=LOG-1;i>=0;--i) if(poz+(1<<i)<=n && maxim[poz+(1<<i)]<val) poz+=(1<<i); return poz; } int sum(int poz){ int s=0; while(poz){ s+=cnt[poz]; poz-=ub(poz); } return s; } void upd(valpoz nou){ auto [val,poz]=nou; while(poz<=n){ --cnt[poz]; maxim[poz]=val; poz+=ub(poz); } } }aib; void read(){ cin>>n>>q; int i; for(i=1;i<=n;++i) cin>>cards[i].a>>cards[i].b; for(i=1;i<=q;++i){ cin>>qry[i].val; qry[i].poz=q-i+1; } sort(cards+1,cards+n+1); sort(qry+1,qry+q+1); } long long solve(){ long long rez=0; int i; int id=1; aib.init(q); for(i=1;i<=n;++i){ auto [a,b]=cards[i]; int mxm=max(a,b); int mnm=min(a,b); while(id<=q && qry[id].val<mxm){ aib.upd(qry[id]); ++id; } int poz=aib.bin_search(mnm); int cnt=aib.sum(poz); if(poz==q){ if(cnt%2==0) rez+=a; else rez+=b; } else{ if(cnt%2==0) rez+=mxm; else rez+=mnm; } } return rez; } int main() { read(); cout<<solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...