洛谷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;
}

转载于:https://www.cnblogs.com/real-l/p/9832337.html

洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)相关推荐

  1. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines【NOIP模拟笨笨的电话线】

    [二分,spfa chenck] 题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the p ...

  2. 洛谷八连测——关于取模与思维僵化

    有一天小妖精们又在做游戏.这个游戏是这样的. 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下的人找到区间[l,r][l,r] ...

  3. 洛谷——P2626 斐波那契数列(升级版)矩阵

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

  4. 洛谷P1962 斐波那契数列题解

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

  5. 洛谷P1962 斐波那契数列

    传送门 不难得到状态转移矩阵 然后带进去乱搞 1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 #include&l ...

  6. 洛谷 P1426 小鱼会有危险吗【模拟/题意理解】

    题目描述 有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98%.有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是 ...

  7. 【比赛报告】2018.10.15校赛[2015-9-13 NOIP模拟赛 by hzwer] NOIP练习赛卷十四

    比赛时间:2018.10.15 选手:lrllrl 用时:2h 得分:100+10+90=200 最初想法是一个背包问题.首先背包问题的模型肯定是不行的,但是我们可以列出状态转移方程后发现,每个状态决 ...

  8. 【洛谷 P2513】 [HAOI2009]逆序对数列(DP)

    题目链接 这种求方案数的题一般都是\(dp\)吧. 注意到范围里\(k\)和\(n\)的范围一样大,\(k\)是完全可以更大的,到\(n\)的平方级别,所以这暗示了我们要把\(k\)写到状态里. \( ...

  9. 4.21每日一题之终于结束的起点(洛谷c++)|斐波那契数列

最新文章

  1. Cocoapods的安装以及使用(2)
  2. java Proxy.newProxyInstance 动态代理 简介
  3. js div asp.net 实现漂浮图片,可以代码控制。
  4. 【Android】Vitamio 4.0 公测版发布(2013-05-28)
  5. 队列和消息队列_消息队列概述[幻灯片]
  6. vertex shader(5)
  7. 记录——《C Primer Plus (第五版)》第十章编程练习第三题
  8. 数字货币交易系统_符合数字货币市场的量化交易系统
  9. python中求众数_Python实现求众数的三种方法
  10. linux安装Python 以及Python包
  11. vue实现点击按钮“查看详情”弹窗展示详情列表
  12. Chrome浏览器保存整个网页为图片的方法
  13. python换证件照底色
  14. bzoj 4238: 电压 dfs树
  15. 如何修改PPT文档的编辑版式
  16. Java异常的根类似_Java异常(Exception)类型及处理
  17. 使用oc的block方法回调
  18. c语言中apos是什么头文件,华中科技大学计算机学院C语言程序设计字符串apos;apos;apos;apos;.ppt...
  19. pktgen自动化测试网卡速率和包率
  20. 组合品在快消品饮料企业信息化中应用

热门文章

  1. Python 技术篇-使用pygame库播放音乐没有声音问题解决办法
  2. Python+selenium 技术篇-浏览器后台运行
  3. 5.2 matlab多项式计算(多项式的四则运算、求导、求值、求根)
  4. 1.5 matlab常量与变量
  5. expand--符号矩阵的展开
  6. MATLAB 基本数据类型和调用方式
  7. K-Means算法理论及Python实现
  8. VS2017调用MySQL 8.0(附上C++程序)
  9. 牛顿法求根号数(Python)
  10. ValueError: Must have equal len keys and value when setting with an iterable