Description

Input

Output

Sample Input1

3 2 7
5 4 2

Sample Output1

999999732

Sample Explanation1

Sample Input2

5 3 1
5 4 3 5 5

Sample Output2

0

Sample Explanation2

Hint

题解

由于负数是肯定小于正数的,我们首先想到的就是将乘积变成负数。我们可以统计输入的负数个数。

那么会有两种情况:

$(i)$无论怎么变变不了负数,这个时候我们将所有数取绝对值。

我们需要使乘积最小,这时只需要将绝对值最小的数减小即可。

证明:

假设有四个正整数$a_1,a_2,a_3,a_4$,满足$a_1<a_2<a_3<a_4$。需要减去$x$。

我们取极端情况若$a_1-x$:

原式$=(a_1-x)*a_2*a_3*a_4$

  $=a_1*a_2*a_3*a_4-x*a_2*a_3*a_4$

若$a_4-x$:

原式$=a_1*a_2*a_3*(a_4-x)$

  $=a_1*a_2*a_3*a_4-x*a_1*a_2*a_3$

由于$-x*a_2*a_3*a_4<-x*a_1*a_2*a_3$

显然得证。

$(ii)$可以变成负数,我们变完负数后同样将所有数取绝对值。

既然已经是负数了,那我们只需所有的数的绝对值积最大即可。

证明同上,只是改变了加减。

所以我们只需要用小根堆维护绝对值最小的数即可。

我是用两个堆分别维护正数和负数。同时注意不要边减边取模,因为保存的是绝对值,和负数直接取模不同。

详见代码。

 #include<map>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define LL long long
#define RE register
#define IL inline
using namespace std;
const LL N=2e5;
const LL MOD=1e9+; priority_queue<LL, vector<LL>, greater<LL> >a,b;
LL n,k,x,ai;
LL cnt;
bool flag;
IL void print()
{
LL sum=;
while (!a.empty())
{
LL tmp=-a.top()%MOD;a.pop();
sum=(sum*tmp)%MOD;
}
while (!b.empty())
{
LL tmp=b.top()%MOD;b.pop();
sum=(sum*tmp)%MOD;
}
printf("%lld\n",(sum+MOD)%MOD);
exit();
}
IL void cuta()
{
if (a.top()/x+(bool)(a.top()%x)>=k)
{
LL tmp=a.top();a.pop();
tmp=(tmp-(LL)k*(LL)x/*%MOD*/)/*%MOD*/;
a.push(tmp);
print();
}
else
{
LL tmp=a.top();a.pop();
tmp=(tmp-(LL)(a.top()/x+(bool)(a.top()%x))*(LL)x)/*%MOD*/;
k-=a.top()/x+(bool)(a.top()%x);
b.push(-tmp);
}
}
IL void cutb()
{
if (b.top()/x+(bool)(b.top()%x)>=k)
{
LL tmp=b.top();b.pop();
tmp=(tmp-(LL)k*(LL)x/*%MOD*/)/*%MOD*/;
b.push(tmp);
print();
}
else
{
LL tmp=b.top();b.pop();
tmp=(tmp-(LL)(b.top()/x+(bool)(b.top()%x))*(LL)x)/*%MOD*/;
k-=b.top()/x+(bool)(b.top()%x);
a.push(-tmp);
}
}
IL LL getnum()
{
if (a.empty()) {flag=;LL tmp=b.top();b.pop();return tmp;}
if (b.empty()) {flag=;LL tmp=a.top();a.pop();return tmp;}
if (a.top()>b.top()) {flag=;LL tmp=b.top();b.pop();return tmp;}
{flag=;LL tmp=a.top();a.pop();return tmp;}
} int main()
{
scanf("%lld%lld%lld",&n,&k,&x);
for (RE LL i=;i<=n;i++)
{
scanf("%lld",&ai);
if (ai<) cnt++,a.push(-ai);
else b.push(ai);
}
if (cnt%==)
{
if (cnt==) cutb();
else if (cnt==n) cuta();
else
{
if (a.top()>=b.top()) cutb();
else cuta();
}
}
if (!k) print();
while (k--)
{
LL tmp=getnum();
tmp=(tmp+x)/*%MOD*/;
if (flag) a.push(tmp);
else b.push(tmp);
}
print();
return ;
}

