IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 牛客月赛49_DE -> 正文阅读

[数据结构与算法]牛客月赛49_DE

本篇题解只是记录我的做题过程代码,不提供最优解
(另外这里所有的时间复杂度都只分析单个样例,不算 t t t的时间复杂度)

D

点击此处查看对应的题目.
本题设计算法:逆元 + 快速幂 + 二次函数性质
请添加图片描述

本题要求得到两和之差的最大值: 由图像可知,S(b) - S(a - 1) 即为f(x) 的最大值(类似前缀和)。

所以这里我们要求得S(a) 和 S(b),所以,我们要得到求 S 的公式

S ( x ) S(x) S(x) = ? ∑ 1 x x 2 + ( a + b ) ∑ 1 x x + ( a ? b ) ∑ 1 x 1 -\displaystyle \sum_{1}^{x}x^2 + (a + b)\displaystyle \sum_{1}^{x}x +(a * b)\displaystyle \sum_{1}^{x}1 ?1x?x2+(a+b)1x?x+(a?b)1x?1

分别求和

  • ∑ 1 x x 2 \displaystyle \sum_{1}^{x}x^2 1x?x2:数学归纳法:
    请添加图片描述
  • ∑ 1 x x \displaystyle \sum_{1}^{x}x 1x?x:等差数列求和
  • ∑ 1 x 1 \displaystyle \sum_{1}^{x}1 1x?1:即为 n

最后还需要注意一点:
由于本题需要对答案取模运算,且本题目的求和公式中包含除法取模操作,所以,不能直接取模,被除数直接乘上除数的乘法逆元即可与之等效。

求乘法逆元:由于本题的 mod 值是质数,所以我们可以用快速幂求逆元的方法求出乘法逆元

时间复杂度 O ( l o g n ) O(logn) O(logn)

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll N = 1e5 + 10,mod = 998244353;

ll qmi(ll a,ll b) 
{
    ll res = 1;
    while (b) {
        if (b & 1) res = res * a % mod;
        b >>= 1;
        a = a * a % mod;
    }
    return res;
}
ll S(ll n,ll a,ll b)
{
    ll x = n * (n + 1ll) % mod * (2ll * n + 1ll) % mod * qmi(6,mod - 2) % mod;
    ll y = (a + b) * n % mod * (n + 1ll) % mod * qmi(2,mod - 2) % mod;
    ll z = a * b % mod * n % mod;
    ll res = (-x + y - z) % mod;
    res = (res + mod) % mod;
    return res;
}
int main()
{
    int t;
    cin >> t;
    while (t -- ) {
        ll a,b;
        cin >> a >> b;
        cout << (S(b,a,b) - S(a - 1,a,b) + mod) % mod << '\n';
    }
    return 0; 
}


E

点击此处查看对应的题目.
本题设计算法:递推 / 思维DP?

本题主要需要通过对比可能的数据,我们可以发现一下特点

  • 每次走一步都必须比原来的数字+1
  • dp[i] = dp[i - 1]/dp[i + 1] - a[i] 的规律(dp[i]表示从第 i 个点开始的最小初始值)

对比数据:
1 2 3 4 0
2 2 1 10 0
2 1 0 1 2

时间复杂度 O ( n ) O(n) O(n)

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const ll N = 3e6 + 10,INF = 1e18;
ll a[N],dp[N];//dp[i]表示从第 i 个点开始的最小初始值

void solve()
{
    int n,idx;
    cin >> n;
    for (int i = 1;i <= n;i ++ ) {
        scanf("%lld",&a[i]);
        if (!a[i]) idx = i;
    }
    if (n == 1) {
        puts("No Solution");
        return;
    }
    for (int i = 1;i <= n + 5;i ++ ) dp[i] = INF; 
    for (int i = idx - 1;i >= 1; i -- ) {
        dp[i] = a[i] + 1;
        if (i != idx - 1) dp[i] = max(dp[i],dp[i + 1] - a[i]);
    }
    for (int i = idx + 1;i <= n;i ++ ) {
        dp[i] = a[i] + 1;
        if (i != idx + 1) dp[i] = max(dp[i],dp[i - 1] - a[i]);
    }
    ll res = INF;
    for (int i = 1;i <= n;i ++ ) res = min(res,dp[i]);
    cout << res << '\n';
}
int main()
{
    int t;
    cin >> t;
    while (t -- ) solve();
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:39:00  更:2022-05-11 16:41:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:48:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码