做网站和优化,学校asp网站,机关网站建设 方案,写代码的软件有哪些传送门
设最底层为第1层#xff0c;倒数第二层为第2层#xff0c;以此类推。 发现若第111 ~ iii层构成的积木稳定#xff0c;第111 ~ jjj (jijiji)构成的积木也稳定#xff0c; 那么第i1i1i1 ~ jjj层构成的积木一定也是稳定的。
所以我们只要找到所有的iii满…传送门
设最底层为第1层倒数第二层为第2层以此类推。 发现若第111 ~ iii层构成的积木稳定第111 ~ jjj (jijiji)构成的积木也稳定 那么第i1i1i1 ~ jjj层构成的积木一定也是稳定的。
所以我们只要找到所有的iii满足第111 ~ iii层构成的积木稳定答案就是相邻的iii之间的差的最大值。
然后一坨木板的加权重心是∑iximi∑imi\frac{\sum_{i}x_im_i}{\sum_{i}m_i}∑imi∑iximi也就是j1…ij1\dots ij1…i合法等价于 ∑jk≤i(RkLk)(Rk−Lk)2∑jk≤i(Rk−Lk)Ai−AjBi−Bj∈[Lj,Rj]\frac{\sum_{jk\leq i}(R_kL_k)(R_k-L_k)}{2\sum_{jk\le i}(R_k-L_k)}\frac{A_i-A_j}{B_i-B_j}\in[L_j,R_j]2∑jk≤i(Rk−Lk)∑jk≤i(RkLk)(Rk−Lk)Bi−BjAi−Aj∈[Lj,Rj]
以Ai−AjBi−Bj≤Rj\frac{A_i-A_j}{B_i-B_j}\le R_jBi−BjAi−Aj≤Rj为例其等价于Ai≤RjBi−RjBjAjFRj(Bi)A_i\leq R_jB_i-R_jB_jA_jFR_j(B_i)Ai≤RjBi−RjBjAjFRj(Bi)那么将FR1(x)…FRi−1(x)FR_1(x)\dots FR_{i-1}(x)FR1(x)…FRi−1(x)在BiB_iBi 处的点值求出来取最小值和AiA_iAi比较一下即可这个可以用李超线段树做。
#includebits/stdc.h
using namespace std;
typedef long long ll;
const ll inf1e18;
const int N1e510;
struct Line{ll k,b;Line(ll k0,ll b0):k(k),b(b){}ll y(ll x){return k*xb;}
};
int n,L[N],R[N];
ll A[N],B[N],x[N];
bool ok[N];
namespace Seg1{Line t[N2];bool vis[N2];void modify(int u,int l,int r,Line v){if(!vis[u]){vis[u]1;t[u]v;return;}int mid(lr)1;if(t[u].y(x[mid])v.y(x[mid])) swap(t[u],v);if(lr) return;if(v.kt[u].k) modify(u1,l,mid,v);else modify(u1|1,mid1,r,v);}ll res;void query(int u,int l,int r,int p){if(vis[u]) resmax(res,t[u].y(x[p]));if(lr) return;int mid(lr)1;if(pmid) query(u1,l,mid,p);else query(u1|1,mid1,r,p);}ll query(int p){res-inf;query(1,1,n,p);return res;}
}
namespace Seg2{Line t[N2];bool vis[N2];void modify(int u,int l,int r,Line v){if(!vis[u]){vis[u]1;t[u]v;return;}int mid(lr)1;if(t[u].y(x[mid])v.y(x[mid])) swap(t[u],v);if(lr) return;if(v.kt[u].k) modify(u1,l,mid,v);else modify(u1|1,mid1,r,v);}ll res;void query(int u,int l,int r,int p){if(vis[u]) resmin(res,t[u].y(x[p]));if(lr) return;int mid(lr)1;if(pmid) query(u1,l,mid,p);else query(u1|1,mid1,r,p);}ll query(int p){resinf;query(1,1,n,p);return res;}
}
int main(){scanf(%d,n);for(int i1;in;i){scanf(%d%d,L[i],R[i]);A[i]A[i-1]R[i]*R[i]-L[i]*L[i];B[i]B[i-1]2*(R[i]-L[i]);}for(int i1;in;i) x[i]B[i-1];for(int in;i1;i--){ok[i]Seg1::query(i)A[i-1]Seg2::query(i)A[i-1];Seg1::modify(1,1,n,Line(R[i],A[i-1]-R[i]*B[i-1]));Seg2::modify(1,1,n,Line(L[i],A[i-1]-L[i]*B[i-1]));}int ans0,lst0;for(int i1;in;i){if(ok[i]){ansmax(ans,i-lst);lsti;}}printf(%d,ans);
}参考文章 https://blog.csdn.net/Mys_C_K/article/details/87931882