Submission #153162

#TimeUsernameProblemLanguageResultExecution timeMemory
153162errorgornRectangles (IOI19_rect)C++14
0 / 100
501 ms363392 KiB
#include "rect.h"
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <utility>
using namespace std;
typedef pair<int,int> ii;
int n,m;
vector<vector<int> > grid;
bool visited[2505][2505];
ii p[2505][2505];
int r[2505][2505];
int s[2505][2505];
int left [2505][2505];
int right[2505][2505];
int top[2505][2505];
int bottom[2505][2505];
ii parent(ii i){return (i==p[i.first][i.second])?i:p[i.first][i.second]=parent(p[i.first][i.second]);}
void unions(ii i, ii j){
    i=parent(i),j=parent(j);
    if (i==j) return;
    if (r[i.first][i.second]<r[j.first][j.second]){
        p[i.first][i.second]=j;
        s[j.first][j.second]+=s[i.first][i.second];
        left[j.first][j.second]=min(left[i.first][i.second],left[j.first][j.second]);
        right[j.first][j.second]=max(right[i.first][i.second],right[j.first][j.second]);
        top[j.first][j.second]=max(top[i.first][i.second],top[j.first][j.second]);
        bottom[j.first][j.second]=min(bottom[i.first][i.second],bottom[j.first][j.second]);
    }
    else{
        p[j.first][j.second]=i;
        s[i.first][i.second]+=s[j.first][j.second];
        left[i.first][i.second]=min(left[i.first][i.second],left[j.first][j.second]);
        right[i.first][i.second]=max(right[i.first][i.second],right[j.first][j.second]);
        top[i.first][i.second]=max(top[i.first][i.second],top[j.first][j.second]);
        bottom[i.first][i.second]=min(bottom[i.first][i.second],bottom[j.first][j.second]);
        if (r[i.first][i.second]==r[j.first][j.second]) r[i.first][i.second]++;
    }
}
struct horST{
    int st[2505][12];
    horST(int i){
        memset(st,-1,sizeof(st));
        for (int x=0;x<m;x++){
            st[x][0]=grid[i][x];
        }
        int add=1;
        int row=0;
        while (st[add][row]!=-1){
            for (int x=add;st[x][row]!=-1;x++){
                st[x-add][row+1]=max(st[x-add][row],st[x][row]);
            }
            row++;
            add<<=1;
        }
    }
    int query(int i,int j){
        j=j-i+1;
        int row=31-__builtin_clz(j);
        j-=1<<row;
        return max(st[i][row],st[i+j][row]);
    }
};
struct verST{
    int st[2505][12];
    verST(int i){
        memset(st,-1,sizeof(st));
        for (int x=0;x<m;x++){
            st[x][0]=grid[x][i];
        }
        int add=1;
        int row=0;
        while (st[add][row]!=-1){
            for (int x=add;st[x][row]!=-1;x++){
                st[x-add][row+1]=max(st[x-add][row],st[x][row]);
            }
            row++;
            add<<=1;
        }
    }
    int query(int i,int j){
        j=j-i+1;
        int row=31-__builtin_clz(j);
        j-=1<<row;
        return max(st[i][row],st[i+j][row]);
    }
};
const int dx[]={1,-1,0,0};
const int dy[]={0,0,1,-1};
ii temp;
long long ans=0;
bool side[2505];
horST *horr;
long long count_rectangles(vector<vector<int> > in) {
    grid=in;
    n=grid.size();
    m=grid[0].size();
    horST *hors[205];
    verST *vers[205];
    for (int x=0;x<n;x++){
        hors[x]=new horST(x);
    }
    for (int x=0;x<m;x++){
        vers[x]=new verST(x);
    }
    for (int x1=1;x1<m-1;x1++){
        for (int x2=x1;x2<m-1;x2++){
            for (int y1=1;y1<n-1;y1++){
                for (int y2=y1;y2<n-1;y2++){
                    //printf("%d %d %d %d %d %d\n",y2,x1,x2,hors[y2]->query(x1,x2),grid[y2][x1-1],grid[y2][x2+1]);
                    if (hors[y2]->query(x1,x2)>=min(grid[y2][x1-1],grid[y2][x2+1])) break;
                    for (int z=x1;z<=x2;z++){
                        if (vers[z]->query(y1,y2)>=min(grid[y1-1][z],grid[y2+1][z])) goto _end;
                    }
                    //printf("final: %d %d %d %d\n",x1,x2,y1,y2);
                    ans++;
                    _end:;
                }
            }
        }
    }
    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...