题解:P17678 [IO 2025 #4] 拆钞幻术
蒟蒻的第一篇题解
题目传送门
题意:
初始有一个数
每次询问要求板上必须出现区间 -1。
思路:
每次拆分
设最后板上留下的数是
所以要让花费最小,就要让
题目要求板上必须包含
代入后得到答案:
如果 -1。
用前缀和与前缀平方和预处理,每次询问
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
long long sum[N], sq[N],S,T,res;
int n,q,a[N],l,r;
int main(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
sq[i]=sq[i-1]+1LL*a[i]*a[i];
}
while(q--){
cin>>l>>r>>S;
T=sum[r]-sum[l-1];
if(T>S){
cout<<"-1"<<endl;
continue;
}
res=(2*S*T-T*T-sq[r]+sq[l-1])/2;
cout<<res<<endl;
}
return 0;
}