제출 #1286067

#제출 시각아이디문제언어결과실행 시간메모리
1286067Faisal_Saqib운세 보기 2 (JOI14_fortune_telling2)C++20
4 / 100
3080 ms9988 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int N=2e5+100; pair<int,int> a[N]; int n,k; struct { int mxa,mxb; bool lazy=0; }seg[N*4]; // we will flip a range iff mx<=t then lazy^=1 // else We push the lazy downward void push(int v) { int lc=2*v,rc=lc+1; if(seg[v].lazy) { seg[v].lazy=0; swap(seg[v].mxa,seg[v].mxb); seg[lc].lazy=!seg[lc].lazy; seg[rc].lazy=!seg[rc].lazy; } } void Build(int l=1,int r=n,int v=1) { if(l==r) { seg[v].mxa=a[l].first; seg[v].mxb=a[l].second; return; } int m=(l+r)/2; int lc=2*v,rc=lc+1; Build(l,m,lc); Build(m+1,r,rc); seg[v].mxa=max(seg[lc].mxa,seg[rc].mxa); seg[v].mxb=max(seg[lc].mxb,seg[rc].mxb); } void Update(int&t,int l=1,int r=n,int v=1) { push(v); if(seg[v].mxa<=t) { seg[v].lazy=!seg[v].lazy; push(v); return; } if(l==r)return; int m=(l+r)/2,lc=2*v,rc=lc+1; Update(t,l,m,lc); Update(t,m+1,r,rc); seg[v].mxa=max(seg[lc].mxa,seg[rc].mxa); seg[v].mxb=max(seg[lc].mxb,seg[rc].mxb); } ll ans=0; void Answer(int l=1,int r=n,int v=1) { push(v); if(l==r) { ans+=seg[v].mxa; return; } int m=(l+r)/2; int lc=2*v,rc=lc+1; Answer(l,m,lc); Answer(m+1,r,rc); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>k; for(int i=1;i<=n;i++) { cin>>a[i].first>>a[i].second; } sort(a+1,a+n+1); Build(); for(int i=1;i<=k;i++) { int t; cin>>t; Update(t); } Answer(); cout<<ans<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...