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;
}