【思维】自动机+预处理+复杂度分析——icpc 2019 nwerc H

 可以确定分组的方式是贪心的放

先算出前缀和,然后用一个自动机pre[i]表示当和是i个任务时,事实上只能取pre[i]个,因为事物不能断开

直接把1-1e6的答案全算出来,由于调和级数,总复杂度nlogn

#include<bits/stdc++.h>
using namespace std;
#define N 2000005
#define ll long long

int n,a[N],sum[N],pre[N],ans[N];

int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    int mx=0,p1=0,p2=0;
    for(int i=1;i<=n;i++){
        sum[i]=sum[i-1]+a[i];
        p2=p1+a[i];
        for(int j=p1+1;j<=p2-1;j++)
            pre[j]=p1;
        p1=p2;
        pre[p2]=p2;
        mx=max(mx,a[i]);
    }
    
    for(int i=sum[n]+1;i<=2*sum[n];i++)
        pre[i]=sum[n];
        
    for(int i=1;i<=sum[n];i++){
        if(mx>i){ans[i]=-1;continue;}
        int p=0;
        while(p<sum[n]){
            p+=i;
            p=pre[p];
            ans[i]++;
        }    
    }
    
    int q;cin>>q;
    while(q--){
        int t;scanf("%d",&t);
        if(ans[t]==-1)puts("Impossible");
        else cout<<ans[t]<<'\n';
    }
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/12950900.html
今日推荐