[测试题]数组(array)的更多相关文章

  1. Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别

    ArrayList和Vector的区别ArrayList与Vector主要从二方面来说.  一.同步性:   Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步 ...

  2. go 数组(array)、切片(slice)、map、结构体(struct)

    一 数组(array) go语言中的数组是固定长度的.使用前必须指定数组长度. go语言中数组是值类型.如果将数组赋值给另一个数组或者方法中参数使用都是复制一份,方法中使用可以使用指针传递地址. 声明 ...

  3. javascript类型系统——数组array

    × 目录 [1]创建 [2]本质 [3]稀疏[4]长度[5]遍历[6]类数组 前面的话 除了对象之外,数组Array类型可能是javascript中最常用的类型了.而且,javascript中的数组与 ...

  4. swift基本用法-数组array

    数组简单用法 //------------------------------------------------------------------------------ // 1. 数组定义 / ...

  5. C#中数组Array、ArrayList、泛型List<T>的比较

    在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序 ...

  6. Javascript基础系列之(四)数据类型 (数组 array)

    字符串,数值,布尔值都属于离散值(scalar),如果某个变量是离散的,那么任何时候它只有一个值. 如果想使用变量存储一组值,就需要使用数组(array). 数组是由多个名称相同的树值构成的集合,集合 ...

  7. AS3 - 数组Array的几个常用方法(附样例)

    AS3 - 数组Array的几个常用方法(附样例) 2015-03-30 10:39发布:hangge浏览:241   Flex/Flash开发中,经常会使用到数组,下面总结了一些数组的常用方法. 1 ...

  8. Linux数组array基础

    Linux数组array基础[${a[*]}和$a的区别] Bash中,数组变量的赋值有两种方法: (1) name = (value1 ... valuen) 此时下标从0开始 (2) name[i ...

  9. 学习Swift -- 数组(Array) - 持续更新

    集合类型--数组 Array是Swift中的一种集合类型:数组,数组是使用有序列表储存同一类型的多个值,与OC的NSArray的最大不同是,Swift的数组是值类型,OC的数组是引用类型 声明数组的方 ...

随机推荐

  1. Spark ML源码分析之四 树

            之前我们讲过,在Spark ML中所有的机器学习模型都是以参数作为划分的,树相关的参数定义在treeParams.scala这个文件中,这里构建一个关于树的体系结构.首先,以Decis ...

  2. hackme.inndy.tw - pyyy - Writeup

    hackme.inndy.tw - pyyy - Writeup 0x01 反编译 1.第一次尝试的时候我直接在线反编译,部分结果如下. for (i, f) in enumerate(F): n = ...

  3. SciPy - 科学计算库(上)

    SciPy - 科学计算库(上) 一.实验说明 SciPy 库建立在 Numpy 库之上,提供了大量科学算法,主要包括这些主题: 特殊函数 (scipy.special) 积分 (scipy.inte ...

  4. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  5. 201621123057 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口,interface,implements,方法签名,has-a,Comparable,Comparator. 1.2 尝试 ...

  6. 第201621123043 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 2 ...

  7. 201621123031 《Java程序设计》第1周学习总结

    作业01-Java基本概念 1.本周学习总结 1.本周学习内容:Java发展史(简述).Java语言特点.JDK .JRE .JVM .Java的开发步骤.Java开发工具. 2.关键概念之间的联系: ...

  8. labview与单片机串口通信

    labview与单片机串口通信   VISA是虚拟仪器软件体系结构的缩写(即Virtual Instruments Software Architecture),实质上是一个I/O口软件库及其规范的总 ...

  9. 【iOS】OC-时间转化的时区问题

    -(void)testTime{ NSDate *now = [NSDate date];//根据当前系统的时区产生当前的时间,绝对时间,所以同为中午12点,不同的时区,这个时间是不同的. NSDat ...

  10. 从集合的无序性看待关系型数据库中的"序"

    本文目录:1.集合的特征2.集合的无序性3.表中记录的无序性4.集合的"序"和物理存储顺序之间的关系5.查询结果(虚拟表)的无序性.随机性6.为什么总是强调"无序&quo ...