Description
Input
Output
Sample Input
输入样例1:
3 2 7
5 4 2
输入样例2:
5 3 1
5 4 3 5 5
Sample Output
输出样例1:
999999732
输出样例2:
0
Data Constraint
赛时
本来dp搞30分,之后搞特殊,结果包蛋。
正解
这一题先将所有的数取绝对值,并用bj标记出正负性。
(1)当输出答案是非负数时,将能变号的数变号,并转到情况(2)。若不能将任何数改变符号,则要将数组中最小的数减去k*x。
(2)当输出答案是负数时,要用一个小根堆堆维护最小值,并将当前最小值+x。
最后输出所有数相乘再乘bj
没什么好说的吧?
#include<cstdio>
#include<iostream>
#include<queue>
#include<cmath>
#define mod 1000000007
using namespace std;
int n,k,x,bz,a[200010],min1;
long long minn=0x3f3f3f3f;
priority_queue<int,vector<int>,greater<int> > Q;
int main(){
scanf("%d%d%d",&n,&k,&x);
for(int i=1;i<=n;i++){
int s;
scanf("%d",&s);
a[i]=abs(s);
if(s<0) bz++;
if(a[i]<minn) minn=a[i],min1=i;
}
bz%=2;
if(bz==0){
if(a[min1]<(long long)x*k){
int num=a[min1]/x+1;
a[min1]-=num*x;
a[min1]=abs(a[min1]);
bz=1;
k-=num;
}else{
a[min1]-=x*k;
long long ans=1;
for(int i=1;i<=n;i++){
ans*=a[i];
ans%=mod;
}
printf("%lld",ans);
}
}
if(bz==1){
for(int i=1;i<=n;i++)
Q.push(a[i]);
while(k--){
int t=Q.top();
Q.pop();
t+=x;
Q.push(t);
}
long long ans=1;
for(int i=1;i<=n;i++){
int x=Q.top();
Q.pop();
ans=(ans*x)%mod;
}
printf("%lld",ans*(-1)+mod);
}
}
写的十分的丑,就凑合的看吧。