首页 > 其他分享 >CF1421E题解

CF1421E题解

时间:2023-07-10 18:45:33浏览次数:56  
标签:2p int 题解 ll CF1421E 序列 dp equiv

题目链接

本题作为一道本人思考了50分钟没想出来的大思维题,我觉得可以用来扩宽一下大家的视野。

本题中,我们每次都会选取两个相邻的数 \(a_i\) 和 \(a_{i+1}\),同时将这两位变为一位,这一位上填的数为 \(-(a_i+a_{i+1})\)。

很容易想到的一个 \(O(n^3)\) 的 dp 做法是区间 dp,设 \(f[l,r]\) 为区间 \([l, r]\) 的最大值,\(g[l,r]\) 为区间 \([l, r]\) 的最小值,我们就可以得到如下方程:

\[f[l, r] = f[l,r]=\max \limits _{k=l}^{r-1}\{ -(g[l, k]+g[k+1,r]) \} \]

\[g[l, r] = g[l,r]=\min \limits _{k=l}^{r-1}\{ -(f[l, k]+f[k+1,r]) \} \]

但是题目数据范围太大,无法承受。

我们可以考虑一下答案有没有什么性质。

一个比较显然的性质是:答案一定是 \(a\) 序列所有数加加减减得到的,更严谨地说,\(a\) 序列中每个数对答案的贡献取决于它在答案中的正负号。

因此我们可以考虑什么样的正负号排列才是合法的。

我们可以枚举一下 \(n = 1, 2, 3\) 的情况。


\(n = 1\)

符合要求的序列有 +

\(n=2\)

符合要求的序列有 --

\(n=3\)

符合要求的序列有 ++-, -++


能不能发现什么性质

我们统计一下 - 的数量 \(p\), + 的数量 \(q\),我们可以很难发现一个规律:\(2p+q \equiv 1 \pmod{3}\)


证明:显然对于 \(n=1,2,3\) 的情况都成立,考虑当长度为 \(n\) 时的情况:

每个情况一定都是两种合法情况的组合,那么:

\[\begin{aligned} -[(2p_1+q_1)+(2p_2+q_2)] &\equiv -(1+1) \pmod{3} \\ &\equiv 1 \pmod{3} \end{aligned} \]

证毕


但是还有一种情况:+-+-+-+-......。这种情况是不合法的。所以我们接下来还要考虑上这点。

想到这个性质之后我们就可以开始 dp 了,我们设 \(f[i][j][k][u]\) 表示当前考虑到第 \(i\) 个数,\(2p+q\) 在模 \(3\) 意义下为 \(j\),上一个符号为 \(k\),是否出现了两个相同符号相邻 \(u\)。

状态设计出来后就可以开始 dp 了。

\[f[i+1][(j+2)\bmod 3][0][u|(k==0)]\leftarrow f[i][j][k][u]-a_{i+1} \]

\[f[i+1][(j+1)\bmod 3][1][u|(k==1)]\leftarrow f[i][j][k][u]+a_{i+1} \]

然后就可以愉快 AC 力!

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 2e5 + 10;
ll f[N][4][2][2];
ll a[N];
int n;

int main()
{
    n = read();
    for(int i = 1; i <= n; i ++ ) a[i] = read();

    if(n == 1)
    {
        cout << a[1] << endl;
        return 0;
    } 
    
    memset(f, -0x3f, sizeof f);

    f[1][1][1][0] = a[1], f[1][2][0][0] = -a[1];

    for(int i = 1; i < n; i ++ )
        for(int j = 0; j < 3; j ++ )
            for(int k = 0; k < 2; k ++ )
                for(int u = 0; u < 2; u ++ )
                {
                    f[i + 1][(j + 2) % 3][0][u | (k == 0)] = max(f[i + 1][(j + 2) % 3][0][u | (k == 0)], 
                    f[i][j][k][u] - a[i + 1]);
                    f[i + 1][(j + 1) % 3][1][u | (k == 1)] = max(f[i + 1][(j + 1) % 3][1][u | (k == 1)], 
                    f[i][j][k][u] + a[i + 1]);
                }

    cout << max(f[n][1][0][1], f[n][1][1][1]) << endl;

    return 0;
}

