"蔚来杯"2022牛客暑期多校训练营6
G Icon Design
就是一个暴力判断的题
#include<bits/stdc++.h>
using namespace std;
int main(){
int n; cin>>n;
for(int i = 0; i < 4*n+5; i++){
for(int j=0; j < 13*n+19; j++){
if(i==0||j==0||i==4*n+4||j==13*n+18)printf("*");
else if((j==n+2||j==i+1||j==3*n+4||j==4*n+6||(j<=6*n+8&&j>4*n+6&&(i==n+1||i==2*n+2))||j==7*n+10||(j>7*n+10&&j<9*n+13&&(i==3*n+3))||((j==10*n+14)&&(i>=n+1&&i<=2*n+2||(i==3*n+3))||(j==12*n+16)&&(i>=2*n+2&&i<=3*n+3||(i==n+1)))||((j>10*n+14&&j<12*n+16)&&(i==n+1||i==2*n+2||i==3*n+3)))&&i>n&&i<3*n+4){
printf("@");
}else printf(".");
}
printf("\n");
}
return 0;
}
J Number Game
打表找规律
#include<iostream>
using namespace std;
int main(){
int A,B,C,x,T;cin>>T;
for(;T--;){
cin>>A>>B>>C>>x;
if(C==x||B-C==x||A!=2*B&&((x-C)%(A-2*B)==0||(x+C-B)%(A-2*B)==0))cout<<"Yes\n";
else cout<<"No\n";
}
}
M Z-Game on grid
题意:
给定一个 n ×m 矩阵,上面有'A', 'B' or '.' 三种字符。
Alice和Bob在玩游戏,初始有一个棋子在 (1,1)上,二人轮流操作棋子,每次可以选择向下和向右,不能出界。
Alice先手。
遇到A,Alice胜,遇到B,Bob胜,如果一直到了 (n,m),则平局。
现在Alice想知道,自己是否可以无论Bob如何操作,都可以获胜,平局,输掉。
很明显的一个博弈dp 用到记忆化搜索
注意 因为Alice要控制局面 所以转移的时候如果(x+y)%2==0 表示 下一个由Alice走 只要有可行方案即可 dfs(x+1,y)|dfs(x,y+1)
如果(x+y)%2!=0 表示下一个由bob走 必须两种方案都可行 dfs(x+1,y)&dfs(x,y+1)
这个题还有一个点值得注意 返回值不一定是0/1 也可能是其他的 每个位的位运算互不干扰
#include<bits/stdc++.h>
using namespace std;
const int maxn=550;
char s[maxn][maxn];
int dp[maxn][maxn],n,m;
int dfs(int x,int y){
if(dp[x][y]>=0)return dp[x][y];
if(s[x][y]=='A') return 1;
if(s[x][y]=='B') return 4;
if(x==n&&y==m)return 2;
if(x==n)return dp[x][y]=dfs(x,y+1);
if(y==m)return dp[x][y]=dfs(x+1,y);
if((x+y)%2==0)return dp[x][y]=dfs(x+1,y)|dfs(x,y+1);
else return dp[x][y]=dfs(x+1,y)&dfs(x,y+1);
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n>>m;
memset(dp,-1,sizeof(dp));
for(int i=1;i<=n;++i)scanf("%s",s[i]+1);
int ans=dfs(1,1);
if(ans&1)cout<<"yes ";else cout<<"no ";
if(ans&2)cout<<"yes ";else cout<<"no ";
if(ans&4)cout<<"yes\n";else cout<<"no\n";
}
}
B Eezie and Pie
很清晰的一个树上差分 维护一个栈 因为是从下往上差分 最后从下往上加一遍即可
#include <bits/stdc++.h>
using namespace std;
int n,t1,t2,a[2000005],sum[2000005];
vector<int> out[2000005],q;
void dfs(int cur,int fa){
q.push_back(cur);
sum[cur]++;
if (a[cur]+1<q.size()) sum[q[q.size()-a[cur]-2]]--;
for (auto v: out[cur])
if (v!=fa) dfs(v,cur);
q.pop_back();
}
void dfs2(int cur,int fa){
for (auto v: out[cur])
if (v!=fa) dfs2(v,cur),sum[cur]+=sum[v];
}
int main()
{
scanf("%d",&n);
for (int i=1;i<n;i++){
scanf("%d%d",&t1,&t2);
out[t1].push_back(t2);
out[t2].push_back(t1);
}
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
dfs(1,0);
dfs2(1,0);
for (int i=1;i<=n;i++) printf("%d ",sum[i]);
return 0;
}
A Array
可能最后有空出来的数 随便填就可以
这个题的性质还是很难发现 2的次幂在满足前提条件的情况下是不会产生冲突的!!!
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
int n, ans[1000010], m;
PII p[100010];
int main(){
cin >> n;
for(int i = 1; i <= n; i++){
scanf("%d", &p[i].first);
int tmp = 1;
while((tmp << 1) <= p[i].first) tmp <<= 1;
p[i] = {tmp, i};
m = max(m, tmp);
}
sort(p + 1, p + n + 1);
int pos = 1;
for(int i = 1; i <= n; i++){
while(ans[pos]) pos++;
for(int j = pos; j <= m; j += p[i].first) ans[j] = p[i].second;
}
printf("%d\n", m);
for(int i = 1; i <= m; i++) printf("%d ", ans[i] == 0? 1 : ans[i]);
return 0;
}