This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int INF=1e9;
int lim=500;
int n;
struct point
{
int x,y,z;
} v[150005];
bool byx(point a,point b)
{
return a.x<b.x;
}
bool byy(pii a,pii b)
{
if(a.first!=b.first)
return a.first>b.first;
return a.second<b.second;
}
bool byz(pii a,pii b)
{
if(a.second!=b.second)
return a.second>b.second;
return a.first<b.first;
}
vector<pii> enable[150005];
map<pii,int> pozmin;
map<int,int> nrm;
int nrz;
int arb[4*150005];
void build(int nod,int st,int dr)
{
arb[nod]=INF;
if(st==dr)
return;
int mij=(st+dr)/2;
build(nod*2,st,mij);
build(nod*2+1,mij+1,dr);
}
void update(int nod,int st,int dr,int poz,int val)
{
if(st==dr)
{
arb[nod]=min(arb[nod],val);
return;
}
int mij=(st+dr)/2;
if(poz<=mij)
update(nod*2,st,mij,poz,val);
else
update(nod*2+1,mij+1,dr,poz,val);
arb[nod]=min(arb[nod*2],arb[nod*2+1]);
}
int query(int nod,int st,int dr,int a,int b)
{
if(st>=a&&dr<=b)
return arb[nod];
int rez=INF;
int mij=(st+dr)/2;
if(a<=mij)
rez=min(rez,query(nod*2,st,mij,a,b));
if(b>mij)
rez=min(rez,query(nod*2+1,mij+1,dr,a,b));
return rez;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int maxim=0;
cin>>n;
vector<int> myz;
for(int i=1;i<=n;i++)
{
cin>>v[i].x>>v[i].y>>v[i].z;
maxim=max(maxim,v[i].x);
maxim=max(maxim,v[i].y);
maxim=max(maxim,v[i].z);
myz.push_back(v[i].z);
}
sort(myz.begin(),myz.end());
myz.erase(unique(myz.begin(),myz.end()),myz.end());
for(int i=0;i<myz.size();i++)
nrm[myz[i]]=i+1;
nrz=myz.size();
int ans=-1;
sort(v+1,v+n+1,byx);
vector<pii> vals;
for(int i=1;i<=n;i++)
{
pii x={v[i].y,v[i].z};
if(pozmin.count(x)==0)
{
pozmin[x]=i;
vals.push_back(x);
}
}
sort(vals.begin(),vals.end(),byz);
build(1,1,n);
for(int i=0;i<vals.size();i++)
{
int j=i;
vector<pii> a;
while(j<vals.size()&&vals[j].second==vals[i].second)
{
a.push_back(vals[j]);
j++;
}
for(pii p:a)
{
int y=p.first;
int st=1;
int dr=n;
int poz=INF;
while(st<=dr)
{
int mij=(st+dr)/2;
if(query(1,1,n,1,mij)<y)
{
poz=mij;
dr=mij-1;
}
else
st=mij+1;
}
poz=max(poz,pozmin[p]);
if(poz<=n)
enable[poz].push_back(p);
}
for(pii p:a)
{
int poz=pozmin[p];
update(1,1,n,poz,p.first);
}
i=j-1;
}
build(1,1,nrz);
pii ymax={-INF,INF};
for(int i=1;i<=n;i++)
{
vector<point> a;
int j=i;
while(j<=n&&v[j].x==v[i].x)
{
a.push_back(v[j]);
j++;
}
for(point p:a)
{
if(ymax.first<=p.y)
continue;
int poz=nrm[ymax.second];
int st=poz+1;
int dr=nrz;
int best=poz;
while(st<=dr)
{
int mij=(st+dr)/2;
if(query(1,1,nrz,mij,nrz)<ymax.first)
{
best=mij;
st=mij+1;
}
else
dr=mij-1;
}
int z=myz[best-1];
if(z>p.z)
ans=max(ans,p.x+ymax.first+z);
}
j--;
for(int k=i;k<=j;k++)
{
int poz=nrm[v[k].z];
update(1,1,nrz,poz,v[k].y);
for(pii p:enable[k])
{
if(p.first>ymax.first||(p.first==ymax.first&&p.second<ymax.second))
ymax=p;
}
}
i=j;
}
cout<<ans;
return 0;
}
Compilation message (stderr)
team.cpp: In function 'int main()':
team.cpp:85:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
85 | for(int i=0;i<myz.size();i++)
| ~^~~~~~~~~~~
team.cpp:102:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
102 | for(int i=0;i<vals.size();i++)
| ~^~~~~~~~~~~~
team.cpp:106:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
106 | while(j<vals.size()&&vals[j].second==vals[i].second)
| ~^~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |