제출 #722690

#제출 시각아이디문제언어결과실행 시간메모리
722690groshi사다리꼴 (balkan11_trapezoid)C++17
100 / 100
311 ms29604 KiB
#include<iostream> #include<map> #include<vector> #include<algorithm> using namespace std; int x1[200000],y1[200000],x2[200000],y2[200000]; vector<int> pytaj[200000]; int wynik[200000]; int ile[200000]; map<int,int> mapka; vector<pair<int,int> > Q; vector<int> zero; int pot=1; int maxxx[2000000]; int ilee[2000000]; int mod=30013; pair<int,int> combine(int x1,int x2,int y1,int y2) { if(x1!=x2) { if(x1>x2) return {x1,y1}; else return {x2,y2}; } else return {x1,y1+y2}; } void ustaw(int x,int maxx,int ile) { x+=pot; maxxx[x]=maxx; ilee[x]=ile; x/=2; while(x>0) { pair<int,int> para=combine(maxxx[x*2],maxxx[x*2+1],ilee[x*2],ilee[x*2+1]); maxxx[x]=para.first; ilee[x]=para.second; ilee[x]%=mod; x/=2; } } pair<int,int> zap(int x,int y) { x+=pot; y+=pot; pair<int,int> wynik; if(x!=y) wynik=combine(maxxx[x],maxxx[y],ilee[x],ilee[y]); else wynik={maxxx[x],ilee[x]}; while(x/2!=y/2) { if(x%2==0) wynik=combine(wynik.first,maxxx[x+1],wynik.second,ilee[x+1]); if(y%2==1) wynik=combine(wynik.first,maxxx[y-1],wynik.second,ilee[y-1]); x/=2; y/=2; wynik.second%=mod; } wynik.second%=mod; if(wynik.first==0) return {0,1}; return wynik; } int main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); int n; cin>>n; for(int i=1;i<=n;i++) cin>>x1[i]>>y1[i]>>x2[i]>>y2[i]; for(int i=1;i<=n;i++) { mapka[x1[i]]=1; mapka[y1[i]]=1; mapka[x2[i]]=1; mapka[y2[i]]=1; } int mam=1; for(auto it=mapka.begin();it!=mapka.end();it++) mapka[it->first]=mam++; while(pot<=mam) pot*=2; pot--; for(int i=1;i<=n;i++) Q.push_back({y1[i],i}); sort(Q.begin(),Q.end()); for(int i=0;i<Q.size();i++) { int pocz=0,kon=i,sre,ostd=-1; while(pocz<kon) { sre=(pocz+kon)/2; if(y1[Q[sre].second]<x1[Q[i].second]) { ostd=sre; pocz=sre+1; } else kon=sre; } if(ostd>=0) pytaj[ostd].push_back(i); else zero.push_back(i); } for(int i=0;i<zero.size();i++) { int kto=zero[i]; wynik[kto]=1; ile[kto]=1; } for(int i=0;i<Q.size();i++) { int kto=Q[i].second; ustaw(mapka[y2[kto]],wynik[i],ile[i]); for(int j=0;j<pytaj[i].size();j++) { int pytam=pytaj[i][j]; pair<int,int> para=zap(1,mapka[x2[Q[pytam].second]]); wynik[pytam]=para.first+1; ile[pytam]=para.second; ile[pytam]%=mod; } } int maxx=1; mam=0; for(int i=0;i<n;i++) { if(wynik[i]>maxx) { mam=ile[i]; maxx=wynik[i]; } else if(wynik[i]==maxx) mam+=ile[i]; } mam%=mod; cout<<maxx<<" "<<mam; return 0; }

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

trapezoid.cpp: In function 'int main()':
trapezoid.cpp:91: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]
   91 |     for(int i=0;i<Q.size();i++)
      |                 ~^~~~~~~~~
trapezoid.cpp:108:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  108 |     for(int i=0;i<zero.size();i++)
      |                 ~^~~~~~~~~~~~
trapezoid.cpp:114: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]
  114 |     for(int i=0;i<Q.size();i++)
      |                 ~^~~~~~~~~
trapezoid.cpp:118:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |         for(int j=0;j<pytaj[i].size();j++)
      |                     ~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...