Submission #378722

#TimeUsernameProblemLanguageResultExecution timeMemory
378722autumn_eelRectangles (IOI19_rect)C++14
27 / 100
5031 ms796424 KiB
#include "rect.h" #include <bits/stdc++.h> #define rep(i,n)for(int i=0;i<int(n);i++) using namespace std; typedef long long ll; typedef pair<int,int>P; struct BIT{ vector<int>bit; BIT(int n){ bit=vector<int>(n+10); } void add(int k,int x){ k++; while(k<bit.size()){ bit[k]+=x; k+=k&-k; } } int sum(int k){ k++; int res=0; while(k){ res+=bit[k]; k-=k&-k; } return res; } }; struct st{ int a,b,c; }; static int r[3000][3000],l[3000][3000]; static int L[300][300][300],R[300][300][300]; static int M[300][300][300]; long long count_rectangles(std::vector<std::vector<int>> a) { int n=a.size(),m=a[0].size(); rep(i,n){ stack<P>sa; for(int j=m-1;j>=0;j--){ while(!sa.empty()&&sa.top().first<a[i][j])sa.pop(); r[i][j]=(sa.empty()?m:sa.top().second)-1; sa.push(P(a[i][j],j)); } while(!sa.empty())sa.pop(); rep(j,m){ while(!sa.empty()&&sa.top().first<a[i][j])sa.pop(); l[i][j]=(sa.empty()?-1:sa.top().second)+1; sa.push(P(a[i][j],j)); } } rep(i,m){ for(int j=0;j<n;j++){ int r1=m-1; int l1=0; int m1=0; for(int k=j;k<n;k++){ r1=min(r1,r[k][i]); R[i][j][k]=r1; l1=max(l1,l[k][i]); L[i][j][k]=l1; m1=max(m1,a[k][i]); M[i][j][k]=m1; } } } ll ans=0; for(int sx=0;sx<n;sx++){ for(int gx=sx+2;gx<n;gx++){ BIT bit(m); vector<st>v; int K=0; rep(j,m){ int end=max(L[j][sx+1][gx-1]-1,K); if(end<=j-2){ v.push_back({j-2,j,1}); v.push_back({end-1,j,-1}); } if(M[j][sx+1][gx-1]>=min(a[sx][j],a[gx][j])){ K=j; } } sort(v.begin(),v.end(),[](st a,st b){return a.a>b.a;}); //~ if(sx==0&&gx==3){ //~ for(auto s:v){ //~ cout<<s.a<<' '<<s.b<<' '<<s.c<<endl; //~ } //~ } int s=0; for(int j=m-1;j>=0;j--){ while(s<v.size()&&v[s].a>=j){ bit.add(v[s].b,v[s].c); s++; } ans+=bit.sum(R[j][sx+1][gx-1]+1); } } } return ans; }

Compilation message (stderr)

rect.cpp: In member function 'void BIT::add(int, int)':
rect.cpp:17:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |   while(k<bit.size()){
      |         ~^~~~~~~~~~~
rect.cpp: In function 'long long int count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:98:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<st>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |     while(s<v.size()&&v[s].a>=j){
      |           ~^~~~~~~~~
#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...