CodeForces 1467D: Suma de rutas DP + contribución

Portal

Descripción del Título

Una longitud de nnsegmento de línea de n , cada punto tiene un valorai a_ {i}ayo, El valor de este punto se sumará cada vez que pase este punto, puede comenzar desde cualquier punto, y cada vez que pueda mover un cuadrado a la izquierda o un cuadrado a la derecha, pedirle que mueva mmm veces, ¿cuál es la suma de los valores de todos los caminos posibles
qqModificado q veces, cada vez que se modificará un punto deai a_ {i}ayo

análisis

Debido a que todos los esquemas están involucrados, y este rango de datos definitivamente no determinará todas las rutas, podemos pensar en formas de abstraer esta ruta.
Podemos calcular la contribución de cada punto, es decir, la contribución de cada punto. Frecuencia

 f[j][i] = (f[j - 1][i - 1] + f[j + 1][i - 1]) % mod;

Luego, vamos a enumerar i, ji, ji ,j , supongamos que somosjjj paso aiii , entonces un total de casos posibles para esta ruta sonf [i] [j] ∗ f [i] [m - j] f [i] [j] * f [i] [m-j]f [ i ] [ j ]f [ i ] [ m-j ] , es decir el puntoiii ha pasado tantas veces, por lo que este es su valor de contribución.
Finalmente, encuentre la suma de cada punto,qqSolo modifícalo q veces

Código

#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define dl(x) printf("%lld\n",x);
#define di(x) printf("%d\n",x);
#define _CRT_SECURE_NO_WARNINGS
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
const int INF = 0x3f3f3f3f;
const int N = 5010;
const ll mod= 1000000007;
const double eps = 1e-9;
const double PI = acos(-1);
template<typename T>inline void read(T &a){
    
    char c=getchar();T x=0,f=1;while(!isdigit(c)){
    
    if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){
    
    x=(x<<1)+(x<<3)+c-'0';c=getchar();}a=f*x;}
int gcd(int a,int b){
    
    return (b>0)?gcd(b,a%b):a;}
ll f[N][N],cnt[N];
ll a[N];
ll res;
int n,m,q;

int main(){
    
    
    read(n),read(m),read(q);
    for(int i = 1;i <= n;i++) {
    
    
        read(a[i]);
        f[i][0] = 1;
    }
    for(int i = 1;i <= m;i++)
        for(int j = 1;j <= n;j++)
            f[j][i] = (f[j - 1][i - 1] + f[j + 1][i - 1]) % mod;
    for(int i = 1;i <= n;i++)
        for(int j = 0;j <= m;j++)
            cnt[i] = (cnt[i] + (f[i][j] * f[i][m - j]) % mod) % mod;
    for(int i = 1;i <= n;i++) res = (res + (a[i] * cnt[i]) % mod) % mod;
    while(q--){
    
    
        int pos,x;
        read(pos),read(x);
        res = (res - a[pos] * cnt[pos] % mod + mod) % mod;
        a[pos] = x;
        res = (res + a[pos] * cnt[pos] % mod) % mod;
        dl(res);
    }
    return 0;
}

/**
*  ┏┓   ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃       ┃
* ┃   ━   ┃ ++ + + +
*  ████━████+
*  ◥██◤ ◥██◤ +
* ┃   ┻   ┃
* ┃       ┃ + +
* ┗━┓   ┏━┛
*   ┃   ┃ + + + +Code is far away from  
*   ┃   ┃ + bug with the animal protecting
*   ┃    ┗━━━┓ 神兽保佑,代码无bug 
*   ┃        ┣┓
*    ┃        ┏┛
*     ┗┓┓┏━┳┓┏┛ + + + +
*    ┃┫┫ ┃┫┫
*    ┗┻┛ ┗┻┛+ + + +
*/


Supongo que te gusta

Origin blog.csdn.net/tlyzxc/article/details/114587242
Recomendado
Clasificación