제출 #969294

#제출 시각아이디문제언어결과실행 시간메모리
969294NemanjaSo2005Rectangles (IOI19_rect)C++17
72 / 100
5102 ms831972 KiB
#include "rect.h" #include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=2505; ll res=0; int N,M; int L[maxn],R[maxn]; stack<int> S; map<pair<int,int>,int> mapa[maxn]; vector<pair<int,int>> getinterval(vector<int> &V){ vector<pair<int,int>> res; while(S.size()) S.pop(); S.push(0); L[0]=-1; for(int i=1;i<V.size();i++){ while(S.size()){ if(V[S.top()]>V[i]) break; S.pop(); } if(S.size()==0) L[i]=-1; else L[i]=S.top()+1; S.push(i); } while(S.size()) S.pop(); S.push(V.size()-1); for(int i=V.size()-2;i>=1;i--){ while(S.size()){ if(V[S.top()]>V[i]) break; S.pop(); } if(S.size()==0) R[i]=-1; else R[i]=S.top()-1; S.push(i); } for(int i=1;i<V.size()-1;i++){ if(L[i]==-1) continue; if(R[i]==-1) continue; res.push_back({L[i],R[i]}); } vector<pair<int,int>> r2; if(res.size()){ sort(res.begin(),res.end()); r2.push_back(res[0]); for(int i=1;i<res.size();i++) if(res[i]!=res[i-1]) r2.push_back(res[i]); } res.clear(); res.shrink_to_fit(); return r2; } struct slog{ int duz,kol; } pp; bool poduz(slog a,slog b){ return a.duz<b.duz; } bool pokol(slog a,slog b){ return a.kol<b.kol; } vector<slog> vert[maxn][maxn]; int fwt[maxn]; void add(int x,int kol){ x++; for(int i=x;i<=2501;i+=i&-i) fwt[i]+=kol; } int sum(int x){ int r=0; x++; for(int i=x;i>=1;i-=i&-i) r+=fwt[i]; return r; } ll resi(vector<slog> &A,vector<slog> &B){ /* cout<<"RESI"<<endl; for(auto x:A) cout<<x.kol<<" "<<x.duz<<" "; cout<<endl; for(auto x:B) cout<<x.kol<<" "<<x.duz<<" "; cout<<endl; */ ll ret=0; sort(A.begin(),A.end(),poduz); sort(B.begin(),B.end(),pokol); for(int i=0;i<B.size();i++) add(B[i].duz,1); int pok=0; for(int i=0;i<A.size();i++){ while(pok<B.size()){ if(B[pok].kol>=A[i].duz) break; add(B[pok].duz,-1); pok++; } ret+=sum(A[i].kol); } while(pok<B.size()){ add(B[pok].duz,-1); pok++; } /* for(slog x:A) for(slog y:B){ if(x.duz>y.kol) continue; if(y.duz>x.kol) continue; ret++; }*/ return ret; } ll count_rectangles(std::vector<std::vector<int> > inp) { N=inp.size(); M=inp[0].size(); /// Vertikalni for(int i=N-2;i>=1;i--){ vector<int> V; for(int j=0;j<M;j++) V.push_back(inp[i][j]); auto I = getinterval(V); V.clear(); V.shrink_to_fit(); for(auto x:I){ if(mapa[i+1].find(x)!=mapa[i+1].end()) mapa[i][x]=mapa[i+1][x]+1; else mapa[i][x]=1; pp.kol=mapa[i][x]; pp.duz=x.second-x.first+1; vert[i][x.first].push_back(pp); } } /// Horizontalni ll res=0; for(int i=0;i<=M;i++) mapa[i].clear(); for(int i=0;i<=M;i++) mapa[i].clear(); for(int i=M-2;i>=1;i--){ vector<int> V; for(int j=0;j<N;j++) V.push_back(inp[j][i]); auto I = getinterval(V); if(I.size()==0) continue; vector<slog> PV; V.clear(); V.shrink_to_fit(); int px=I[0].first; for(auto x:I){ if(x.first!=px){ res+=resi(vert[px][i],PV); px=x.first; PV.clear(); } if(mapa[i+1].find(x)!=mapa[i+1].end()) mapa[i][x]=mapa[i+1][x]+1; else mapa[i][x]=1; pp.kol=mapa[i][x]; pp.duz=x.second-x.first+1; PV.push_back(pp); } res+=resi(vert[px][i],PV); } return res; }

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

rect.cpp: In function 'std::vector<std::pair<int, int> > getinterval(std::vector<int>&)':
rect.cpp:17:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |    for(int i=1;i<V.size();i++){
      |                ~^~~~~~~~~
rect.cpp:47:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 |    for(int i=1;i<V.size()-1;i++){
      |                ~^~~~~~~~~~~
rect.cpp:58:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |       for(int i=1;i<res.size();i++)
      |                   ~^~~~~~~~~~~
rect.cpp: In function 'long long int resi(std::vector<slog>&, std::vector<slog>&)':
rect.cpp:102:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<slog>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |    for(int i=0;i<B.size();i++)
      |                ~^~~~~~~~~
rect.cpp:106:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<slog>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |    for(int i=0;i<A.size();i++){
      |                ~^~~~~~~~~
rect.cpp:107:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<slog>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |       while(pok<B.size()){
      |             ~~~^~~~~~~~~
rect.cpp:116:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<slog>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |    while(pok<B.size()){
      |          ~~~^~~~~~~~~
#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...