"蔚来杯"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;
}
posted @ 2022-09-02 16:54  wzx_believer  阅读(22)  评论(0编辑  收藏  举报