CSUST 白银御行想展示 题解(思维)
题目链接
题目思路
第一数不是1就是n,可以确定他放哪里最优
如果他是1,那么第二个点不是2 就是n
如果他是2,那么第二个点不是1就是n-1
for一边即可确定答案
代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
int n,k;
ll a[maxn],b[maxn],suf[maxn];
signed main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++){
scanf("%lld",&b[i]);
}
for(int i=n;i>=1;i--){
suf[i]=suf[i+1]+b[i];
}
int beg=1,ed=n;
ll pr=0;
for(int i=1;i<=n;i++){
ll tmp=(ed-beg)*b[i]-suf[i+1];
if(tmp>0){
a[i]-=ed;
pr+=b[i]*ed;
ed--;
}else{
a[i]-=beg;
pr+=b[i]*beg;
beg++;
}
}
printf("%lld\n",pr);
int _;scanf("%d",&_);
while(_--){
int x;scanf("%d",&x);
printf("%lld\n",a[x]);
if(a[x]<0){
printf("I Love Work!");
}
printf("\n");
}
return 0;
}
不摆烂了,写题