제출 #586242

#제출 시각아이디문제언어결과실행 시간메모리
586242abcvuitunggioTeam Contest (JOI22_team)C++17
100 / 100
1936 ms96920 KiB
#pragma GCC optimize("Ofast,unroll-loops") #pragma GCC target("avx2") #include <iostream> #include <vector> #include <algorithm> #include <map> using namespace std; const int mn=-1000000000; struct point{ int x,y,val; }p[150002][2]; int ft[150002][2],n,x[150002],y[150002],z[150002],id[3],val[150002][3],res=-1,szx,szy,idx[150002]; vector <int> v[3],node[150002],bit[150002]; map <int, int> mp[3]; vector <pair <int, point> > pending; vector <pair <pair <int, int>, int> > f; inline void update(int x, int val, int idx){ for (;x<=max(szx,szy);x+=x&(-x)) ft[x][idx]=max(ft[x][idx],val); } inline int get(int i, int idx){ int res=0; for (;i;i-=i&(-i)) res=max(res,ft[i][idx]); return res; } inline void fakeUpdate(int x, int y){ for (;x<=szx;x+=x&-x) node[x].push_back(y); } inline void fakeGet(int x, int y){ for (;x;x-=x&-x) node[x].push_back(y); } inline void update2D(int x, int yy, int val) { for (;x<=szx;x+=x&-x) for (int y=lower_bound(node[x].begin(),node[x].end(),yy)-node[x].begin()+1;y<=node[x].size();y+=y&-y){ if (bit[x][y-1]>val) break; bit[x][y-1]=val; } } inline int get2D(int x, int yy){ int res=mn; for (;x;x-=x&-x) for (int y=lower_bound(node[x].begin(),node[x].end(),yy)-node[x].begin()+1;y;y-=y&-y) res=max(res,bit[x][y-1]); return res; } inline bool cmp(int i, int j){ return x[i]<x[j]; } int main(){ ios_base::sync_with_stdio(NULL);cin.tie(nullptr); cin >> n; for (int i=0;i<n;i++){ cin >> x[i] >> y[i] >> z[i]; v[0].push_back(x[i]); v[1].push_back(y[i]); v[2].push_back(z[i]); idx[i]=i; } sort(idx,idx+n,cmp); for (int i=0;i<3;i++){ sort(v[i].begin(),v[i].end()); for (int j:v[i]) if (!mp[i].count(j)){ mp[i][j]=++id[i]; val[id[i]][i]=j; } } for (int i=0;i<n;i++){ x[i]=mp[0][x[i]]; y[i]=mp[1][y[i]]; z[i]=mp[2][z[i]]; szx=max(szx,y[i]+1); szy=max(szy,z[i]+1); } for (int r=0;r<n;r++){ int i=idx[r]; p[i][0].x=y[i]; int mx=get(y[i]-1,0); if (mx>z[i]){ p[i][0].y=mx; p[i][0].val=val[y[i]][1]+val[mx][2]; } p[i][1].y=z[i]; mx=get(z[i]-1,1); if (mx>y[i]){ p[i][1].x=mx; p[i][1].val=val[mx][1]+val[z[i]][2]; } update(y[i],z[i],0); update(z[i],y[i],1); } for (int i=0;i<n;i++){ p[i][0].x=szx-p[i][0].x; p[i][0].y=szy-p[i][0].y; p[i][1].x=szx-p[i][1].x; p[i][1].y=szy-p[i][1].y; y[i]=szx-y[i]; z[i]=szy-z[i]; if (p[i][0].y!=szy) f.push_back(make_pair(make_pair(p[i][0].y,p[i][0].x),0)); if (p[i][1].x!=szx) f.push_back(make_pair(make_pair(p[i][1].y,p[i][1].x),0)); f.push_back(make_pair(make_pair(z[i]-1,y[i]-1),1)); } sort(f.begin(),f.end()); for (auto i:f) if (i.second) fakeGet(i.first.second,i.first.first); else fakeUpdate(i.first.second,i.first.first); for (int i=1;i<=szx;i++) bit[i].resize(node[i].size(),mn); for (int r=0;r<n;r++){ int i=idx[r]; if (!pending.empty()){ if (x[i]>pending.back().first) while (!pending.empty()){ update2D(pending.back().second.x,pending.back().second.y,pending.back().second.val); pending.pop_back(); } } if (p[i][0].y!=szy) pending.push_back(make_pair(x[i],p[i][0])); if (p[i][1].x!=szx) pending.push_back(make_pair(x[i],p[i][1])); res=max(res,val[x[i]][0]+get2D(y[i]-1,z[i]-1)); } cout << res; }

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

team.cpp: In function 'void update2D(int, int, int)':
team.cpp:37:85: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |         for (int y=lower_bound(node[x].begin(),node[x].end(),yy)-node[x].begin()+1;y<=node[x].size();y+=y&-y){
      |                                                                                    ~^~~~~~~~~~~~~~~~
#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...