제출 #917717

#제출 시각아이디문제언어결과실행 시간메모리
917717_VIBETeam Contest (JOI22_team)C++17
0 / 100
97 ms14720 KiB
#include "bits/stdc++.h" using namespace std; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; #define ordered_set tree<int, null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update> typedef tree<pair<int,int>, null_type,less<pair<int,int>>, rb_tree_tag,tree_order_statistics_node_update>ordered_multiset; #define endl '\n' #define int long long const int inf=INT_MAX; void Excuse_Me(int TC) { int n; cin>>n; vector<vector<int>> g(n); vector<int> v; for(int i=0;i<n;i++){ int a,b,c; cin>>a>>b>>c; g[i]={a,b,c}; v.push_back(b); v.push_back(b-1); v.push_back(b+1); } sort(g.begin(),g.end()); sort(v.begin(),v.end()); v.resize(unique(v.begin(),v.end())-v.begin()); int m=v.size(); map<int,int> comp; for(int i=0;i<v.size();i++) comp[v[i]]=i; int mn[4*m],mx[4*m]; int t[4*m]; function<void(int,int,int)> build=[&](int s,int e,int i)->void{ if(s==e){ mn[i]=inf; mx[i]=-inf; t[i]=-inf; return; } int m=(s+e)/2; build(s,m,i*2); build(m+1,e,i*2+1); mn[i]=min(mn[i*2],mn[i*2+1]); mx[i]=max(mx[i*2],mx[i*2+1]); t[i]=-inf; }; build(0,m-1,1); vector<pair<int,int>> p; int ans=-1; function<void(int,int,int,int,int)> update=[&](int s,int e,int i,int pos,int val)->void{ if(s==e){ mn[i]=min(mn[i],val); mx[i]=max(mx[i],val); return; } int m=(s+e)/2; if(pos<=m) update(s,m,i*2,pos,val); else update(m+1,e,i*2+1,pos,val); mn[i]=min(mn[i*2],mn[i*2+1]); mx[i]=max(mx[i*2],mx[i*2+1]); }; function<int(int,int,int,int,int,bool)> get=[&](int s,int e,int i,int l,int r,bool ismax)->int{ if(l>r) return (ismax?(-inf):(inf)); if(s==l and r==e) return (ismax?mx[i]:mn[i]); int m=(s+e)/2; if(ismax) return max(get(s,m,i*2,l,min(m,r),ismax),get(m+1,e,i*2+1,max(m+1,l),r,ismax)); return min(get(s,m,i*2,l,min(m,r),ismax),get(m+1,e,i*2+1,max(m+1,l),r,ismax)); }; ordered_set b_entry; vector<int> entry(m,-1); function<int(int,int,int,int,int)> get1=[&](int s,int e,int i,int l,int r)->int{ if(l>r) return -1e9; if(s==l and r==e) return t[i]; int mi=(s+e)/2; return max(get1(s,mi,i*2,l,min(mi,r)),get1(mi+1,e,i*2+1,max(mi+i,l),r)); }; function<void(int,int,int,int,int)> update1=[&](int s,int e,int i,int pos,int val)->void{ if(s==e){ t[i]=val;return; } int m=(s+e)/2; if(pos<=m) update1(s,m,i*2,pos,val); else update1(m+1,e,i*2+1,pos,val); t[i]=max(t[i*2],t[i*2+1]); }; auto get_pair=[&](int b,int c)->int{ b=comp[b]; int l=b+1; int low=0,high=(int)b_entry.size()-1; int r=-1; int res=get1(0,m-1,1,0,b-1); while(low<=high){ int mi=(low+high)/2; if(entry[*b_entry.find_by_order(mi)]<=c) high=mi-1; else{ r=mi; low=mi+1; } } if(r==-1) return res; r=*b_entry.find_by_order(r); res=max(res,get1(0,m-1,1,l,r)); return res; }; auto update_pair=[&](pair<int,int> p)->void{ int b=comp[p.first]; int c=p.second; if(entry[b]==-1){ int ind=b_entry.order_of_key(b); entry[b]=c; update1(0,m-1,1,b,c+v[b]); ind--; vector<int> to_remove; while(ind>=0){ if(entry[*b_entry.find_by_order(ind)]<=c){ to_remove.push_back(*b_entry.find_by_order(ind)); ind--; } else break; } for(auto x:to_remove){ entry[x]=-1; b_entry.erase(b_entry.find_by_order(b_entry.order_of_key(x))); update1(0,m-1,1,x,0); } // debug(v[b],to_remove); // debug(v[b],to_remove,b_entry); b_entry.insert(b); ind=b_entry.order_of_key(b+1); if(ind==b_entry.size()) return; int temp=*b_entry.find_by_order(ind); if(entry[temp]>=c){ entry[b]=-1; b_entry.erase(b_entry.find_by_order(b_entry.order_of_key(b))); update1(0,m-1,1,b,0); } } else{ if(c>entry[b]){ entry[b]=c; update1(0,m-1,1,b,c+v[b]); int ind=b_entry.order_of_key(b); ind--; vector<int> to_remove; while(ind>=0){ if(entry[*b_entry.find_by_order(ind)]<=c){ to_remove.push_back(*b_entry.find_by_order(ind)); ind--; } else break; } for(auto x:to_remove){ entry[x]=-1; b_entry.erase(b_entry.find_by_order(b_entry.order_of_key(x))); update1(0,m-1,1,x,0); } } } }; for(int i=0;i<n;){ int j=i; vector<pair<int,int>> temp; while(j<n and (g[i][0]==g[j][0])){ ans=max(ans,g[j][0]+get_pair(g[j][1],g[j][2])); int b=g[j][1]; int c=g[j][2]; //taking this b as max // then i have to find max c in range 0,comp[b-1] //if this c is greater than my current c then i can take that pair int max_c=get(0,m-1,1,0,comp[b-1],true); if(max_c>c) temp.push_back({b,max_c}); //now my b will act as min and i have to find greatest index in range comp[b+1],m-1 such that its value is less than my current c int low=comp[b+1],high=m-1; int ind=-1; while(low<=high){ int mi=(low+high)/2; // find if min_c from range [mi,m-1] is less than my current_c int min_c=get(0,m-1,1,mi,m-1,false); if(min_c<c){ ind=mi; low=mi+1; } else{ high=mi-1; } } if(ind!=-1) temp.push_back({v[ind],c}); update(0,m-1,1,comp[b],c); j++; } i=j; for(auto x:temp) update_pair(x); for(auto x:b_entry) cerr<<v[x]<<" ->"<<entry[x]<<" "; cerr<<endl; } cout<<ans; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); freopen("error.txt","w",stderr); int Tc=1; // cin>>Tc; for(int tc=1;tc<=Tc;tc++) { Excuse_Me(tc); } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

team.cpp: In function 'void Excuse_Me(long long int)':
team.cpp:43:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |    for(int i=0;i<v.size();i++) comp[v[i]]=i;
      |                ~^~~~~~~~~
team.cpp: In lambda function:
team.cpp:218:19: warning: comparison of integer expressions of different signedness: 'long long int' and '__gnu_pbds::detail::bin_search_tree_set<long long int, __gnu_pbds::null_type, std::less_equal<long long int>, __gnu_pbds::detail::tree_traits<long long int, __gnu_pbds::null_type, std::less_equal<long long int>, __gnu_pbds::tree_order_statistics_node_update, __gnu_pbds::rb_tree_tag, std::allocator<char> >, std::allocator<char> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  218 |             if(ind==b_entry.size()) return;
      |                ~~~^~~~~~~~~~~~~~~~
team.cpp: In function 'int main()':
team.cpp:334:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  334 |     freopen("error.txt","w",stderr);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...