Submission #535963

#TimeUsernameProblemLanguageResultExecution timeMemory
535963jamezzzRectangles (IOI19_rect)C++17
100 / 100
2406 ms737872 KiB
#include "rect.h"
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define pf printf
#define pb push_back
#define INF 1023456789
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()
typedef long long ll;
typedef pair<int,int> ii;

#define maxn 2505

int n,m,ft[maxn+5];
vector<ii> h[maxn][maxn],v[maxn][maxn];

void up(int x,int v){
	++x;
	while(x<=maxn)ft[x]+=v,x+=x&-x;
}

int qry(int x,int y){
	++y;int res=0;
	while(y)res+=ft[y],y-=y&-y;
	while(x)res-=ft[x],x-=x&-x;
	return res;
}

ll count_rectangles(vector<vector<int>> a){
	n=sz(a);m=sz(a[0]);
	if(min(n,m)<=2)return 0;
	for(int i=0;i<n;++i){
		vector<ii> s;
		s.pb({INF,-1});
		for(int j=0;j<m;++j){
			while(s.back().fi<a[i][j]){
				if(j-s.back().se>1)h[i][s.back().se+1].pb({j-1,i});
				while(sz(s)>=2&&s[sz(s)-1].fi==s[sz(s)-2].fi)s.pop_back();
				s.pop_back();
			}
			if(j-s.back().se>1)h[i][s.back().se+1].pb({j-1,i});
			s.pb({a[i][j],j});
		}
	}
	for(int j=0;j<m;++j){
		vector<ii> s;
		s.pb({INF,-1});
		for(int i=0;i<n;++i){
			while(s.back().fi<a[i][j]){
				if(i-s.back().se>1)v[s.back().se+1][j].pb({i-1,j});
				while(sz(s)>=2&&s[sz(s)-1].fi==s[sz(s)-2].fi)s.pop_back();
				s.pop_back();
			}
			if(i-s.back().se>1)v[s.back().se+1][j].pb({i-1,j});
			s.pb({a[i][j],i});
		}
	}
	for(int i=n-2;i>0;--i){
		for(int j=m-2;j>0;--j){
			for(ii &p:h[i][j]){
				auto it=lower_bound(all(h[i+1][j]),p);
				if(it!=h[i+1][j].end()&&(*it).fi==p.fi){
					p.se=(*it).se;
				}
			}
			for(ii &p:v[i][j]){
				auto it=lower_bound(all(v[i][j+1]),p);
				if(it!=v[i][j+1].end()&&(*it).fi==p.fi){
					p.se=(*it).se;
				}
			}
		}
	}
	for(int i=0;i<n;++i)for(int j=0;j<m;++j)for(ii &p:h[i][j])swap(p.fi,p.se);
	ll ans=0;
	for(int i=1;i<n-1;++i){
		for(int j=1;j<m-1;++j){
			//pf("h[%d][%d]:\n",i,j);
			//for(ii pr:h[i][j])pf("%d %d %d %d\n",i,j,pr.fi,pr.se);
			//pf("v[%d][%d]:\n",i,j);
			//for(ii pr:v[i][j])pf("%d %d %d %d\n",i,j,pr.fi,pr.se);
			sort(all(h[i][j]),[](ii &a,ii &b){return a.se<b.se;});
			sort(all(v[i][j]),[](ii &a,ii &b){return a.se<b.se;});
			int curh=0,curv=0,mxh=sz(h[i][j]),mxv=sz(v[i][j]);
			while(curv!=mxv){
				while(curh!=mxh&&h[i][j][curh].se<=v[i][j][curv].se){
					up(h[i][j][curh++].fi,1);
				}
				ans+=qry(v[i][j][curv++].fi,maxn-1);
			}
			for(int k=0;k<curh;++k)up(h[i][j][k].fi,-1);
		}
	}
	return ans;
}
#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...