AtCoder Grand Contest 004题解

传送门

\(A\)

咕咕

int a,b,c;
int main(){
    scanf("%d%d%d",&a,&b,&c);
    if((a&1^1)|(b&1^1)|(c&1^1))return puts("0"),0;
    printf("%lld\n",min(1ll*a*b,min(1ll*a*c,1ll*b*c)));
    return 0;
}

\(B\)

一开始想歪了……

枚举\(2\)操作的次数\(k\),然后用单调队列优化就行了

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
typedef long long ll;
const int N=5005;const ll inf=1e18;
int a[N],q[N],n,x,k;ll res;
void solve(){
    int h=1,t=0;ll sum=0;
    fp(i,1,n){
        while(h<=t&&a[i]<=a[q[t]])--t;
        q[++t]=i;
    }
    fp(i,n+1,n<<1){
        while(h<=t&&i-q[h]>k)++h;
        while(h<=t&&a[i]<=a[q[t]])--t;
        q[++t]=i,sum+=a[q[h]];
    }
    cmin(res,sum+1ll*k*x);
}
int main(){
    scanf("%d%d",&n,&x);res=inf;
    fp(i,1,n)scanf("%d",&a[i]),a[i+n]=a[i];
    for(k=0;k<n;++k)solve();
    printf("%lld\n",res);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/yuanquming/p/11360262.html