题目

题目描述
给定一个长度是nnn的数列AAA,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的。现在你有一个操作可以改变数列,选择一个区间[X,Y]满足Ax+Ax+1+⋯+AY,1<X≤Y<nA_x +A_{x+1} + \cdots + A_Y, 1<X \leq Y<nAx​+Ax+1​+⋯+AY​,1<X≤Y<n,令S=Ax+Ax+1+…+AYS=A_x +A_{x+1} +…+ A_YS=Ax​+Ax+1​+…+AY​,对于Ax−1A_{x-1}Ax−1​和AY+1A_{Y+1}AY+1​分别加上SSS,AxA_xAx​和AYA_YAY​分别减去SSS(如果X=YX=YX=Y就减两次)。问最少几次这样的操作使得最终数列是完美的。

输入格式
第一行一个数nnn,以下nnn个数。

【数据规模】

对于202020%的数据,满足1≤N≤51 \leq N \leq 51≤N≤5;

对于100100100%的数据,满足1≤N≤105;1≤∣A[i]∣≤231−11≤N≤10^5; 1≤|A[i] |≤2^{31}-11≤N≤105;1≤∣A[i]∣≤231−1。

输出格式
一个数表示最少的操作次数,如果无解输出−1-1−1。

输入输出样例
输入
5
13
-3
-4
-5
62
输出
2
说明/提示
【样例解释】

首先选择区间[2,4][2,4][2,4],之后数列变成1,9,−4,7,501,9,-4,7,501,9,−4,7,50,然后选择[3,3][3,3][3,3],数列变成1,5,4,3,501,5,4,3,501,5,4,3,50

题解

  • 令S=∑i=xya[i],sum[i]=∑k=1iS=\sum_{i=x}^ya[i], sum[i] =\sum_{k=1}^iS=∑i=xy​a[i],sum[i]=∑k=1i​,我们可以发现每次操作只会影响前缀和,即sum[x−1]+=S,sum[x]+=0,sum[y]−=S,sum[y+1]+=0sum[x-1]+=S, sum[x]+=0,sum[y]-=S,sum[y+1]+=0sum[x−1]+=S,sum[x]+=0,sum[y]−=S,sum[y+1]+=0,实际上最终影响的只有sum[x−1],sum[y]sum[x-1],sum[y]sum[x−1],sum[y]而因为原本的sum[x−1]+S=sum[y]sum[x-1]+S=sum[y]sum[x−1]+S=sum[y]所以其实就相当于交换sum[x−1],sum[y]sum[x-1],sum[y]sum[x−1],sum[y]。
  • 题目转化为给定一个序列每次操作可交换序列中任意两个数,求使得序列单调递增的最小交换次数。
  • O(n)O(n)O(n) 扫一遍即可,最终复杂度为O(nlogn)O(nlogn)O(nlogn)

code

#include <bits/stdc++.h>
using namespace std; const int N = 1e5 + 100; int n, m;
int a[N], b[N]; int main() {scanf("%d", &n); for (int i = 1; i <= n; ++i) {int x; scanf("%d", &x); a[i] = a[i - 1] + x; b[i] = a[i]; }sort(b + 1, b + n + 1); m = unique(b + 1, b + n + 1) - b - 1; if (b[1] <= 0) {puts("-1"); return 0; }else {int ans = 0; for (int i = 1; i <= n; ++i) {int t = lower_bound(b + 1, b + m + 1, a[i]) - b; a[i] = t; }for (int i = 1; i < n; ++i) {while (a[i] != i) {++ans; swap(a[i], a[a[i]]); }}printf("%d\n", ans); }return 0;
}

