luogu P1725 琪露诺

洛谷P1725琪露诺题解
本文介绍了一种解决洛谷P1725琪露诺问题的方法,采用动态规划与线段树相结合的方式。通过线段树维护最大值,实现了高效的区间查询与更新操作。

二次联通门 : luogu P1725 琪露诺

 

 

/*
    luogu P1725 琪露诺 

    DP + 线段树 
    
    用线段树维护dp[i - R] ~ dp[i - L]的最大值
    
    然后 转移方程是    
        dp[i] = max (dp[i - R], dp[i - R + 1], .... dp[i - L - 1], dp[i - L]) + number[i]
    具体边界细节自己乱搞一下就好 
*/
#include <cstdio>

#define Max 200009
#define INF 1e7

inline int max (int a, int b)
{
    return a > b ? a : b;
}

void read (int &now)
{
    now = 0;
    bool flag = false;
    register char word = getchar ();
    while (word > '9' || word < '0')
    {
        if (word == '-')
            flag = true;
        word = getchar ();
    }
    while (word >= '0' && word <= '9')
    {
        now = now * 10 + word - '0';
        word = getchar ();
    }
    if (flag)
        now = -now;
}

int N, L, R;

int number[Max];

struct Segment 
{
    struct Segment_Tree
    {
        int l;
        int r;
        int Maxn;
        int Mid;
    };
    
    Segment_Tree tree[Max << 3];
    
    void Build (int l, int r, int now)
    {
        tree[now].l = l;
        tree[now].r = r;
        if (l == r)
            return ;
        tree[now].Mid = (l + r) >> 1;
        Build (l, tree[now].Mid, now << 1);
        Build (tree[now].Mid + 1, r, now << 1 | 1);
    }
    
    int Query_Maxn (int l, int r, int now)
    {
        if (tree[now].l == l && tree[now].r == r)
            return tree[now].Maxn;
        if (r <= tree[now].Mid)
            return Query_Maxn (l, r, now << 1);
        else if (l > tree[now].Mid)
            return Query_Maxn (l, r, now << 1 | 1);
        else
            return max (Query_Maxn (l, tree[now].Mid, now << 1), Query_Maxn (tree[now].Mid + 1, r, now << 1 | 1));
    }
    
    void Change_Single (int pos, int now, int number)
    {
        if (tree[now].l == tree[now].r)
        {
            tree[now].Maxn = number;
            return ;
        }
        if (pos <= tree[now].Mid)
            Change_Single (pos, now << 1, number);
        else if (pos > tree[now].Mid)
            Change_Single (pos, now << 1 | 1, number);
        tree[now].Maxn = max (tree[now << 1].Maxn, tree[now << 1 | 1].Maxn);
    }
};

Segment Tree;

int main (int argc, char *argv[])
{
    read (N);
    read (L);
    read (R);
    Tree.Build (0, N, 1);
    for (int i = 0; i <= N; i++)
    {
        read (number[i]);
        if (i <= L)
            Tree.Change_Single (i, 1, number[i]); 
    }
    for (int i = L + 1; i <= N; i++)
        if (i - L >= L)
            Tree.Change_Single (i, 1, Tree.Query_Maxn(max(L, i - R), i - L, 1) + number[i]);
        else 
            Tree.Change_Single (i, 1, number[i]);  
    printf ("%d", Tree.Query_Maxn (N - R, N, 1));
    return 0;
} 

 

转载于:https://www.cnblogs.com/ZlycerQan/p/6747762.html

请修改一下题面,题意不要发生改变,公式不要发生改变,将主人公换成中雅的数学老师胡特,多写一点,题目自拟 题面: ## 题目背景 上白泽慧音在给雾之湖的妖精们讲课。 某天,慧音在上数学课时,提到了一种非常有趣的记号:**高德纳箭号表示法**。它可以用来描述非常巨大的数字。~~比如紫的年龄。~~ 对于非负整数 $a, b$ 和正整数 $n$,高德纳箭号表示法的定义为: $$a \uparrow^n b = \begin{cases} 1\ (b = 0) \\ a^b\ (n = 1\ \operatorname{and}\ b > 0) \\ a \uparrow^{n - 1} (a \uparrow^n (b - 1))\ (n > 1\ \operatorname{and}\ b > 0) \end{cases}$$ 一些简单的例子: - $2 \uparrow 31 = 2^{31} = 2147483648$ - $2 \uparrow \uparrow 4 = 2^{2^{2^2}} = 2^{2^4} = 2^{16} = 65536$ 注: 1. $a \uparrow b$ 与 $a \uparrow^1 b$ 相同; 2. $a \uparrow \uparrow b$ 与 $a \uparrow^2 b$ 相同; 3. 请注意幂运算的顺序。 ## 题目描述 慧音希望解决以下关于 $x$ 的方程: $$a \uparrow^n x \equiv b \pmod p$$ 其中,$a, n, b, p$ 为已知的常数,$x$ 为未知数。 被高德纳箭号表示法搞得云里雾里的,但是她不想被头槌。你能帮帮她吗? ## 输入格式 **本题有多组测试数据。** 第一行,一个整数 $T$,表示数据组数。 对于每组数据: 一行,四个整数 $a, n, b, p$。 ## 输出格式 对于每组数据,输出一行,一个整数,如果原方程有解,输出该方程的最小非负整数解;否则,输出 $-1$。 ## 输入输出样例 #1 ### 输入 #1 ``` 3 2 1 1 3 3 1 2 7 7 1 2 4 ``` ### 输出 #1 ``` 0 2 -1 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 3 2 2 4 7 3 2 4 6 5 2 1 3 ``` ### 输出 #2 ``` 2 -1 0 ``` ## 输入输出样例 #3 ### 输入 #3 ``` 3 4 3 5 8 2 3 9 11 6 3 1 5 ``` ### 输出 #3 ``` -1 3 0 ``` ## 说明/提示 **本题开启捆绑测试。** | Subtask | $n$ | $p$ | $T$ | 分值 | 时限 | | :------: | :------: | :------: | :------: | :------: | :------: | | $1$ | $n = 1$ | $2 \leq p \leq 10^9$ 且 $p$ 为质数 | $1 \leq T \leq 100$ | $15 \operatorname{pts}$ | $2.00 \operatorname{s}$ | | $2$ | $n = 2$ | 无特殊限制 | $1 \leq T \leq 5 \times 10^3$ | $25 \operatorname{pts}$ | $1.00 \operatorname{s}$ | | $3$ | $n = 3$ | 无特殊限制 | 无特殊限制 | $60 \operatorname{pts}$ | $2.00 \operatorname{s}$ | 对于 $100\%$ 的数据,$1 \leq a \leq 10^9$,$1 \leq n \leq 3$,$0 \leq b < p \leq 10^9$,$1 \leq T \leq 2 \times 10^4$。
09-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值