Submission #1290730

#TimeUsernameProblemLanguageResultExecution timeMemory
1290730enzyRectangles (IOI19_rect)C++20
49 / 100
3246 ms151696 KiB
#include "rect.h" #include<bits/stdc++.h> #define ll long long using namespace std; const ll maxn=702; const int maxk=11; set<int>col[maxn], lin[maxn]; int v[maxn][maxn], val[maxn][maxn], sp[maxn][maxn], ma_lin_dir[maxn][maxn][maxk], ma_lin_esq[maxn][maxn][maxk], ma_col_dir[maxn][maxn][maxk], ma_col_esq[maxn][maxn][maxk]; ll count_rectangles(vector<vector<int> > a){ int n=a.size(), m=a[0].size(); vector<pair<int,pair<int,int>>>process; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ val[i+1][j+1]=a[i][j]; col[j+1].insert(i+1); lin[i+1].insert(j+1); col[j+1].insert(0); col[j+1].insert(maxn); lin[i+1].insert(0); lin[i+1].insert(maxn); process.push_back({a[i][j],{i+1,j+1}}); } } if(min(n,m)<3) return 0; //if(n==3) return solve(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ ma_lin_dir[j][i][0]=val[i][j+1]; ma_lin_esq[j][i][0]=val[i][j-1]; ma_col_dir[i][j][0]=val[i+1][j]; ma_col_esq[i][j][0]=val[i-1][j]; } } for(int i=1;i<=n;i++){ for(int k=1;k<maxk;k++){ for(int j=1;j<=m;j++){ int l=max(1,j-(1<<(k-1))), r=min(m,j+(1<<(k-1))); ma_lin_dir[j][i][k]=max(ma_lin_dir[j][i][k-1],ma_lin_dir[r][i][k-1]); ma_lin_esq[j][i][k]=max(ma_lin_esq[j][i][k-1],ma_lin_esq[l][i][k-1]); } } } for(int j=1;j<=m;j++){ for(int k=1;k<maxk;k++){ for(int i=1;i<=n;i++){ int l=max(1,i-(1<<(k-1))), r=min(n,i+(1<<(k-1))); ma_col_dir[i][j][k]=max(ma_col_dir[i][j][k-1],ma_col_dir[r][j][k-1]); ma_col_esq[i][j][k]=max(ma_col_esq[i][j][k-1],ma_col_esq[l][j][k-1]); } } } sort(process.begin(),process.end()); reverse(process.begin(),process.end()); ll resp=0; while(process.size()){ unordered_set<ll>ans; int at=process.back().first; vector<pair<int,int>>aux; vector<int>att; while(process.size()&&process.back().first==at){ pair<int,int>p=process.back().second; aux.push_back(p); v[p.first][p.second]++; att.push_back(p.first); lin[p.first].erase(p.second); col[p.second].erase(p.first); process.pop_back(); } for(int x : att) for(int i=1;i<=m;i++) sp[x][i]=sp[x][i-1]+v[x][i]; for(pair<int,int> p : aux){ int x=p.first, y=p.second; ll l1, l2, c1, c2; auto f=lin[x].upper_bound(y), g=col[y].upper_bound(x); l2=*g; c2=*f; f--; g--; l1=*g; c1=*f; if(l1==0||c1==0||l2==maxn||c2==maxn) continue; l1++; c1++; l2--; c2--; bool ok=true; int qtd=c2-c1+1, alt=l2-l1+1; int k1=0, k2=0; while((1<<k1)<=qtd) k1++; while((1<<k2)<=alt) k2++; k1--; k2--; // melhorou o cash? for(int i=l1;i<=l2;i++){ if(sp[i][c2]-sp[i][c1-1]!=qtd) goto sair; int at=max(ma_lin_dir[c1-1][i][k1],ma_lin_esq[c2+1][i][k1]); if(at>=min(val[i][c1-1],val[i][c2+1])) goto sair; } for(int i=c1;i<=c2;i++){ int at=max(ma_col_dir[l1-1][i][k2],ma_col_esq[l2+1][i][k2]); if(at>=min(val[l1-1][i],val[l2+1][i])) goto sair; } ans.insert(l1+maxn*c1+maxn*maxn*l2+maxn*maxn*maxn*c2); sair:; } resp+=ans.size(); } return resp; }
#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...