Codeforces Round #822 (Div. 2) D E
D
https://codeforces.com/contest/1734/problem/D
题意
有 n 只史莱姆,每只都有一个值,其中第 k 只被你控制,你希望能走到 0 或 n + 1 这两个位置,也就是说遇到路上的史莱姆需要将他们吸收,即现有的值加上他们的值
路上任何时候值小于 0 都会导致游戏立即结束
问你是否存在胜利策略
思路
对于你当前处在的这个位置,你会选择向左走,当且仅当你能在此过程中获得增益,或者你可以活着走出去
选择向右走同理
code
设向左、向右走的最大边界为 L , R , 那么可以写出如下代码:(注意细节)
bool f = 0;
int sL = 0, sR = 0;
ll now = a[k];
while(1){
bool fla = 0;
//向左走
while(L > 1 && now + a[L - 1] + sL >= 0) { //生命值满足还可以向左走的条件
sL += a[L - 1];
L--;
if(sL > 0) { //可以获得增益
fla = 1;
now += sL;
sL = 0;
break;
}
}
//向右走
while(R < n && now + a[R + 1] + sR >= 0) { //生命值满足还可以向左走的条件
sR += a[R + 1];
R++;
if(sR > 0) { //可以获得增益
fla = 1;
now += sR;
sR = 0;
break;
}
}
if(L == 1 || R == n) {
f = 1;
break;
}
if(!fla) break;
}
puts(f == 1 ? "YES" : "NO");
E
https://codeforces.com/contest/1734/problem/E
题意
构造
思路
由题意 可转化为,
\[a_{l_2,r_2} - a_{l_2,r_1} \neq a_{l_1,r_1} - a_{l_1,r_2} \ \ (mod \ n)
\]
所以
\[a_{l_2,r_2} = a_{l_2,r_1} + (r_2 - r_1)d_1 \\
a_{l_1,r_1} = a_{l_1,r_2} + (r_2 - r_1)d_2
\]
且
\[d_1 \neq d_2
\]
不妨设
\[d_i = i
\]
所以a:
\[1\ 2\ 3\ 4\ ... \\
2\ 4\ 6\ 8\ ... \\
...\]
a就可以看成是全 1 矩阵的前缀和
于是有 \(a_{i,j} = ij\),再考虑 b 的限制,最终\(a_{i,j} = i*j + b[i] - i*i\)
// #pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define pb push_back
using namespace std;
const int N = 455;
int a[N][N], b[N];
int n;
int main(){
cin >> n;
for(int i = 1; i <= n; i++) cin >> b[i];
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
int tem = i * j + b[i] - i * i;
tem = ((tem % n) + n) % n;
printf("%d ", tem);
}puts("");
}
system("pause");
return 0;
}

浙公网安备 33010602011771号