Submission #239718

#TimeUsernameProblemLanguageResultExecution timeMemory
239718MvCFortune Telling 2 (JOI14_fortune_telling2)C++11
100 / 100
388 ms20308 KiB
#pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> #define rc(x) return cout<<x<<endl,0 #define pb push_back #define mkp make_pair #define in insert #define er erase #define fd find #define fr first #define sc second #define all(x) x.begin(),x.end() #define lun(x) (int)x.size() typedef long long ll; typedef long double ld; const ll INF=0x3f3f3f3f3f3f3f3f; const ll llinf=(1LL<<60); const int inf=(1<<30); const int nmax=2e5+50; const ll mod=1e9+7; using namespace std; int n,k,i,j,x,mn,mx,a[nmax],b[nmax],q[nmax],st[4*nmax],fw[nmax],sw[nmax],sz; ll rs; vector<int>vc; vector<pair<int,int> >vec[nmax]; void ufw(int i) { for(;i>=1;i-=i&(-i))fw[i]++; } int qfw(int i) { int ans=0; for(;i<=sz;i+=i&(-i))ans+=fw[i]; return ans; } void upd(int nod,int l,int r,int p,int v) { if(l==r) { st[nod]=v; return; } int mid=(l+r)/2; if(p<=mid)upd(2*nod,l,mid,p,v); else upd(2*nod+1,mid+1,r,p,v); st[nod]=max(st[2*nod],st[2*nod+1]); } int qry(int nod,int l,int r,int tl,int tr) { if(tr<l || tl>r)return 0; if(tl<=l && r<=tr)return st[nod]; int mid=(l+r)/2; return max(qry(2*nod,l,mid,tl,tr),qry(2*nod+1,mid+1,r,tl,tr)); } int main() { //freopen("sol.in","r",stdin); //freopen("sol.out","w",stdout); //mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0); cin>>n>>k; for(i=1;i<=n;i++)cin>>a[i]>>b[i]; for(i=1;i<=k;i++) { cin>>q[i]; vc.pb(q[i]); } sort(all(vc)); vc.resize(unique(all(vc))-vc.begin()); sz=lun(vc); for(i=1;i<=k;i++) { q[i]=lower_bound(all(vc),q[i])-vc.begin()+1; upd(1,1,sz,q[i],i); } for(i=1;i<=n;i++) { mn=min(a[i],b[i]),mx=max(a[i],b[i]); mn=lower_bound(all(vc),mn)-vc.begin()+1; mx=lower_bound(all(vc),mx)-vc.begin(); x=0; if(mn<=mx && mx<=sz)x=qry(1,1,sz,mn,mx); if(x) { sw[i]=1; if(a[i]>b[i])swap(a[i],b[i]); } vec[x].pb(mkp(i,mx+1)); } for(i=k;i>=0;i--) { for(j=0;j<lun(vec[i]);j++)sw[vec[i][j].fr]^=(qfw(vec[i][j].sc)&1); if(i)ufw(q[i]); } for(i=1;i<=n;i++) { if(sw[i])rs+=1LL*b[i]; else rs+=1LL*a[i]; } cout<<rs<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...