이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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], up[N][N];
int _dw[N][N], _up[N][N], to_dw[N][N], to_up[N][N];
int top;
int w[N];
using pack=tuple<int,int,int,int>;
set<pack> st;
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){
top=0;
fordec(j,n,1){
while(top && a[i][j]>a[i][w[top]]) top--;
rt[i][j]=top ? w[top] : 0;
while(top && a[i][j]==a[i][w[top]]) top--;
w[++top]=j;
}
top=0;
forinc(j,1,n){
while(top && a[i][j]>a[i][w[top]]) top--;
lf[i][j]=top ? w[top] : 0;
while(top && a[i][j]==a[i][w[top]]) top--;
w[++top]=j;
}
}
forinc(j,1,n){
top=0;
fordec(i,m,1){
while(top && a[i][j]>a[w[top]][j]) top--;
dw[i][j]=top ? w[top] : 0;
while(top && a[i][j]==a[w[top]][j]) top--;
w[++top]=i;
}
top=0;
forinc(i,1,m){
while(top && a[i][j]>a[w[top]][j]) top--;
up[i][j]=top ? w[top] : 0;
while(top && a[i][j]==a[w[top]][j]) top--;
w[++top]=i;
}
}
auto chk=[&](int x,int y,int u,int v){
if(y-x<2) return 0;
int suc=1;
forinc(i,x+1,y-1) if(rt[i][u-1]!=v+1 && lf[i][v+1]!=u-1) return 0;
return 1;
};
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-1]==j+1 || lf[2][j+1]==i-1;
j++;
}
}
return tot;
} else{
int tot=0;
forinc(i,1,m){
forinc(j,2,n-1){
if(!_up[i][j] && up[i][j]){
int t=up[i][j];
int k=j;
int bp=0;
while(k<n && (up[i][k]==t || dw[t][k]==i)){
if(_up[i][k] && up[i][k]==t || _dw[t][k] && dw[t][k]==i){
bp=k;
k=_up[i][k] && up[i][k]==t ? to_up[i][k] : to_dw[t][k];
break;
}
if(up[i][k]==t) _up[i][k]=1;
if(dw[t][k]==i) _dw[t][k]=1;
k++;
}
if(!bp) bp=k;
forinc(l,j,bp-1){
if(up[i][l]==t) to_up[i][l]=k;
if(dw[t][l]==i) to_dw[t][l]=k;
}
forinc(l,j,bp-1) forinc(r,l,k-1) tot+=chk(t,i,l,r);
}
if(!_dw[i][j] && dw[i][j]){
int t=dw[i][j];
int k=j;
int bp=0;
while(k<n && (up[t][k]==i || dw[i][k]==t)){
if(_up[t][k] && up[t][k]==i || _dw[i][k] && dw[i][k]==t){
bp=k;
k=_up[t][k] && up[t][k]==i ? to_up[t][k] : to_dw[i][k];
break;
}
if(up[t][k]==i) _up[t][k]=1;
if(dw[i][k]==t) _dw[i][k]=1;
k++;
}
if(!bp) bp=k;
forinc(l,j,bp-1){
if(up[t][l]==i) to_up[t][l]=k;
if(dw[i][l]==t) to_dw[i][l]=k;
}
forinc(l,j,bp-1) forinc(r,l,k-1) tot+=chk(i,t,l,r);
}
}
}
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
컴파일 시 표준 에러 (stderr) 메시지
rect.cpp: In lambda function:
rect.cpp:72:13: warning: unused variable 'suc' [-Wunused-variable]
int suc=1;
^~~
rect.cpp: In function 'long long int count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:95:38: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
if(_up[i][k] && up[i][k]==t || _dw[t][k] && dw[t][k]==i){
~~~~~~~~~~^~~~~~~~~~~~~~
rect.cpp:116:38: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
if(_up[t][k] && up[t][k]==i || _dw[i][k] && dw[i][k]==t){
~~~~~~~~~~^~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |