# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
248816 | LittleFlowers__ | Split the Attractions (IOI19_split) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define in ({int x=0;int c=getchar(),n=0;for(;!isdigit(c);c=getchar()) n=(c=='-');for(;isdigit(c);c=getchar()) x=x*10+c-'0';n?-x:x;})
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rnd(int l,int r){return l+rng()%(r-l+1);}
#define fasty ios_base::sync_with_stdio(0),cin.tie(0);
#define forinc(a,b,c) for(int a=b,_c=c;a<=_c;++a)
#define fordec(a,b,c) for(int a=b,_c=c;a>=_c;--a)
#define forv(a,b) for(auto&a:b)
#define fi first
#define se second
#define pb push_back
#define ii pair<int,int>
#define mt make_tuple
#define all(a) a.begin(),a.end()
#define reset(f, x) memset(f, x, sizeof(f))
#define gg exit(0);
const int N=2510;
int m,n;
int a[N][N];
int rt[N][N], lf[N][N], dw[N][N];
long long count_rectangles(vector<vector<int>> arr){
m=arr.size(), n=arr[0].size();
forinc(i,1,m) forinc(j,1,n) a[i][j]=arr[i-1][j-1];
forinc(i,1,m){
stack<int> w;
fordec(j,n,1){
while(w.size() && a[i][j]>=a[i][w.top()]) w.pop();
rt[i][j]=w.size() ? w.top() : 0;
w.push(j);
}
while(w.size()) w.pop();
forinc(j,1,n){
while(w.size() && a[i][j]<=a[i][w.top()]) w.pop();
lf[i][j]=w.size() ? w.top() : 0;
w.push(j);
}
}
forinc(j,1,n){
stack<int> w;
fordec(i,m,1){
while(w.size() && a[i][j]>=a[w.top()][j]) w.pop();
dw[i][j]=w.size() ? w.top() : 0;
w.push(i);
}
}
if(m==3){
int tot=0;
forinc(i,2,n-1) if(a[2][i]<a[1][i] && a[2][i]<a[3][i]){
int j=i;
while(j<n && a[2][j]<a[1][j] && a[2][j]<a[3][j]){
tot+=rt[2][i]==j+1 || lf[2][j+1]==i;
j++;
}
}
return tot;
}
}
#ifdef UNX
main(){
#define task "TASK"
if(fopen(task".inp","r")){
freopen(task".inp","r",stdin);
//freopen(task".out","w",stdout);
}
int m,n; cin>>m>>n;
vector<vector<int>> a(m,vector<int>(n));
forv(i,a) forv(j,i) cin>>j;
cout<<count_rectangles(a);
}
#endif // UNX