bzoj4700】的更多相关文章

如果没有秒杀,就是经典的国王游戏问题,按t/a从小到大排序即可. 考虑删除两个数i<j能给答案减少的贡献:S[i]*T[i]+P[i-1]*A[i]-A[i]+S[j]*T[j]+P[j-1]*A[j]-A[j]-T[i]*A[j] 其中P为T=(D-1)/ATK+1的前缀和,S为A的后缀和. 我们设bi=S[i]*T[i]+P[i-1]*A[i]-A[i],考虑当i固定时,j可能取什么值. 解法一:CDQ分治 不难发现,当i<j<k时k比j优的充要条件是b[k]-T[i]*A[k]&g…
首先考虑怎么安排攻击顺序.显然如果攻击了某台兵器就应该一直连续攻击直到将其破坏,破坏所需时间可以直接算出来,设其为b.假设确定了某个破坏顺序,如果交换相邻两个兵器,显然不会对其他兵器造成影响,两种顺序的代价则分别为a1(b1-1)+a2(b1+b2-1)和a1(b1+b2-1)+a2(b2-1),那么当a2b1<a1b2时先破坏1较优.于是按b/a从小到大排序. 然后考虑怎么秒杀.如果只能秒杀一个显然直接枚举即可.假设已确定要秒杀的是第i个,则需要找到j>i最小化Σax(Bx-1)-ai(Bi…
先排序,枚举删一个点,在前面找出最优的另一个点,容易推出斜率方程,平衡树维护凸包. #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=3e5+5; typedef struct node*ptr; struct node{ ptr i,j,s,t; ll w,x,y; node(){w=rand();} }*b,e[N]; void zag(ptr&o){ptr s=o->…
题解: cdq分治 先考虑没有人被秒掉的情况 代码: #include<bits/stdc++.h> #define y1 ____y1 ; using namespace std; typedef long long ll; int bh[N],q[N],bhd[N],bha[N],A[N],d[N],P[N],T[N],n,atk; ll ans,pr,K[N]; int comp1(const int x,const int y) { return A[x]*d[y]>A[y]*d…
题面 解析 看了好多dalao们的题解,然而还是不明白... 于是在想了半天后,决定自己写一篇题解. step 1 首先,分析题意, 应该还是比较容易想到, 要一直攻击一个兵器, 直到破坏它为止. 因为迟早要把兵器都破坏完,但如果不先破坏一个的话,他就会一直攻击. 那么,就会有一个破坏兵器的先后顺序. 并且,注意到血量其实只是为了转化成攻击的次数, 因此可以用\(d_i\)表示\(i\)被攻击的次数, 另外,约定\(a_i\)为\(i\)的攻击力, 那么题目就分析完毕了!似乎说了一通废话 ste…