CS Academy Round #44 A B C D

xiaoxiao2021-02-28  172

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; }
转载请注明原文地址: https://www.6miu.com/read-18930.html

最新回复(0)