ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【Codeforces】#695 D.Sum of Paths

2021-01-12 09:04:06  阅读:206  来源: 互联网

标签:Paths const Sum 路径 Codeforces long 权值 下标 ll


CodeForces #695 D. Sum of Paths

题目链接

题意

给出一个长度为 \(n\) 的整数数组,现在可以将一个机器人放到任意一个位置。

这个机器人必须走 \(k\) 步,每次可以选择向左或者向右走,但不会越界。走 \(k\) 步之后,经过的数组元素和,就是这条 \(good\ path\) 的权值。

现在给定 \(q\) 个操作,每次给出两个数字 \(i,x\),将 下标 \(i\) 处的元素替换为 \(x\)。
对于每个操作,输出所有可能的路径的权值和。

题解

概要:
求出每个元素对于路径权值和的贡献次数,以及初始权值和;对于每次修改,加上权值差 * 贡献次数。

用 \(dp[i][j]\) 表示第 \(i\) 步走到 \(j\) 位置的路径数量。

\(num[i]\) 表示下标为 \(i\) 对于权值和的贡献次数。

可以知道以 \(i\) 为开头的路径数量和以 \(i\) 为结尾的路径数量是相同的。

对于 \(i\),考虑其在长度为 \(k\) 的路径中的次序。

for (int j = 0; j <= k;j++){
    num[i] += dp[j][i] * dp[k - j][i];
}

将所有的可能加起来,就得到了下标 \(i\) 的贡献次数。

代码

#include <bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll mod = 1e9 + 7;
const double eps = 1e-6;
const ll inf = 0x3f3f3f3f;
const ll N = 5e3 + 10;

ll dp[N][N], arr[N];
ll num[N];
int main()
{
    ll n, k, q;
    scanf("%lld%lld%lld", &n, &k, &q);
    for (ll i = 1; i <= n; i++) {
        scanf("%lld", &arr[i]);
    }
    for (ll i = 1; i <= n; i++) {
        dp[0][i] = 1;
    }
    for (ll i = 1; i <= k; i++) {
        for (ll j = 1; j <= n; j++) {
            dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j + 1]) % mod;
        }
    }
    for (ll i = 1; i <= n; i++) {
        for (ll j = 0; j <= k; j++) {
            num[i] = (num[i] + dp[j][i] * dp[k - j][i] % mod) % mod;
        }
    }
    ll ans = 0;
    for (ll i = 1; i <= n; i++) {
        ans = (ans + num[i] * arr[i] % mod) % mod;
    }
    while (q--) {
        ll pos, val;
        scanf("%lld%lld", &pos, &val);
        ans = (ans + ((val - arr[pos]) % mod + mod) % mod * num[pos] % mod) % mod;
        printf("%lld\n", ans);
        arr[pos] = val;
    }
    return 0;
}

标签:Paths,const,Sum,路径,Codeforces,long,权值,下标,ll
来源: https://www.cnblogs.com/valk3/p/14265263.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有