题目链接:https://codeforces.com/contest/1435/problem/E
仔细分析发现是一道O(1)数学题
如图所示,我们要找到一次使用技能的恢复时间范围内所能覆盖到的最后一次使用技能的位置 (p1),
然后找到一次伤害值 >= 前一次伤害到这次伤害之间回复的生命值的位置 (p2),
取(p = min(p1,p2)),则答案即为((p+1)*a - frac{p*(p+1)}{2} * db)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;
int T;
ll a,b,c,d;
ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; }
int main(){
T = read();
while(T--){
a = read(), b = read(), c = read(), d = read();
if(a<=b*c){
ll t = (c/d);
ll l = (a/(b*d));
t = min(l,t);
ll ans = 1ll * (t+1) * a - 1ll * ( t * (t+1) / 2) * d * b;
printf("%lld
",ans);
}else{
printf("-1
");
}
}
return 0;
}