2022牛客暑假多校第六场8.16

B.Eezie and Pie

思路:

代码:

#include <bits/stdc++.h>
using namespace std;
const int N=2e6+10;
int n,x,y,f[N][21],dep[N],d[N],g[N];
//f[i][j]表示i的2^j祖先,也就是i向上跳2^j步的点。dep表示深度。
vector<int> v[N];
void dfs(int u,int fa)//预处理得到f数组,u表示当前搜索到的点,father表示u的父节点
{
    dep[u]=dep[fa]+1;//u的父节点深度+1就是u的深度
    f[u][0]=fa;//u向上跳2^0步(1步),为father点
    for(int i=1;i<=20;i++)//u与其祖先的距离最大不超过2^20
        f[u][i]=f[f[u][i-1]][i-1];//dp的思想:u向上跳2^i步相当于u向上跳2^(i-1)步,再向上跳2^(i-1)步
    for(auto i:v[u])//遍历与u相连的点
    {
        if(i!=fa) dfs(i,u);//如果当前遍历的点v不是father点,则可以向下继续搜索
    }
}
int get_fa(int x,int k)
{
    int t=dep[x]-k;
    for(int i=20;i>=0;i--)//倍增向上跳跃,求祖先
        if(dep[f[x][i]]>t)x=f[x][i];
    return f[x][0];
}

void dfs2(int u,int fa)
{
    for(auto i:v[u])
    {
        if(i==fa) continue;
        dfs2(i,u);
        g[u]+=g[i];
    }
}

int main()
{
    cin>>n;
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    for(int i=1;i<=n;i++) scanf("%d",&d[i]);
    dfs(1,0);
    for(int i=1;i<=n;i++) g[i]+=1,g[get_fa(i,d[i]+1)]+=-1;
    dfs2(1,0);
    for(int i=1;i<=n;i++) printf("%d ",g[i]);
    cout<<endl;
    return 0;
}





G.Icon Design

