2025杭电多校第七场矩形框选伤害冷却比如何优化?

摘要:伤害冷却比 数学 题目 思路 令(a=frac{K}{N}),则有(f(x)=xleft( leftlfloor frac{a}{x} rightrfloor +1right)) 大致画出图像,可得
伤害冷却比 数学 题目 思路 令\(a=\frac{K}{N}\),则有\(f(x)=x\left( \left\lfloor \frac{a}{x} \right\rfloor +1\right)\) 大致画出图像,可得下图 若要求区间\([L,R]\)上的最大值,则需要求出\(f(R)\)与红线蓝线交点值之间的最大值 为了求出交点,联立两个方程: \[\begin{align} x+a&=x\left( \left\lfloor \frac{a}{x} \right\rfloor +1 \right)\\ \\ x+a&=x\left\lfloor \frac{a}{x} \right\rfloor +x\\ \\ \frac{a}{x}&=\left\lfloor \frac{a}{x} \right\rfloor \\ \\ \exists \ n\in& Z\ , \frac{a}{x}=n\\ \\ \therefore x=\frac{a}{n}&,n=1,2,3,\dots \end{align} \] 因此可以找到距离\(R\)最近的\(x_{0}=\frac{a}{n}\),其中\(n=\left\lceil \frac{a}{R} \right\rceil\) 再将此\(x_{0}\)带入\(y=x+a\)中,即可得到区间\([L,R]\)上交点的最大值啦 随后将\(R\)带入\(f(x)\)中,比较二者大小约分输出即可 代码实现 #include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include<queue> #include<cmath> #include<unordered_map> #include<unordered_set> #include<string.h> using namespace std; using ll = long long; #define rep(i, a, b) for(ll i = (a); i <= (b); i ++) #define per(i, a, b) for(ll i = (a); i >= (b); i --) #define see(stl) for(auto&ele:stl)cout<<ele<<" "; cout<<'\n'; #define mid ((l+r)>>1) #define double long double #define int ll int gcd(int a,int b){ if(b==0)return a; return gcd(b,a%b); } void eachT(){ int K,N,A,B,C,D;cin>>K>>N>>A>>B>>C>>D; int n=ceil(1.0*(K*D)/(N*C)); double x=1.0*K/(N*n); double ans1=x+(1.0*K/N); double L=1.0*A/B; if(L>x)ans1=-1; double ans2=1.0*C/D*(K*D/(N*C)+1); if(ans1>=ans2){ int g=gcd(K*(1+n),N*n); cout<<K*(1+n)/g<<"/"<<N*n/g<<'\n'; }else{ int g=gcd(C*(K*D/(N*C)+1),D); cout<<C*(K*D/(N*C)+1)/g<<"/"<<D/g<<'\n'; } } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int t=1; cin>>t; while(t--)eachT(); } 矩形框选 线段树 #扫描线 #二维数点 #差分 #区间最值 题目 思路 先讲一讲二维数点的一个常用技巧: 假设红框是当前的矩
阅读全文