A:Long Comparison
比较两个添加零的大整数的大小,直接对情况进行判断即可。
B:Absent Remainder
给定一个包含有
n
n
n个数的数列,你需要找到
⌊
n
2
⌋
\lfloor \frac{n}{2} \rfloor
⌊2n⌋对整数
x
,
y
x,y
x,y,满足
x
,
y
x,y
x,y出现在序列中但是
x
m
o
d
y
x\ mod\ y
x mod y不出现在原序列中。很简单的构造题,找到一个序列中最小的数
m
i
n
n
u
m
minnum
minnum,序列中所有的数模它都小于
m
i
n
n
u
m
minnum
minnum,可以构造出
n
−
1
n-1
n−1对,对于
2
≤
n
≤
2
e
5
2\le n\le 2e5
2≤n≤2e5来说显然满足题意。
C:Poisoned Dagger
给定一个时间序列,代表毒药发挥作用的时间,记两个时间点的间隔是
g
a
p
gap
gap,每秒毒药都会造成一点伤害,因此每个时间点到下个时间点毒药造成的伤害是
m
i
n
(
g
a
p
,
k
)
min(gap,k)
min(gap,k),其中
k
k
k是毒药能持续的时间,求能够达到给定伤害值
h
h
h的最小的
k
k
k值。很明显二分,然后检查能不能满足题意的伤害即可。
D:MEX Sequences
给定一个序列,你需要找到有多少个子序列 x 1 , x 2 , . . . , x k x_1,x_2,...,x_k x1,x2,...,xk能够满足 ∣ x i − M E X ( x 1 , x 2 , . . . , x i ) ∣ ≤ 1 ( 1 ≤ i ≤ k ) |x_i-MEX(x_1,x_2,...,x_i)|\le1(1\le i\le k) ∣xi−MEX(x1,x2,...,xi)∣≤1(1≤i≤k).一个很有意思的DP,我们发现只有两种序列能够满足上述题意:①该序列的最大值是 x x x,同时 0 , 1 , 2... , x − 1 , x 0,1,2...,x-1,x 0,1,2...,x−1,x都按序出现;②该序列的最大值是 x x x,同时 0 , 1 , 2... , x − 2 0,1,2...,x-2 0,1,2...,x−2都按序出现,但缺少 x − 1 x-1 x−1。令 d p [ x ] [ 0 / 1 ] dp[x][0/1] dp[x][0/1]表示最大值为 x x x的两种序列。设当前需要被处理的数是 a a a,很明显,他可以跟在最大值为 a , a − 1 a,a-1 a,a−1的一号序列后面形成一号序列,可以跟在 a + 2 a+2 a+2的二号序列后面或者 a − 2 a-2 a−2的一号序列后面形成二号序列。注意0和1的特判,0可以只选自己形成一号序列,1可以只选自己形成二号序列。
#include<bits/stdc++.h>
#define close ios::sync_with_stdio(false)
using namespace std;
typedef long long ll;
const int maxn=5e5+100;
const int mod=998244353;
ll dp[maxn][2];
int main()
{
close;int T;cin>>T;
while(T--){
int n;cin>>n;
for(int i=0;i<=n;++i) dp[i][0]=dp[i][1]=0;
for(int i=1;i<=n;++i){
int x;cin>>x;
if(x==0) dp[0][0]=dp[0][0]<<1|1,dp[0][1]=0;
else if(x==1) dp[1][0]+=dp[1][0]+dp[0][0],dp[1][1]=dp[1][1]<<1|1;
else{
dp[x][0]+=dp[x][0]+dp[x-1][0];
dp[x][1]+=dp[x][1]+dp[x-2][0];
}
dp[x+2][1]<<=1;dp[x+2][1]%=mod;
dp[x][0]%=mod;dp[x][1]%=mod;
}
ll ans=0;
for(int i=0;i<=n;++i) ans=(ans+dp[i][0]+dp[i][1])%mod;
cout<<ans<<"\n";
}
}
E:Crazy Robot
对于一个 n × m n×m n×m的二维矩阵,‘#’代表障碍,’.'代表空地,‘L’代表终点。有一个机器人,只能按照上下左右的方向行走,而且规定:每次用户给定一个方向,机器人都会随机的选择一个另外三个方向中能够行走的一个方向前进一步,否则就原地保持不动。问机器人从地图上的哪些空地出发一定能够按照上述规则到达终点。简单BFS,总结起来就一句话:想让机器人一定能够朝某个方向走一步(该方向可达),当且仅当机器人只能在最多两个可达的行走方向中做出选择.
#include<bits/stdc++.h>
#define close ios::sync_with_stdio(false)
#define PII pair<int,int>
using namespace std;
typedef long long ll;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};int n,m;
bool Judge(int x,int y){
if(x>=1 && x<=n && y>=1 && y<=m) return true;
return false;
}
int main()
{
close;int T;cin>>T;
while(T--){
cin>>n>>m;int sx,sy;
vector<vector<char> > mp(n+10,vector<char>(m+10));
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j){
cin>>mp[i][j];
if(mp[i][j]=='L') sx=i,sy=j;
}
}
queue<PII> Q;while(!Q.empty()) Q.pop();
for(int i=0;i<4;++i) if(Judge(sx+dx[i],sy+dy[i]) && mp[sx+dx[i]][sy+dy[i]]=='.') Q.push(PII(sx+dx[i],sy+dy[i]));
while(!Q.empty()){
PII cur=Q.front();Q.pop();int num=0;
for(int i=0;i<4;++i) if(Judge(cur.first+dx[i],cur.second+dy[i]) && mp[cur.first+dx[i]][cur.second+dy[i]]=='.') num++;
if(num<=1){
mp[cur.first][cur.second]='+';
for(int i=0;i<4;++i) if(Judge(cur.first+dx[i],cur.second+dy[i]) && mp[cur.first+dx[i]][cur.second+dy[i]]=='.') Q.push(PII(cur.first+dx[i],cur.second+dy[i]));
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)
cout<<mp[i][j];
cout<<"\n";
}
}
}