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号
浙公网安备 33010602011771号