CS Academy Round #44 A B C D

来源:互联网 发布:wps mac免费版 编辑:程序博客网 时间:2024/05/17 21:49

A
计算出现>=k次的数有多少个

int cnt[maxn];int bo[maxn];int main(){#ifdef LOCAL    freopen("input.txt","r",stdin);//    freopen("output.txt","w",stdout);#endif // LOCAL    int n,k;    sdd(n,k);    int ans = 0;    r1(i,n)    {        int x;sd(x);        if(++cnt[x]>=k)        {            if(!bo[x])            {                bo[x]=1;                ++ans;            }        }    }    ansn();    return 0;}

B
计算是否能对每个数字用一个正方形框住所有这个数字并且内部全是相同的数

int num[maxn][maxn];bool vis[maxn][maxn];bool check[maxm];int dx[] = {1,-1,0,0} , dy[] = {0,0,-1,1};int rowmx,colmx;int n,m;int cnt;bool judge(int x,int y){    return 1<=x&&x<=n&&1<=y&&y<=m;}void dfs(int x,int y){    ++cnt;    vis[x][y]=1;    rowmx = max(rowmx,x);    colmx = max(colmx,y);    r0(i,4)    {        int nx = dx[i] +x , ny = dy[i]+y;        if(judge(nx,ny)&&!vis[nx][ny]&&num[nx][ny]==num[x][y])            dfs(nx,ny);    }}int main(){#ifdef LOCAL    freopen("input.txt","r",stdin);//    freopen("output.txt","w",stdout);#endif // LOCAL//    int n,m;    sdd(n,m);    r1(i,n)    {        r1(j,m)sd(num[i][j]);    }    bool ok = 1;    r1(i,n)    r1(j,m)    {        int x = num[i][j];        if(vis[i][j])continue;        if(check[x]){ok=0;break;}        else        {            cnt=0;            check[x]=1;            rowmx = i,colmx = j;            dfs(i,j);            if(rowmx-i!=colmx-j){ok=0;break;}            int sq = sqrt(cnt+0.5);            if(sqr(sq)!=cnt){ok=0;break;}        }    }    int ans = ok;    ansn();    return 0;}

C
检查从1开始dfs弄否走出给定序列

需要注意的是dfs是优先走完所有能走的路

int a[maxn];map<int,int>ma[maxn];vector<int>G[maxn];bool vis[maxn];int n,m;int cnt;bool ok=1;void dfs(int u){    ++cnt;    vis[u]=1;    while(cnt<=n)    {        int v = a[cnt];        if(ma[u][v]&&!vis[v])dfs(v);        else        {            rsz(i,G[u])            {                int q = G[u][i];                if(!vis[q])                {                    ok=0;                    break;                }            }            return ;        }    }    return ;}int main(){#ifdef LOCAL    freopen("input.txt","r",stdin);//    freopen("output.txt","w",stdout);#endif // LOCAL//    int n,m;    sdd(n,m);    r1(i,n)sd(a[i]);    ma[0][1]=1;    r1(i,m)    {        int u,v;        sdd(u,v);        ma[v][u]=ma[u][v]=1;        G[u].pb(v),G[v].pb(u);    }    dfs(0);    int ans=0;    if(cnt>n)ans = 1;    if(!ok) ans = 0;    ansn();    return 0;}

D
给一个n,m
可以取左下角为[0,0] 右上角为[n,m]的点
找四个点组成一个正方形 问有多少种情况

可以注意到当正方形是斜着的时候 可以用一个正方形框住它

int main(){#ifdef LOCAL    freopen("input.txt","r",stdin);//    freopen("output.txt","w",stdout);#endif // LOCAL    int n,m;    sdd(n,m);    ll ans = 1LL*n*m ;    int mn = min(n,m);    for(int i=2;i<=mn;++i)    {        int a = n - i + 1;        int b = m - i + 1;        ll t = 1LL*a*b;        ll add = t * i;        ans += add;        if(ans>mod)ans%=mod;    }    lansn();    return 0;}
原创粉丝点击