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;
}
posted @ 2022-09-24 18:40  starlightlmy  阅读(132)  评论(0)    收藏  举报