标签:2p,int,题解,ll,CF1421E,序列,dp,equiv
From: https://www.cnblogs.com/crimsonawa/p/17542000.html

相关文章

  • NOIP2013-2023题解
    本文章主要是为了不想卷题的时候不是特别颓废而准备本文章是为了总结NOIP最近的题目(为了今年NOIP做准备),目前还没写完,尽量做的全面一些。2013积木大赛给定一个长度为\(n\)的序列\(h_i\),初始有一个全为\(0\)的序列,每次操作可以任意选择\(L,R\),使得\([L,R]\)这段区......
  • CF1545D-题解
    题目链接题目描述有\(n\)个人和\(k\)个间隔相同时间的时刻,每个人都向正方向做匀速直线运动。给出每个时刻(\(0\simk-1\))的所有人的坐标集合(无序),在这\(nk\)个数中有一个数是错误的,找出这个错误的数并将其改正。数据范围:\(5\len\le1000\),\(7\lek\le1000\)。加......
  • 【问题解决】docker login报错 org.freedesktop.Secret.Error.IsLocked: Cannot creat
    问题场景环境docker24.0.2社区版UbuntuServer18.04LTS刚刚执行dockerlogin登录仓库报错:hellxz@bigdata:~/dockerTest$dockerloginharbor.xxx.com.cnUsername:hellxzPassword:**Message:17:26:21.611:Remoteerrorfromsecretservice:org.freedesktop.Se......
  • CF1827D 题解
    problem&blog。很好的题。用到一些关于重心的trick。不妨认为只有一个重心\(\text{maxx}\)。设当前节点数为\(n\),重儿子所在的子树的大小为\(\text{maxsiz}\),那么答案即\(n-2\times\text{maxsiz}\),方法是往重儿子的那个子树爆加节点。因此需要在线维护\(\text{maxx}......
  • CF1601F Two Sorts 题解--zhengjun
    link这里提供一种不用meetinmiddle的方法,速度比较可观。发现性质开始简单的推一下式子。\(\sum(i-a_i)\bmodp=\sum(rk_i-i-p\times\lfloor\frac{rk_i-i}{p}\rfloor)=-p\times\sum\lfloor\frac{rk_i-i}{p}\rfloor,p=998244353\)于是,只需求出\(\sum\lfloor\frac{rk_i-......
  • C++题解——格子游戏
    题目链接:一本通TFLSOJ思路:使用并查集给点连接,如果在连接过程中遇到已连接的点二次连接,就输出代码:#include<bits/stdc++.h>usingnamespacestd;structnode{ intx,y;};nodef[205][205];intn,m;nodefind(nodek){ if(f[k.x][k.y].x==k.x&&f[k.x][k.y].y==k.y)retur......
  • Windows下安装python2和python3双版本及问题解决
    现在大家常用的桌面操作系统有:Windows、MacOS、ubuntu,其中MacOS和ubuntu上都会自带python。这里我们只介绍下Windows(我用的Win10)环境下的python2.x和python3.x的安装,以及python2.x与python3.x共存时的配置问题。本节内容python下载安装Python2.x安装Python3.x当前存......
  • 洛谷P1443:马的遍历--题解
    写在前面这是蒟蒻第一篇题解。作为一名没带脑子的初中生的第一篇题解,本题解必定存在诸多错误,给您带来的不便敬请谅解。对于不足之处与错误,还请多多包涵,并欢迎批评指正!本题目来自于洛谷,网址https://www.luogu.com.cn/problem/P1443。非营利性,侵权请联系删除。题目详情马的遍历......
  • Seata-server.bat闪退问题解决及Seata快速搭建
    转:Seata-server.bat闪退问题解决及Seata快速搭建 1.4上 部署的话 参考下边的地址:seata部署指南(v1.6.1) 启动seata服务前请先做好配置 ......
  • 「BalticOI 2011 Day2」Tree Mirroring 题解
    本文网址:https://www.cnblogs.com/zsc985246/p/17539182.html,转载请注明出处。题目大意现在有一棵树\(T\),复制一个完全相同的\(T'\),并将这两棵树的叶子节点全部对应合并在一起,形成一个图,我们称这种图为对称图。给定一个图,判断它是否为对称图。\(3\len,m\le10^5\)思路......