250122026-02-17 12:33:41999Maximális szorzat (50 pont)cpp17Hibás válasz 43/50103ms7400 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;
#define int long long
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

int pow(int a, int b){
    if(b==0)return 1;
    if(b%2)return (pow(a,b-1)*a)%(int)(1e9+7);
    int x=pow(a,b/2);
    return (x*x)%(int)(1e9+7);
}

signed main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);
    int n,k,b;cin>>n>>k>>b;
    vector<int> neg,poz,null;
    for(int i = 0;i<n;i++){
        int a;cin>>a;
        if(a==0)null.push_back(a);
        else if(a>0)poz.push_back(a);
        else neg.push_back(a);
    }
    sort(neg.begin(),neg.end());
    sort(poz.rbegin(),poz.rend());
    int sum=0,ans=1;
    for(int i = neg.size()-1;i>=0;i--){
        if(i>=b)sum+=-neg[i];
        else ans=(ans*neg[i])%(int)(1e9+7);
    }
    if(sum>k||neg.size()<b){
        cout<<-1<<endl;
        return 0;
    }
    k-=sum;
    if(null.size()+neg.size()-b>k){
        cout<<0<<endl;
        return 0;
    }
    k-=(null.size()+neg.size()-b);
    for(int i = 0;i<null.size()+neg.size()-b;i++){
        poz.push_back(1);
    }
    int currn=0,currdb=0;
    if(poz.size()>0)currn=poz[0],currdb=1;
    set<pair<int,int>> s;
    for(int i = 1;i<poz.size();i++){
        if(currn!=poz[i]){
            s.insert({currn,currdb});
            currn=poz[i];
            currdb=1;
        }
        else currdb++;
    }
    if(poz.size()>0)s.insert({currn,currdb});
    //for(auto[a,b]:s)cout<<a<<' '<<b<<endl;
    while(k>0){
        auto [A,B]=*s.begin();
        if(B<=k){
            s.erase({A,B});
            auto it=s.lower_bound({A+1,0});
            pair<int,int> i=*it;
            if(it!=s.end()&&i.first==A+1){
                s.erase({i});
                s.insert({A+1,B+i.second});
            }
            else if(it==s.end()||it!=s.end()&&i.first!=A+1){
                s.insert({A+1,B});
            }
            k-=B;
        }
        else{
            s.erase({A,B});
            auto it=s.lower_bound({A+1,0});
            pair<int,int> i=*it;
            if(it!=s.end()&&i.first==A+1){
                s.erase({i});
                s.insert({A+1,k+i.second});
                s.insert({A,B-k});
            }
            else if(it==s.end()||it!=s.end()&&i.first!=A+1){
                s.insert({A+1,k});
                s.insert({A,B-k});  
            }
            break;
        }
    }
    //for(auto [a,b]:s)cout<<a<<' '<<b<<endl;
    for(auto i : s)ans=(ans*pow(i.first,i.second))%(int)(1e9+7);
    cout<<ans<<endl;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base43/50
1Elfogadva0/01ms316 KiB
2Elfogadva0/01ms500 KiB
3Elfogadva0/01ms316 KiB
4Elfogadva0/01ms508 KiB
5Elfogadva0/03ms480 KiB
6Elfogadva2/21ms316 KiB
7Elfogadva2/21ms380 KiB
8Elfogadva2/21ms316 KiB
9Elfogadva2/21ms316 KiB
10Elfogadva2/26ms1076 KiB
11Elfogadva2/282ms7400 KiB
12Elfogadva1/1103ms7368 KiB
13Elfogadva1/11ms332 KiB
14Elfogadva1/14ms564 KiB
15Elfogadva1/110ms956 KiB
16Elfogadva1/114ms1336 KiB
17Elfogadva1/110ms1036 KiB
18Elfogadva1/14ms948 KiB
19Hibás válasz0/121ms1592 KiB
20Hibás válasz0/117ms1460 KiB
21Hibás válasz0/128ms1456 KiB
22Hibás válasz0/114ms1480 KiB
23Elfogadva1/179ms4156 KiB
24Elfogadva1/193ms6716 KiB
25Elfogadva2/21ms512 KiB
26Elfogadva2/23ms568 KiB
27Hibás válasz0/214ms1060 KiB
28Hibás válasz0/114ms948 KiB
29Elfogadva2/212ms960 KiB
30Elfogadva1/137ms1584 KiB
31Elfogadva1/123ms1540 KiB
32Elfogadva2/29ms436 KiB
33Elfogadva2/232ms1456 KiB
34Elfogadva1/130ms1480 KiB
35Elfogadva2/237ms1460 KiB
36Elfogadva2/237ms1456 KiB
37Elfogadva2/235ms1524 KiB
38Elfogadva2/237ms1456 KiB
39Elfogadva1/19ms424 KiB