Submission #1220216

#TimeUsernameProblemLanguageResultExecution timeMemory
1220216ereringFortune Telling 2 (JOI14_fortune_telling2)C++20
0 / 100
8 ms13384 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define endl '\n' const int N=2e5+5,MOD=1e9+7,inf=1e18; int seg[N*4][2],offset=1; void update(int idx,int val,int type){ idx+=offset; if(!type)seg[idx][type]=max(seg[idx][type],val); else seg[idx][type]+=val; idx/=2; while(idx>0){ if(type)seg[idx][type]=seg[idx*2][type]+seg[idx*2+1][type]; else seg[idx][type]=max(seg[idx*2][type],seg[idx*2+1][type]); idx/=2; } } int query(int node,int qlo,int qhi,int lo,int hi,int type){ if(lo>=qlo && hi<=qhi)return seg[node][type]; if(lo>qhi || hi<qlo){ if(type)return 0; return -inf; } int mid=(lo+hi)/2; int x=query(node*2,qlo,qhi,lo,mid,type); int y=query(node*2+1,qlo,qhi,mid+1,hi,type); if(type)return x+y; return max(x,y); } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); for(int i=0;i<N*4;i++)seg[i][0]=-inf; int n,k; cin>>n>>k; int a[n],b[n],t[k]; set<int> s; for(int i=0;i<n;i++){ cin>>a[i]>>b[i]; s.insert(a[i]); s.insert(b[i]); } for(int i=0;i<k;i++){ cin>>t[i]; s.insert(t[i]); } unordered_map<int,int> mp,og; int cnt=0; for(auto i:s){ og[cnt]=i; mp[i]=cnt++; } while(offset<N)offset*=2; vector<pair<int,int>> v; for(int i=0;i<n;i++){ a[i]=mp[a[i]]; b[i]=mp[b[i]]; v.pb({max(a[i],b[i]),i}); } vector<pair<int,int>> vec; for(int i=0;i<k;i++){ t[i]=mp[t[i]]; vec.pb({t[i],i}); update(i,1,1); } sort(vec.begin(),vec.end()); sort(v.begin(),v.end()); int l=0,ans=0; for(auto i:vec){ while(l<v.size() && (i==vec.back() || v[l].first<=i.first)){ // cout<<"hi"; int ca=a[v[l].second],cb=b[v[l].second]; if(ca==cb){ ans+=og[ca]; l++; continue; } int idx=query(1,min(cb,ca),max(ca,cb)-1,0,offset-1,0); if(idx==-inf){ if(query(1,0,offset-1,0,offset-1,1)%2)ans+=og[cb]; else ans+=og[ca]; l++; continue; } int x=query(1,0,idx,0,offset-1,1),y=query(1,idx,offset-1,0,offset-1,1); if(ca<cb){ if(x%2)y+=x; else y+=x+1; } else{ if(x%2)y+=x+1; else y+=x; } if(y%2)ans+=og[cb]; else ans+=og[ca]; l++; } update(i.first,i.second,0); update(i.second,-1,1); } cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...