답안 #917717

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
917717 2024-01-28T16:41:22 Z _VIBE Team Contest (JOI22_team) C++17
0 / 100
97 ms 14720 KB
#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;
}

Compilation message

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);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 1 ms 600 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Incorrect 3 ms 604 KB Output isn't correct
15 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 1 ms 600 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Incorrect 3 ms 604 KB Output isn't correct
15 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 456 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 456 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 0 ms 344 KB Output is correct
11 Correct 97 ms 14720 KB Output is correct
12 Incorrect 51 ms 12236 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 456 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 456 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 0 ms 344 KB Output is correct
11 Correct 97 ms 14720 KB Output is correct
12 Incorrect 51 ms 12236 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 456 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 456 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 0 ms 344 KB Output is correct
11 Correct 97 ms 14720 KB Output is correct
12 Incorrect 51 ms 12236 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 456 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 456 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 0 ms 344 KB Output is correct
11 Correct 97 ms 14720 KB Output is correct
12 Incorrect 51 ms 12236 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 1 ms 600 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Incorrect 3 ms 604 KB Output isn't correct
15 Halted 0 ms 0 KB -