首页 > 其他分享 >[题解]CF1775E The Human Equation

[题解]CF1775E The Human Equation

时间:2024-11-27 23:47:05浏览次数:8  
标签:int 题解 Equation 负数 tag Human 缩成 正数 dp

来个另类解。

思路

手玩一下样例,发现减法只会用在正数上,加法只会用在负数上,大概是因为如何在负数上用了减法或在正数上用了加法,都需要额外的次数去消掉。

然后注意到在两个正数中间包这的所有负数可以直接缩成一个数,两个负数中间包着的所有正数也可以直接缩成一个数。那么现在的序列就变成了一个正负相间的序列了,对于每一次操作都可以直接打一个 tag。

考虑简化操作,对于一个序列记其中绝对值最小的数为 \(x\),那么在 \(|x|\) 次操作后,所有绝对值为 \(|x|\) 的位置值都将变成 \(0\)。但是因为 \(0\) 的出现,会导致序列不再正负相间,因此可以用 set 维护,每一次删除 \(|x|\) 的数,将其两边的数合在一起。复杂度 \(\Theta(n \log n)\)。

发现将两边的数 \(x,y\) 合在一起成为 \(x + y - tag\),因为 \(x,y\) 均要减去一个 \(tag\),但是单一元素只会减一个 \(tag\)。将这个模拟过程刻画一下:将两个正数合并的代价是中间的负数大小,将两个负数合并的代价是中间正数的大小。

不妨定义 \(dp_i\) 表示包含第 \(i\) 个数的最大段的权值和,显然有转移 \(dp_i = \max(0,dp_{i - 2} - t_{i - 1}) + t_i\),其中 \(t_i\) 表示将正数缩成一个点,负数缩成一个点过后的序列。

Code

#include <bits/stdc++.h>
#define re register
#define int long long
#define chmax(a,b) (a = max(a,b))

using namespace std;

const int N = 1e6 + 10;
int n;
int num,arr[N],tmp[N],dp[N];

inline int read(){
    int r = 0,w = 1;
    char c = getchar();
    while (c < '0' || c > '9'){
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9'){
        r = (r << 3) + (r << 1) + (c ^ 48);
        c = getchar();
    }
    return r * w;
}

#define check(x,y) (((x) <= 0 && (y) <= 0) || ((x) >= 0 && (y) >= 0))

inline void solve(){
    num = 0; n = read();
    for (re int i = 1;i <= n;i++) arr[i] = read();
    int lst = 0;
    for (re int i = 1;i <= n;i++){
        if (check(lst,arr[i])) lst += arr[i];
        else{
            tmp[++num] = abs(lst);
            lst = arr[i];
        }
    }
    if (lst) tmp[++num] = abs(lst);
    int ans = 0;
    for (re int i = 1;i <= num;i++){
        dp[i] = max(0ll,dp[i - 2] - tmp[i - 1]) + tmp[i];
        chmax(ans,dp[i]);
    }
    printf("%lld\n",ans);
}

signed main(){
    int T; T = read();
    while (T--) solve();
    return 0;
}

标签:int,题解,Equation,负数,tag,Human,缩成,正数,dp
From: https://www.cnblogs.com/WaterSun/p/18573313

相关文章

  • FZOUTSY 题解
    题意简述给定一个长度为\(n\)的,由特定\(7\)种字符构成的字符串,有\(m\)次询问,每次询问需要求出编号在\([l,r]\)内的后缀中,有多少对后缀的最长公共前缀长度大于等于\(k\)。题目分析注意到在所有询问中,\(k\)的值是一样的,所以我们可以考虑求出给定字符串中以第\(i\)个......
  • LLM Defenses Are Not Robustto Multi-Turn Human Jailbreaks Yet
    ......
  • [题解]P8867 [NOIP2022] 建造军营
    P8867[NOIP2022]建造军营只有B国袭破坏的道路是无向图的割边时,这张图才会变得不连通,所以我们进行边双缩点,最终形成一棵树,不妨令根节点为\(1\)。记\(E[u]\)为缩点后的\(u\)包含多少条原图上的边,\(V[u]\)为\(u\)包含多少个原图上的点,并定义\(s[u]\)表示子树\(u\)中的边数。那么......
  • 龙芯3A4000的linux系统下node14.17.5运行出现Floating point exception(浮点数异常)问
    因项目需要在龙芯下使用node14.17.5执行构建任务,在使用源码编译安装后,执行时出现Floatingpointexception(浮点数异常)问题。经调试发现,其是在使用openssl加载ECC相关证书时使用mips64汇编代码时导致的。在分析相关代码后,将deps下的openssl中的bn_div.c文件的16行进行修改,重新......
  • 2023ICPC 亚洲区域赛南京站 The 2nd Universal Cup 题解 更新至 7 题
    2023ICPC亚洲区域赛南京站The2ndUniversalCup题解更新至7题Preface住院了,在医院闲得无聊自己V了一场。这场复习赛,貌似半年前还是一年前打过一次,只过了4个题。今日来还愿了。但有些题还是不会做,真的唐。我会在代码一些有必要的地方加上注释,签到题可能一般就不会写了.......
  • python问题解决-外部模块明明安装了,却总是无法找到
    1现象代码中引入了cv2模块,这是一个图像识别模块。但运行时总提示找不到该模块。也按照要求安装了opencv-python等模块。还有其它的,如python-pptx模块,提示如下:Traceback(mostrecentcalllast):File"E:/python/wps/ppt_pic.py",line1,in<module>frompp......
  • [题解]P3629 [APIO2010] 巡逻
    P3629[APIO2010]巡逻\(k=1\)时,我们一定贪心选择直径\(d\)的两个端点建立道路,所以答案是\(2\times(n-1)-d+1\)。\(k=2\)时,两条新建的道路恰好形成\(2\)个环,我们通过手玩可以发现一个结论:\(1\)条边恰好被经过\(1\)次,当且仅当它恰好位于\(1\)个环上。\(1\)条边恰好被经过\(2\)......
  • ICPC2022济南站C. DFS Order 2 题解 回滚背包
    题目链接:https://www.luogu.com.cn/problem/P9669题目大意:给你一棵包含\(n\)个节点的有根树。节点编号从\(1\)到\(n\),节点\(1\)是根节点。从节点\(1\)出发对整棵树进行深度优先遍历,会得到很多不同的DFS序。解题思路:基本上和9981day大佬的题解一模一样差不多。......
  • [网鼎杯 2020 朱雀组]phpweb 详细题解(反序列化绕过命令执行)
    知识点:call_user_func()函数反序列化魔术方法find命令查找flag代码审计打开题目,弹出上面的提示,是一个警告warning,而且页面每隔几秒就会刷新一次,根据warning中的信息以及信息中的时间一直在变,可以猜测是date()函数一直在被调用查看源代码发现一些信息,但是作用不......
  • 【题解】洛谷P3674: 小清新人渣的本愿
    P3674小清新人渣的本愿自己想出来了,好耶!!其实和兔子洞那题差不多,标记哪些数区间中出现了,因为bitset就相当于状压,也是支持位运算的,所以减法相当于右移\(x\)位后与运算,如果有交说明可以得到\(x\),加法就要额外维护\(g=f_{N-i}\),查询时直接查找\(f\)与\(g\)右移\(N-x\)位......