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
",pr);
    int _;scanf("%d",&_);
    while(_--){
        int x;scanf("%d",&x);
        printf("%lld
",a[x]);
        if(a[x]<0){
            printf("I Love Work!");
        }
        printf("
");
    }
    return 0;
}

不摆烂了,写题
原文地址:https://www.cnblogs.com/hunxuewangzi/p/15397555.html