Submission #289412

#TimeUsernameProblemLanguageResultExecution timeMemory
289412NucleistRectangles (IOI19_rect)C++14
0 / 100
6 ms896 KiB
#include "rect.h"
//Self-control leads to consistency.
#include <bits/stdc++.h> 
using namespace std; 
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#define flash ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define debug(x) cerr << " - " << #x << ": " << x << endl;
#define debugs(x, y) cerr << " - " << #x << ": " << x << " " << #y << ": " << y << endl;
#define all(x) (x).begin(),(x).end()
#define sz(x) (ll)x.size()
#define ll long long
#define INF 1000000000
#define MOD 1000000007
#define pb push_back
#define ve vector<ll>
#define dos pair<ll,ll>
#define vedos vector<dos>
#define rand mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define EPS 0.000001
struct greateri
{
    template<class T>
    bool operator()(T const &a, T const &b) const { return a > b; }
};
void setIO(string s) {
	ios_base::sync_with_stdio(0); cin.tie(0); 
	freopen((s+".in").c_str(),"r",stdin);
	freopen((s+".out").c_str(),"w",stdout);
}
int n,m,l;
int sparse[201][21],mx[201][21],lok[201];
int ans[201][201][201],ans1[201][201][201];
int bit[201],pi[11];
void up(ll index,ll val){
	for (ll i = index; i <= max(m,n); i+=(i&(-i)))
	{
		bit[i]+=val;
	}
}
ll query(ll index){
	ll res=0;
	for (ll i = index; i > 0; i-=(i&(-i)))
	{
		res+=bit[i];
	}
	return res;
}
ll fol(ll l,ll r){
	up(l,1);
	up(r+1,-1);
}
long long count_rectangles(std::vector<std::vector<int> > a) {
	flash;
	n=sz(a);
	m=sz(a[0]);
	l=log2(n)+1;
	lok[1]=0;
	for (ll i = 2; i < 201; ++i)
	{
		lok[i]=lok[i/2]+1;
	}
	pi[0]=1;
	for (int i = 1; i < 10; ++i)
	{
		pi[i]=pi[i-1]*2;
	}
	for (ll i = 1; i < n-1; ++i)
	{
		sparse[m-2][0]=m-2;
		mx[m-2][0]=a[i][m-2];
		for (ll j = m-3; j >= 1; --j)
		{
			sparse[j][0]=j+1;
			mx[j][0]=a[i][j];
			for (ll k = 1; k <= l; ++k)
			{
				mx[j][k]=0;
				sparse[j][k]=sparse[sparse[j][k-1]][k-1];
				mx[j][k]=max(mx[j][k-1],mx[sparse[j][k-1]][k-1]);
			}
		}
		for (ll j = 1; j < m-1; ++j)
		{
			for (ll k = 1; k <= m; ++k)
			{
				ll y=j+k-1;
				if(y>m-2)break;
				ll f=lok[k];
				ll z=pi[f];
				ll mi=max(mx[j][f],mx[y-(z)+1][f]);
				if(mi<a[i][j-1] && mi<a[i][y+1]){
					ans[i][j][k]=1;
				}
				ans[i][j][k]+=ans[i-1][j][k];
			}
		}
	}
	for (ll j = 1; j < m-1; ++j)
	{
		sparse[n-2][0]=n-2;
		mx[n-2][0]=a[n-2][j];
		for (ll i = n-3; i >= 1; --i)
		{
			sparse[i][0]=i+1;
			mx[i][0]=a[i][j];
			for (ll k = 1; k <= l; ++k)
			{
				mx[i][k]=0;
				sparse[i][k]=sparse[sparse[i][k-1]][k-1];
				mx[i][k]=max(mx[i][k-1],mx[sparse[i][k-1]][k-1]);
			}
		}
		for (ll i = 1; i < n-1; ++i)
		{
			for (ll k = 1; k <= n; ++k)
			{
				ll y=i+k-1;
				if(y>n-2)break;
				ll f=lok[k];
				ll z=pi[lok[k]];
				ll yo=max(y-z+1,(ll)(0));
				ll mi=max(mx[i][f],mx[yo][f]);
				if(mi<a[i-1][j] && mi<a[y+1][j]){
					ans1[i][j][k]=1;
				}
				ans1[i][j][k]+=ans1[i][j-1][k];
			}
		}
	}
	ll sol=0;
	vedos yol;
	for (ll i = 1; i < sz(a)-1; ++i)
	{
		for (ll j = 1; j < sz(a[i])-1; ++j)
		{
			yol.clear();
			bit[0]=0;
			for (ll k = 1; k <= n; ++k)
			{
				bit[k]=0;
				ll y=i+k-1;
				if(y>n-2)break;
				ll index=-1;
				ll l=1,r=m;
				while(l<=r){
					ll med=(l+r)>>1;
					ll koz=j+med-1;
					if(koz>m-2){
						r=med-1;
					}
					else{
						ll zol=ans1[i][j+med-1][k]-ans1[i][j-1][k];
						if(zol==med){
							index=med;
							l=med+1;
						}
						else{
							r=med-1;
						}
					}
				}
				if(index!=-1){
					yol.pb({index,k});
				}
			}
			sort(all(yol));
			ll f=0;
			for (ll k = 1; k <= m; ++k)
			{
				ll y=j+k-1;
				if(y>m-2)break;
				ll index=-1;
				ll l=1,r=n;
				while(l<=r){
					ll med=(l+r)>>1;
					ll koz=i+med-1;
					if(koz>n-2){
						r=med-1;
					}
					else{
						ll zol=ans[i+med-1][j][k]-ans[i-1][j][k];
						if(zol==med){
							index=med;
							l=med+1;
						}
						else{
							r=med-1;
						}
					}
				}
				while(f<sz(yol) && yol[f].first<k){
					sol+=query(yol[f].second);
					f++;
				}
				if(index!=-1)
					fol(1,index);
			}
			while(f<sz(yol)){
				sol+=query(yol[f].second);
				f++;
			}
		}
	}
	return sol;
}

Compilation message (stderr)

rect.cpp:6: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
    6 | #pragma GCC optimization ("O3")
      | 
rect.cpp:7: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
    7 | #pragma GCC optimization ("unroll-loops")
      | 
rect.cpp: In function 'long long int fol(long long int, long long int)':
rect.cpp:53:1: warning: no return statement in function returning non-void [-Wreturn-type]
   53 | }
      | ^
rect.cpp: In function 'void setIO(std::string)':
rect.cpp:29:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   29 |  freopen((s+".in").c_str(),"r",stdin);
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rect.cpp:30:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   30 |  freopen((s+".out").c_str(),"w",stdout);
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...