日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[集训队作业2018] 万圣节的积木(李超线段树)

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [集训队作业2018] 万圣节的积木(李超线段树) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳送門

設最底層為第1層,倒數第二層為第2層,以此類推。
發現若第111 ~ iii層構成的積木穩定,第111 ~ jjj (j>ij>ij>i)構成的積木也穩定,
那么第i+1i+1i+1 ~ jjj層構成的積木一定也是穩定的。

所以我們只要找到所有的iii滿足第111 ~ iii層構成的積木穩定,答案就是相鄰的iii之間的差的最大值。

然后一坨木板的加權重心是∑iximi∑imi\frac{\sum_{i}x_im_i}{\sum_{i}m_i}i?mi?i?xi?mi??,也就是j+1…ij+1\dots ij+1i合法等價于
∑j<k≤i(Rk+Lk)(Rk?Lk)2∑j<k≤i(Rk?Lk)=Ai?AjBi?Bj∈[Lj,Rj]\frac{\sum_{j<k\leq i}(R_k+L_k)(R_k-L_k)}{2\sum_{j<k\le i}(R_k-L_k)}=\frac{A_i-A_j}{B_i-B_j}\in[L_j,R_j]2j<ki?(Rk??Lk?)j<ki?(Rk?+Lk?)(Rk??Lk?)?=Bi??Bj?Ai??Aj??[Lj?,Rj?]

Ai?AjBi?Bj≤Rj\frac{A_i-A_j}{B_i-B_j}\le R_jBi??Bj?Ai??Aj??Rj?為例,其等價于Ai≤RjBi?RjBj+Aj=FRj(Bi)A_i\leq R_jB_i-R_jB_j+A_j=FR_j(B_i)Ai?Rj?Bi??Rj?Bj?+Aj?=FRj?(Bi?),那么將FR1(x)…FRi?1(x)FR_1(x)\dots FR_{i-1}(x)FR1?(x)FRi?1?(x)BiB_iBi? 處的點值求出來取最小值和AiA_iAi?比較一下即可,這個可以用李超線段樹做。

#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll inf=1e18; const int N=1e5+10; struct Line{ll k,b;Line(ll k=0,ll b=0):k(k),b(b){}ll y(ll x){return k*x+b;} }; int n,L[N],R[N]; ll A[N],B[N],x[N]; bool ok[N]; namespace Seg1{Line t[N<<2];bool vis[N<<2];void modify(int u,int l,int r,Line v){if(!vis[u]){vis[u]=1;t[u]=v;return;}int mid=(l+r)>>1;if(t[u].y(x[mid])<v.y(x[mid])) swap(t[u],v);if(l==r) return;if(v.k<t[u].k) modify(u<<1,l,mid,v);else modify(u<<1|1,mid+1,r,v);}ll res;void query(int u,int l,int r,int p){if(vis[u]) res=max(res,t[u].y(x[p]));if(l==r) return;int mid=(l+r)>>1;if(p<=mid) query(u<<1,l,mid,p);else query(u<<1|1,mid+1,r,p);}ll query(int p){res=-inf;query(1,1,n,p);return res;} } namespace Seg2{Line t[N<<2];bool vis[N<<2];void modify(int u,int l,int r,Line v){if(!vis[u]){vis[u]=1;t[u]=v;return;}int mid=(l+r)>>1;if(t[u].y(x[mid])>v.y(x[mid])) swap(t[u],v);if(l==r) return;if(v.k>t[u].k) modify(u<<1,l,mid,v);else modify(u<<1|1,mid+1,r,v);}ll res;void query(int u,int l,int r,int p){if(vis[u]) res=min(res,t[u].y(x[p]));if(l==r) return;int mid=(l+r)>>1;if(p<=mid) query(u<<1,l,mid,p);else query(u<<1|1,mid+1,r,p);}ll query(int p){res=inf;query(1,1,n,p);return res;} } int main(){scanf("%d",&n);for(int i=1;i<=n;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 i=1;i<=n;i++) x[i]=B[i-1];for(int i=n;i>=1;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 ans=0,lst=0;for(int i=1;i<=n;i++){if(ok[i]){ans=max(ans,i-lst);lst=i;}}printf("%d",ans); }

參考文章:
https://blog.csdn.net/Mys_C_K/article/details/87931882

總結

以上是生活随笔為你收集整理的[集训队作业2018] 万圣节的积木(李超线段树)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。