#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
//using namespace __gnu_pbds;
#define LongDepTrai "fortunetelling2"
#define ll long long
#define int long long
#define ull unsigned long long
#define ld long double
#define ii pair<int,int>
#define iii pair<int,ii>
#define iv pair<ii,ii>
#define pll pair<ll,ll>
#define vi vector<int>
#define vii vector<ii>
#define vll vector<ll>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define sz(x) int((x).size())
#define order_set(T) tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>
inline ll add(ll a, ll b, ll mod){ a += b; if(a >= mod) a -= mod; return a; }
inline ll sub(ll a, ll b, ll mod){ a -= b; if(a < 0) a += mod; return a; }
inline ll mul(ll a, ll b, ll mod){ return ( (ll)a * b ) % mod; }
static mt19937_64 rng((unsigned)chrono::steady_clock::now().time_since_epoch().count());
const int N=5e5+9;
int n,k,a[N],b[N],t[N],mark[N],node[4*N],beo[4*N],chodo[N*4];
void Update(int i,int l,int r,int pos,int val){
if(l>pos || r<pos) return;
if(l==r){
node[i]=val;
beo[i]=1;
return;
}
Update(i*2,l,(l+r)/2,pos,val);
Update(i*2+1,(l+r)/2+1,r,pos,val);
node[i]=max(node[i*2],node[i*2+1]);
beo[i]=beo[i*2]+beo[i*2+1];
}
int Find(int i,int l,int r,int u,int v){
if(l>v || r<u) return -1;
if(l<=u && v<=r) return node[i];
return max(Find(i*2,l,r,u,(u+v)/2),Find(i*2+1,l,r,(u+v)/2+1,v));
}
int Find2(int i,int l,int r,int u,int v){
if(l>v || r<u) return 0;
if(l<=u && v<=r) return beo[i];
return Find2(i*2,l,r,u,(u+v)/2)+Find2(i*2+1,l,r,(u+v)/2+1,v);
}
void Update2(int i,int l,int r,int pos,int val){
if(l>pos || r<pos) return;
if(l==r){
chodo[i]=1;
return;
}
Update2(i*2,l,(l+r)/2,pos,val);
Update2(i*2+1,(l+r)/2+1,r,pos,val);
chodo[i]=chodo[i*2]+chodo[i*2+1];
}
int Find3(int i,int l,int r,int u,int v){
if(l>v || r<u) return 0;
if(l<=u && v<=r) return chodo[i];
return Find3(i*2,l,r,u,(u+v)/2)+Find3(i*2+1,l,r,(u+v)/2+1,v);
}
vi v;
int idx(int val){
return((lower_bound(v.begin(),v.end(),val)-v.begin())+1);
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
if(fopen(LongDepTrai".inp","r")){
freopen(LongDepTrai".inp","r",stdin);
freopen(LongDepTrai".out","w",stdout);
}
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
}
for(int i=1;i<=k;i++){
cin>>t[i];
v.pb(t[i]);
}
for(int i=1;i<=n;i++){
v.pb({min(a[i],b[i])});
v.pb({max(a[i],b[i])});
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
int m=v.size()+1;
for(int i=1;i<=m;i++){
Update(1,1,m,i,-1);
}
for(int i=1;i<=k;i++){
Update(1,1,m,idx(t[i]),i);
}
int res=0;
vii qr;
for(int i=1;i<=n;i++){
int l=idx(min(a[i],b[i]));
int r=idx(max(a[i],b[i])-1);
int j=Find(1,l,r,1,m);
if(j==-1){
int tmp=Find2(1,idx(max(a[i],b[i])),m,1,m);
if(tmp%2==0) res+=a[i];
else res+=b[i];
continue;
}
qr.pb({j,i});
}
sort(qr.begin(),qr.end(),greater<ii>());
int j=k;
for(ii x:qr){
while(j>=x.fi){
Update2(1,1,m,idx(t[j]),1);
j--;
}
int tmp=Find3(1,idx(max(a[x.se],b[x.se])),m,1,m);
if(tmp%2==0) res+=max(a[x.se],b[x.se]);
else res+=min(a[x.se],b[x.se]);
}
cout<<res;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
fortune_telling2.cpp: In function 'int main()':
fortune_telling2.cpp:80:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
80 | freopen(LongDepTrai".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fortune_telling2.cpp:81:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
81 | freopen(LongDepTrai".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |