P1667 数列(离散化)
题目
题目描述
给定一个长度是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=xya[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 数列(离散化)相关推荐
- P1667 数列(模型转换+离散化)
题目描述 题目描述 给定一个长度是 n n n的数列 A A A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的.现在你有一个操作可以改变数列,选择一个区间[X,Y]满足 A x + ...
- 洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)
洛谷P1667 数列 题目描述 给定一个长度是n的数列A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的.现在你有一个操作可以改变数列,选择一个区间[X,Y]满足\(A_X +A_{ ...
- 最小代价(区间dp)(ybtoj)
文章目录 题目描述 解析 代码 题目描述 解析 (我觉得)很难的dp 思路是真的没有想出来 关键在于dp的设计: dp[l][r]:[l,r]的最小价值 f[l][r][a][b]:把l到r之间除了数 ...
- 面试高级算法梳理笔记
作者:尤汐_Jennica 链接: https://www.nowcoder.com/discuss/21253 来源:牛客网 1.1 说明 本篇为<挑战程序设计竞赛(第2版)>读书笔记系 ...
- MAIGO的同济题解2
Welcome to Tongji Online Judge Solutions by Maigo Akisame Volume 2 我在TJU的所有AC程序及本题解均可在purety.jp/akis ...
- 【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 E 珂朵莉的数列
珂朵莉的数列 思路: 树状数组+高精度 离散化不知道哪里写错了,一直wa,最后用二分写的离散化 哪位路过大神可以帮我看看原来的那个离散化错在哪里啊 通过代码: import java.math.Big ...
- BZOJ 1852 [MexicoOI06]最长不下降序列(贪心+DP+线段树+离散化)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1852 [题目大意] 给你N对数A1,B1--An,Bn.要求你从中找出最多的对, 把它 ...
- 小魂和他的数列(dp+树状数组优化)
链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...
最新文章
- Kafka那些值得我们学习的优秀设计
- 使用卷积神经网络进行文本分类textCNN
- 编程之美2.3 寻找发帖水王
- 【Flutter】监听滚动动作 控制组件 透明度渐变 ( 移除顶部状态栏空白 | 帧布局组件 | 透明度组件 | 监听滚动组件 )
- 写给人类的机器学习 四、神经网络和深度学习
- Quartz的简单使用
- 项目遇到OpenSessionInViewFilter的默认sessionFactoryBeanName的问题
- python装饰器详解-如何理解Python装饰器?
- oracle临时表与外部表,Oracle中的临时表、外部表和分区表
- Python基础6—常用语句
- python 数据文件上传到ftp服务器
- modbus-tcp协议通过Java代码获取从机数据
- C++中两个栈实现一个队列
- 修改ns服务器,修改你的域名ns服务器地址
- 虚拟机安装win10教程(详细版)
- 阿里云域名备案域名解析SSL证书申请Nginx代理
- abrt-hook-ccpp
- 国内与国外CRM系统相比有哪些优劣势?
- 微信对账单--每日定时任务获取昨日微信支付账单
- 【Unity3D自学记录】代码获取隐藏游戏对象
热门文章
- tcp float数据传输问题
- ahk写的脚本win11需要以管理员运行才能生效,有什么办法能默认用管理员身份运行吗
- house_price(房价预测)
- 计算机基础教师期中工作小结,教师期中工作小结
- 华为鸿蒙系统出来国产手机会支持,华为官方霸气表态!所有国产手机都能用鸿蒙OS系统:想用就支持...
- 激光雷达目标识别算法研究综述
- 【达摩院OpenVI】老片图像上色,一键开源体验
- python shutil_Python3 shutil(高级文件操作模块)
- 中国抓到了勒索病毒作者,上市公司停工3天
- 学web前端开发,培训和自学哪个更靠谱?