思路:签到

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    if(n==1)//字体2*n+3=5
    {
        cout<<"********************************"<<endl;
        cout<<"*..............................*"<<endl;
        cout<<"*..@...@..@@@@@..@......@@@@@..*"<<endl;
        cout<<"*..@@..@..@......@......@......*"<<endl;
        cout<<"*..@.@.@..@@@@@..@......@@@@@..*"<<endl;
        cout<<"*..@..@@..@......@..........@..*"<<endl;
        cout<<"*..@...@..@......@@@@@..@@@@@..*"<<endl;
        cout<<"*..............................*"<<endl;
        cout<<"********************************"<<endl;
    }
    else if(n==2)//字体2*n+3=7
    {
        cout<<"*********************************************"<<endl;
        cout<<"*...........................................*"<<endl;
        cout<<"*...........................................*"<<endl;
        cout<<"*...@.....@...@@@@@@@...@.........@@@@@@@...*"<<endl;
        cout<<"*...@@....@...@.........@.........@.........*"<<endl;
        cout<<"*...@.@...@...@.........@.........@.........*"<<endl;
        cout<<"*...@..@..@...@@@@@@@...@.........@@@@@@@...*"<<endl;
        cout<<"*...@...@.@...@.........@...............@...*"<<endl;
        cout<<"*...@....@@...@.........@...............@...*"<<endl;
        cout<<"*...@.....@...@.........@@@@@@@...@@@@@@@...*"<<endl;
        cout<<"*...........................................*"<<endl;
        cout<<"*...........................................*"<<endl;
        cout<<"*********************************************"<<endl;
    }
    else if(n==3)//字体2*n+3=7
    {
        cout<<"**********************************************************"<<endl;
        cout<<"*........................................................*"<<endl;
        cout<<"*........................................................*"<<endl;
        cout<<"*........................................................*"<<endl;
        cout<<"*....@.......@....@@@@@@@@@....@............@@@@@@@@@....*"<<endl;
        cout<<"*....@@......@....@............@............@............*"<<endl;
        cout<<"*....@.@.....@....@............@............@............*"<<endl;
        cout<<"*....@..@....@....@............@............@............*"<<endl;
        cout<<"*....@...@...@....@@@@@@@@@....@............@@@@@@@@@....*"<<endl;
        cout<<"*....@....@..@....@............@....................@....*"<<endl;
        cout<<"*....@.....@.@....@............@....................@....*"<<endl;
        cout<<"*....@......@@....@............@....................@....*"<<endl;
        cout<<"*....@.......@....@............@@@@@@@@@....@@@@@@@@@....*"<<endl;
        cout<<"*........................................................*"<<endl;
        cout<<"*........................................................*"<<endl;
        cout<<"*........................................................*"<<endl;
        cout<<"**********************************************************"<<endl;


    }
    else if(n==4)
    {
        cout<<"***********************************************************************"<<endl;
        cout<<"*.....................................................................*"<<endl;
        cout<<"*.....................................................................*"<<endl;
        cout<<"*.....................................................................*"<<endl;
        cout<<"*.....................................................................*"<<endl;
        cout<<"*.....@.........@.....@@@@@@@@@@@.....@...............@@@@@@@@@@@.....*"<<endl;
        cout<<"*.....@@........@.....@...............@...............@...............*"<<endl;
        cout<<"*.....@.@.......@.....@...............@...............@...............*"<<endl;
        cout<<"*.....@..@......@.....@...............@...............@...............*"<<endl;
        cout<<"*.....@...@.....@.....@...............@...............@...............*"<<endl;
        cout<<"*.....@....@....@.....@@@@@@@@@@@.....@...............@@@@@@@@@@@.....*"<<endl;
        cout<<"*.....@.....@...@.....@...............@.........................@.....*"<<endl;
        cout<<"*.....@......@..@.....@...............@.........................@.....*"<<endl;
        cout<<"*.....@.......@.@.....@...............@.........................@.....*"<<endl;
        cout<<"*.....@........@@.....@...............@.........................@.....*"<<endl;
        cout<<"*.....@.........@.....@...............@@@@@@@@@@@.....@@@@@@@@@@@.....*"<<endl;
        cout<<"*.....................................................................*"<<endl;
        cout<<"*.....................................................................*"<<endl;
        cout<<"*.....................................................................*"<<endl;
        cout<<"*.....................................................................*"<<endl;
        cout<<"***********************************************************************"<<endl;

    }
    else
    {
        cout<<"************************************************************************************"<<endl;
        cout<<"*..................................................................................*"<<endl;
        cout<<"*..................................................................................*"<<endl;
        cout<<"*..................................................................................*"<<endl;
        cout<<"*..................................................................................*"<<endl;
        cout<<"*..................................................................................*"<<endl;
        cout<<"*......@...........@......@@@@@@@@@@@@@......@..................@@@@@@@@@@@@@......*"<<endl;
        cout<<"*......@@..........@......@..................@..................@..................*"<<endl;
        cout<<"*......@.@.........@......@..................@..................@..................*"<<endl;
        cout<<"*......@..@........@......@..................@..................@..................*"<<endl;
        cout<<"*......@...@.......@......@..................@..................@..................*"<<endl;
        cout<<"*......@....@......@......@..................@..................@..................*"<<endl;
        cout<<"*......@.....@.....@......@@@@@@@@@@@@@......@..................@@@@@@@@@@@@@......*"<<endl;
        cout<<"*......@......@....@......@..................@..............................@......*"<<endl;
        cout<<"*......@.......@...@......@..................@..............................@......*"<<endl;
        cout<<"*......@........@..@......@..................@..............................@......*"<<endl;
        cout<<"*......@.........@.@......@..................@..............................@......*"<<endl;
        cout<<"*......@..........@@......@..................@..............................@......*"<<endl;
        cout<<"*......@...........@......@..................@@@@@@@@@@@@@......@@@@@@@@@@@@@......*"<<endl;
        cout<<"*..................................................................................*"<<endl;
        cout<<"*..................................................................................*"<<endl;
        cout<<"*..................................................................................*"<<endl;
        cout<<"*..................................................................................*"<<endl;
        cout<<"*..................................................................................*"<<endl;
        cout<<"************************************************************************************"<<endl;
    }
    return 0;
}

J.Number Game

思路:

代码:

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int t;
int main(){
	cin>>t;
	while(t--){
		ll a,b,c,x;
		cin>>a>>b>>c>>x;
		ll bb=a-b;
		ll mid=(ll)abs(b-bb);
		if(mid==0){
			if(b-c==x||bb-c==x||c==x)cout<<"Yes"<<endl;
			else cout<<"No"<<endl; 
		}else {
			if((ll)abs(b-c-x)%mid==0||(ll)abs(bb-c-x)%mid==0||(ll)abs(c-x)%mid==0)cout<<"Yes"<<endl;
			else cout<<"No"<<endl;
		}
	}
	return 0;
}

M.Z-Game on grid

思路:

