AT_arc178_c [ARC178C] Sum of Abs 2
感觉思路很顺。
首先绝对值讨论很麻烦,考虑钦定 \(B\) 单调不降。容易得到贡献式子 \(S=\sum_{i=1}^{L-1}(i-2)B_i+(L-1)B_L\)。
有个 trick,单调不降的序列可以看作多次后缀 +1 得到(单调不升同理)。而对后缀 \([i,L]+1\) 对 \(S\) 的贡献是容易得出的,而 \(B_{\max}=B_n\) 最小即要求操作次数最小。于是就相当于 \(L\) 个数,每个数能取任意个,问凑出 \(A_i\) 的最小操作次数,容易完全背包求出。
但是这样复杂度为 \(O(nL)\) 但是发现后缀 \([i,n]\) 的贡献 \(v_i=L-1+\sum_{j=i}^{L-1}(j-2)\) 约为 \((L-i+1)^2\),于是只有后 \(\sqrt V\) 个后缀有用。复杂度 \(O(\min\{\sqrt V,n\}L)\)。
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#define fin(x) freopen(#x".in","r",stdin)
#define fout(x) freopen(#x".out","w",stdout)
#define fr(x) fin(x),fout(x);
#define Fr(x,y) fin(x),fout(y)
#define INPUT(_1,_2,FILE,...) FILE
#define IO(...) INPUT(__VA_ARGS__,Fr,fr)(__VA_ARGS__)
using namespace std;
using namespace __gnu_pbds;
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define cfast ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define ll long long
#define ull unsigned long long
#define intz(x,y) memset((x),(y),sizeof((x)))
char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
#define tup(x) array<int,(x)>
inline ll read(){
ll x=0,f=1;char ch=nc();
while(ch<48||ch>57){if(ch=='-')f=-1;ch=nc();}
while(ch>=48&&ch<=57)x=x*10+ch-48,ch=nc();
return x*f;
}
//void write(int x){cout<<x<<' ';}
//void write(pii x){cout<<"P("<<x.fi<<','<<x.se<<")\n";}
//void write(vector<auto>x){for(auto i:x)write(i);cout<<'\n';}
//void write(auto *a,int l,int r){for(int i=l;i<=r;i++)write(a[i]);cout<<'\n';}
inline ll lowbit(ll x){return x&-x;}
inline int pcount(ll x){
for(int i=0,res=0;;res+=(x>>i)&1,i++)
if(i>60)return res;
}
//struct mt{
// ll v;
// mt(){v=0;}
// mt(int x){this->v=x;}
// inline mt operator+(mt x){return {(v+x.v)%mod};}
// inline mt operator-(mt x){return {(v+mod-x.v)%mod};}
// inline mt operator*(mt x){return {1ll*v*x.v%mod};}
//};
//inline void add(mt &x,mt y){x=x+y;}
//mt qp(mt x,int y){mt res(1);for(;y;x=x*x,y>>=1)if(y&1)res=res*x;return res;}
const int N=2e5+5;
int a[N],w[N],f[N];
inline void UesugiErii(){
int n,l;cin>>n>>l;
for(int i=1;i<=n;i++)cin>>a[i];
w[l]=l-1;
for(int i=l-1;i;i--)
w[i]=w[i+1]+(2*i-l-1);
intz(f,0x3f),f[0]=0;
for(int j=1;j<=min(1000,l);j++)
for(int i=w[l-j+1];i<=2e5;i++)
f[i]=min(f[i],f[i-w[l-j+1]]+1);
// for(int i=1;i<=l;i++)cout<<w[i]<<' ';cout<<'\n';
for(int i=1;i<=n;i++)cout<<(f[a[i]]==0x3f3f3f3f?-1:f[a[i]])<<'\n';
}
signed main(){
//IO();//cfast;
int _=1;//cin>>_;
for(;_;_--)UesugiErii();
return 0;
}

浙公网安备 33010602011771号