【usaco2017 March Platinum】Modern Art

来源:互联网 发布:淘宝神兽金刚玩具 编辑:程序博客网 时间:2024/06/01 09:32

Description

一个N*N(N<=1000)的矩阵,现在要使用编号1~N*N的颜色,对矩阵涂色(不涂色颜色为0)

涂色可以选定一个子矩阵,将矩阵内的颜色覆盖

给出涂色完毕后的矩形,求有多少种颜色可能第一个使用

Analysis

将同种颜色的点用最小的矩阵框起来

显然矩阵可能会相交,那么相交部分的点上的颜色(该位置最后一次被涂上的颜色)不可能被第一个使用

特判全局只有一种颜色的情况

Code

#include<cstdio>#include<ctime>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define efo(i,v) for(int i=last[v];i;i=next[i])using namespace std;const int N=1005,M=N*N;int n,ans,b[M],map[N][N],f[N][N];bool bz[M],p[M];struct node{    int x1,y1,x2,y2;}a[M];int main(){    freopen("art.in","r",stdin);    freopen("art.out","w",stdout);    scanf("%d",&n);ans=n*n;    fo(i,1,n*n) a[i].x1=a[i].y1=N,a[i].x2=a[i].y2=0;    int co;    fo(i,1,n)        fo(j,1,n)        {            scanf("%d",&co);p[co]=1;            map[i][j]=co;            a[co].x1=min(a[co].x1,i),a[co].y1=min(a[co].y1,j);            a[co].x2=max(a[co].x2,i),a[co].y2=max(a[co].y2,j);        }    fo(i,1,n*n)        if(p[i]) b[++b[0]]=i;    fo(i,1,b[0])    {        int co=b[i];        f[a[co].x1][a[co].y1]++;        f[a[co].x1][a[co].y2+1]--;        f[a[co].x2+1][a[co].y1]--;        f[a[co].x2+1][a[co].y2+1]++;    }    fo(i,1,n)        fo(j,1,n) f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];    fo(i,1,n)        fo(j,1,n)            if(f[i][j]>1) bz[map[i][j]]=1;    fo(i,1,n*n)        if(bz[i]) ans--;    if(b[0]==1 && n>1) ans--;    printf("%d",ans);    return 0;}
原创粉丝点击