E - Integers on Grid
题意:给你一个矩阵,矩阵里面填了数,从一个格子出发,每一步可以沿着行或者列跳到比他数字大的格子,问每个点最多能跳多少步?
sol.从第到高转移,每次动态维护一个 当且列,当且行的最大值即可
F - Problem where +s Separate Digits
题意:给你一个字符串,可以在任意空格里填上加号,得到一个公式,问所有可行的公式的和是多少?
sol.考虑做到第\(i\)位,不妨预处理出 $ 以i为最右端点的数字和 * 其左边的方案数$,可以发现,再同时乘上右边的方案数,就是整个答案了
#include<bits/stdc++.h>
typedef long long ll;
#define MAXN 400005
#define INF 0x3f3f3f3f
const ll mod = 998244353;
using namespace std;
int n;
char a[MAXN];
ll sum[MAXN],f[MAXN],sum2[MAXN],ans;
ll poww(ll x , int y){
ll zz = 1;
while(y){
if(y & 1)zz = (zz * x) % mod;
x = (x * x) % mod;
y = y >> 1;
}
return zz;
}
int main(){
scanf("%s" , a + 1);
n = strlen(a + 1);
for(int i = 1 ; i <= n ; i++){
sum[i] = ((sum[i - 1] * 10) % mod + (poww(2 , i - 1) * 1ll * (a[i] - '0')) % mod) % mod;
if(i < n)ans = (ans + (sum[i] * poww(2 , n - i - 1)) % mod) % mod;
}
cout<<(ans + sum[n]) % mod<<endl;
}
但这么做不太香,看到官方题解---好妙
对一个字符串随机选空格中间加上+号,求最后得到的表达式的值的期望,再乘以\(2^{|S| - 1}\)
G - Roll or Increment
题意:给你一个\(N\)面骰子,一开始朝上的数字是\(S\), 你可以进行如下操作:
花\(A\)日元,让朝上的数字变成当前朝上的数字加1,如果朝上的数字是\(N\),则不可以进行此操作
花\(B\)日元,重新扔一次
以最省钱的策略操作,问把朝上的数字变成\(T\)的消费的期望。
G - Roll or Increment
题意:给你一个二分图,左边有\(L\)个点,右边有\(R\)个点,每个点安装一个摄像头需要花费若干钱。
给你一个\(L ∗ R\)的矩阵,要求你花最少的钱,使得$< L i , R j > $ , 有\(C_{ij}\)个摄像头