P1667 数列(离散化)相关推荐

  1. P1667 数列(模型转换+离散化)

    题目描述 题目描述 给定一个长度是 n n n的数列 A A A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的.现在你有一个操作可以改变数列,选择一个区间[X,Y]满足 A x + ...

  2. 洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)

    洛谷P1667 数列 题目描述 给定一个长度是n的数列A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的.现在你有一个操作可以改变数列,选择一个区间[X,Y]满足\(A_X +A_{ ...

  3. 最小代价(区间dp)(ybtoj)

    文章目录 题目描述 解析 代码 题目描述 解析 (我觉得)很难的dp 思路是真的没有想出来 关键在于dp的设计: dp[l][r]:[l,r]的最小价值 f[l][r][a][b]:把l到r之间除了数 ...

  4. 面试高级算法梳理笔记

    作者:尤汐_Jennica 链接: https://www.nowcoder.com/discuss/21253 来源:牛客网 1.1 说明 本篇为<挑战程序设计竞赛(第2版)>读书笔记系 ...

  5. MAIGO的同济题解2

    Welcome to Tongji Online Judge Solutions by Maigo Akisame Volume 2 我在TJU的所有AC程序及本题解均可在purety.jp/akis ...

  6. 【CodeForces - 633D】Fibonacci-ish (离散化,暴力枚举+STPmap,fib数列收敛性质)

    题干: Yash has recently learnt about the Fibonacci sequence and is very excited about it. He calls a s ...

  7. 牛客练习赛7 E 珂朵莉的数列

    珂朵莉的数列 思路: 树状数组+高精度 离散化不知道哪里写错了,一直wa,最后用二分写的离散化 哪位路过大神可以帮我看看原来的那个离散化错在哪里啊 通过代码: import java.math.Big ...

  8. BZOJ 1852 [MexicoOI06]最长不下降序列(贪心+DP+线段树+离散化)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1852 [题目大意] 给你N对数A1,B1--An,Bn.要求你从中找出最多的对, 把它 ...

  9. 小魂和他的数列(dp+树状数组优化)

    链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...

最新文章

  1. Kafka那些值得我们学习的优秀设计
  2. 使用卷积神经网络进行文本分类textCNN
  3. 编程之美2.3 寻找发帖水王
  4. 【Flutter】监听滚动动作 控制组件 透明度渐变 ( 移除顶部状态栏空白 | 帧布局组件 | 透明度组件 | 监听滚动组件 )
  5. 写给人类的机器学习 四、神经网络和深度学习
  6. Quartz的简单使用
  7. 项目遇到OpenSessionInViewFilter的默认sessionFactoryBeanName的问题
  8. python装饰器详解-如何理解Python装饰器?
  9. oracle临时表与外部表,Oracle中的临时表、外部表和分区表
  10. Python基础6—常用语句
  11. python 数据文件上传到ftp服务器
  12. modbus-tcp协议通过Java代码获取从机数据
  13. C++中两个栈实现一个队列
  14. 修改ns服务器,修改你的域名ns服务器地址
  15. 虚拟机安装win10教程(详细版)
  16. 阿里云域名备案域名解析SSL证书申请Nginx代理
  17. abrt-hook-ccpp
  18. 国内与国外CRM系统相比有哪些优劣势?
  19. 微信对账单--每日定时任务获取昨日微信支付账单
  20. 【Unity3D自学记录】代码获取隐藏游戏对象

热门文章

  1. tcp float数据传输问题
  2. ahk写的脚本win11需要以管理员运行才能生效,有什么办法能默认用管理员身份运行吗
  3. house_price(房价预测)
  4. 计算机基础教师期中工作小结,教师期中工作小结
  5. 华为鸿蒙系统出来国产手机会支持,华为官方霸气表态!所有国产手机都能用鸿蒙OS系统:想用就支持...
  6. 激光雷达目标识别算法研究综述
  7. 【达摩院OpenVI】老片图像上色,一键开源体验
  8. python shutil_Python3 shutil(高级文件操作模块)
  9. 中国抓到了勒索病毒作者,上市公司停工3天
  10. 学web前端开发,培训和自学哪个更靠谱?