洛谷P1667 数列

题目描述

给定一个长度是n的数列A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的。现在你有一个操作可以改变数列,选择一个区间[X,Y]满足\(A_X +A_{X+1} +…+ A_Y<0,1<X<=Y<n,\)令\(S=A_X +A_{X+1} +…+ A_Y\),对于\(A_{X-1}\)和\(A_{Y+1}\)分别加上S,\(A_X\)和\(A_Y\)分别减去S(如果X=Y就减两次)。问最少几次这样的操作使得最终数列是完美的。

输入输出格式

输入格式:

第一行一个数n,以下n个数。

【数据规模】

对于20%的数据,满足1≤N≤5;

对于100%的数据,满足\(1≤N≤10^5; 1≤|A[i]|≤2^31-1.\)

输出格式:

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

输入输出样例

输入样例#1:

5

13

-3

-4

-5

62

输出样例#1:

2

说明

【样例解释】

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

Solution

按照题目意思,我们令\(T=sum[r]-sum[l-1]\),其中sum为a的前缀和

那么会有a[l-1]+=T,a[r+1]+=T,a[l]-=T,a[r]-=T,实际上对于sum[l]和sum[r+1]是没有变化的,而sum[l-1]会增加T,sum[r]会减少T,实际上就是sum[l-1]和sum[r]交换了位置

由于题目要求任意\(a_i\)均为正数,所以前缀和必须严格上升,那么很容易看出\(sum_i<=0\)或者是\(i<j\)并且\(sum_i=sum_j\)无解

正常情况下,我们要求交换次数,把前缀和离散后,它是第几小就该到哪去,所以就是模拟交换并统计次数就可以了

Code

#include<bits/stdc++.h>
#define rg register
#define il inline
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define lol long long
#define in(i) (i=read())
using namespace std; const lol N=2e5+10; lol read() {
lol ans=0,f=1; char i=getchar();
while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0',i=getchar();
return ans*=f;
} lol n,sum[N],id[N],AQ[N]; bool cmp(lol a,lol b) {return sum[a]<sum[b];} int main()
{
//freopen("bsum.in","r",stdin);
//freopen("bsum.out","w",stdout);
in(n);
for(lol i=1;i<=n;i++) {
in(sum[i]),id[i]=i;
sum[i]+=sum[i-1],AQ[i]=sum[i];
}
sort(AQ+1,AQ+1+n);
for(lol i=1;i<n;i++) {
if(AQ[1]<=0 || AQ[i]==AQ[i+1])
cout<<-1<<endl,exit(0);
}
sort(id+1,id+1+n,cmp);
for(lol i=1;i<=n;i++) sum[id[i]]=i;
lol ans=n;
for(lol i=1;i<=n;i++) {
if(sum[i]==i) ans--;
else {
swap(id[i],id[sum[i]]);
swap(sum[i],sum[id[sum[i]]]);
}
}cout<<ans<<endl;
}

洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)的更多相关文章

  1. 洛谷P1962 斐波那契数列【矩阵运算】

    洛谷P1962 斐波那契数列[矩阵运算] 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) ( ...

  2. 【洛谷 P1667】 数列 (贪心)

    题目链接 对于一个区间\([x,y]\),设这个区间的总和为\(S\) 那么我们在前缀和(设为\(sum[i]\))的意义上考虑到原操作其实就是\(sum[x−1]+=S\) , \(sum[x]+S ...

  3. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  4. 洛谷 P4108 / loj 2119 [HEOI2015] 公约数数列 题解【分块】

    看样子分块题应该做的还不够. 题目描述 设计一个数据结构. 给定一个正整数数列 \(a_0, a_1, \ldots , a_{n-1}\),你需要支持以下两种操作: MODIFY id x: 将 \ ...

  5. [洛谷P2174]小Z的神奇数列

    题目大意:有$n(n\leqslant10^6)$个数,$5$种操作: $D\;x:$从数列中删除$x$,相同的数只删除一个 $B:$最大值 $S:$最小值 $M:$输出$max^{min}\pmod ...

  6. 洛谷——P1962 斐波那契数列

    P1962 斐波那契数列 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 ...

  7. NOIP模拟赛 数列

    Problem 2 数列(seq.cpp/c/pas) [题目描述] a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1]  (x>3) 求a数列的第n项对1000000007 ...

  8. 洛谷—— P1962 斐波那契数列

    https://www.luogu.org/problem/show?pid=1962 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f ...

  9. 洛谷P1962 斐波那契数列(矩阵快速幂)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

随机推荐

  1. JVM之G1收集器

    Garbage-First,面向服务端的垃圾收集器. 并行与并发:充分利用多核环境减少停顿时间, 分代收集:不需要配合其它收集器 空间整合:整体上看属于标记整理算法,局部(region之间)数据复制算 ...

  2. CSP201412-2:Z字形扫描

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  3. 由一个hash字符串生成多个子hash字符串

    通过存储一个head hash,然后把子hash放到网络中 当然,也可以像默克尔树那样的,生成多级的子hash ,可以通过规则配置不同的hash 生成方式.倒置的默克尔树 我有一个文件,然后我把她分隔 ...

  4. [C++] Class (part 2)

    Members that are const or reference must be initialized. Similary, members that are of a class type ...

  5. 自测之Lesson5:标准I/O

    题目:使用perror函数和strerror函数编写一个程序. 程序代码: #include <stdio.h> #include <errno.h> #include < ...

  6. C#操作Excel执行分类多条件汇总合并

    之前发了一片模拟合并,详见模拟Excel同一列相同值的单元格合并 在之前的文章中介绍了思想,其中Excel采用的二维数组模拟,今天花了点时间,学习了一下C#操作Excel,实现了类似的效果! 准备 需 ...

  7. iOS开发应用程序更新

    #import "ViewController.h" //1一定要先配置自己项目在商店的APPID,配置完最好在真机上运行才能看到完全效果哦 #define STOREAPPID ...

  8. JDK源码分析 – ArrayList

    ArrayList类的申明 ArrayList是一个支持泛型的,底层通过数组实现的一个可以存任意类型的数据结构,源码中的定义如下: public class ArrayList<E> ex ...

  9. Debian 7 amd64问题

    Debian 7 发布了有1段时间,最近才在自己的电脑硬盘安装,用户体验还算可以.在安装Debian的过程中,有问题还是要记录一下的. 注意:遇到的问题跟硬件体系相关,可能在个别电脑没法重现. 1.默 ...

  10. css深入理解之 border

    一 border-width不支持百分比值 1 不符合客观逻辑 2 w3成都一种约定吧 3 边框本身就像是一个包裹内容的界限 类似的还有outline,box-shadow text-shadow均不 ...