给定一个大小为n*m的图,Alice和Bob从(1,1)开始走,Alice先手,每次只能向右或向下,因此在不超过地图大小的前提下,下一步坐标可能是(x+1,y),(x,y+1),遇到“A"则Alice赢,遇到”B“则Bob赢,如果都没有遇到最终一定会走到(n,m),这样的情况则是平手。问无论Bob怎么走,Alice是否都能赢,平手或者输掉比赛。

因为无论Bob怎么走Alice都能满足条件,所以当Alice走时需要保证在下一步的两种路径中有一条是满足条件的,而在Bob走时需要满足两条路径都是满足条件的,这样Bob无论选择哪条路径Alice都可以达到想要的效果。用一个二维数组dp[x][y]来存走到(x,y)时的状态,如果当前路径(x+y)是偶数,则下一步是Alice走,则dp[x][y]=(dfs(x+1,y)|dfs(x,y+1));如果当前路径(x+y)是奇数,则下一步是Bob走,则dp[x][y]=(dfs(x+1,y)&dfs(x,y+1))。

反思:一开始我写的时候并没有用一个二维数组去存(x,y)的位置状态而是直接搜索,这样导致我写的代码超时了,后面用二维数组去记录状态就可以首先判断该位置是否已经走过并且记录状态,并直接返回该状态。

代码:

#include<bits/stdc++.h>
#define N 510
#define ll long long
using namespace std;
int t,n,m;
string mp[N];
int dp[N][N];
int dfsa(int x,int y)
{
    if(dp[x][y]>=0) return dp[x][y];
    if(mp[x][y]=='A') return 1;
    if(mp[x][y]=='B') return 0;
    if(x==(n-1)&&y==(m-1)) return 0;

    if((x+y)%2==0)//下一步是Alice走
    {
        if((x+1<n)&&(y+1<m))
        return dp[x][y]=(dfsa(x+1,y)|dfsa(x,y+1));
        else if(x+1>=n)
        return dfsa(x,y+1);
        else 
        return dfsa(x+1,y);
    }
    else //下一步是Bob走
    {
        if((x+1<n)&&(y+1<m))
        return dp[x][y]=(dfsa(x+1,y)&dfsa(x,y+1));
        else if(x+1>=n)
        return dfsa(x,y+1);
        else 
        return dfsa(x+1,y);
    }

}

int dfsb(int x,int y)
{
    if(dp[x][y]>=0)return dp[x][y];
    if(mp[x][y]=='B') return 1;
    if(mp[x][y]=='A')return 0;
    if(x==(n-1)&&y==(m-1)) return 0;
    if((x+y)%2==0)//下一步是Alice走
    {
        if((x+1<n)&&(y+1<m))
        return dp[x][y]=(dfsb(x+1,y)|dfsb(x,y+1));
        else if(x+1>=n)
        return dfsb(x,y+1);
        else 
        return dfsb(x+1,y);
    }
    else //下一步是Bob走
    {
        if((x+1<n)&&(y+1<m))
        return dp[x][y]=(dfsb(x+1,y)&dfsb(x,y+1));
        else if(x+1>=n)
        return dfsb(x,y+1);
        else 
        return dfsb(x+1,y);
    }

}

int dfsc(int x,int y)
{
    if(dp[x][y]>=0) return dp[x][y];
    if(mp[x][y]!='.') return 0;
    if(x==(n-1)&&y==(m-1))return 1;
    if((x+y)%2==0)//下一步是Alice走
    {
        if((x+1<n)&&(y+1<m))
        return dp[x][y]=(dfsc(x+1,y)|dfsc(x,y+1));
        else if(x+1>=n)
        return dfsc(x,y+1);
        else 
        return dfsc(x+1,y);
    }
    else //下一步是Bob走
    {
        if((x+1<n)&&(y+1<m))
        return dp[x][y]=(dfsc(x+1,y)&dfsc(x,y+1));
        else if(x+1>=n)
        return dfsc(x,y+1);
        else 
        return dfsc(x+1,y);
    }

}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        memset(dp,-1,sizeof(dp));
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
        {
            cin>>mp[i];
        }

        int ans=dfsa(0,0);
        if(ans) printf("yes ");
         else printf("no ");
        memset(dp,-1,sizeof(dp));

        ans=dfsc(0,0);
        if(ans) printf("yes ");
         else printf("no ");
        memset(dp,-1,sizeof(dp));

        ans=dfsb(0,0);
        if(ans) printf("yes");
         else printf("no");
         cout<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值