LA 4726 斜率優化 單調佇列

2022-09-17 22:03:18 字數 1238 閱讀 2470

題意:

給定乙個01序列,選乙個長度至少為l 的連續子串行使其平均值最大;輸出這個子串行的起點和終點;如果有多個答案,輸出長度最小的,還有多個就輸出第乙個編號最小的;

思路:用sum[i]表示[1,i]的和;題目的平均值就可以變成(sum[i]-sum[j-1])/(i-(j-1));

問題也變成求橫座標的距離至少為l的兩點連線斜率最大的那兩點的橫座標是多少?

對於每個點作為橫座標較大的點,判斷橫座標距離最少為l的點,指標r維護這些點是乙個下凸線,指標l維護與當前點斜率最大點;

複雜度是o(n)的,具體的解釋分析可見《**數形結合在資訊學競賽中的應用》;

ac**:

#include #include #include #include #include #include using namespace std;

#define for(i,j,n) for(int i=j;i<=n;i++)

#define mst(ss,b) memset(ss,b,sizeof(ss));

typedef long long ll;

templatevoid read(t&num)

int stk[70], tp;

templateinline void print(t p)

while(p) stk[++ tp] = p%10, p/=10;

while(tp) putchar(stk[tp--] + '0');

putchar('\n');

}const ll mod=1e9+7;

const double pi=acos(-1.0);

const int inf=1e9;

const int n=1e5+10;

const int maxn=1e3+10;

const double eps=1e-10;

char s[n];

int sum[n],a[n];

int main()

a[++r]=i-l;

while(l=(sum[i]-sum[a[l]])*(i-a[l+1]))l++;

else break;

}if((sum[i]-sum[a[l]])*y>x*(i-a[l]))

else if((sum[i]-sum[a[l]])*y==x*(i-a[l]))

}//cout<}

cout<}

return 0;

}

整理 斜率or單調佇列優化dp

題意 求乙個序列的子區間滿足長度大於k且所有數平均值最大 周源 裡的題。之前有人說周源講的是錯的 其實應該是沒什麼問題的 可以o n 求出 不過這題hdu上的資料不知道怎麼了 反正我在網上找的ac 們全都tle。總之 意思明白就好 反正也是入門題 include include include in...

單調佇列與斜率優化雜題

hdu3530 subsequence 給定乙個序列,求滿足 a leq max min leq b 的最長的子串行 n leq10 6 維護遞增遞減兩個單調佇列,若兩隊首之差大於 b 挪動較小左端點,並更新答案左端點 時間複雜度 o n poj1180 ioi2002 batch scheduli...

見面會EX dp 斜率優化 單調佇列

題目大意 參考這篇blog,但是資料範圍是1e7。題解 這題居然有線性做法是真的秀 就是這個題不能直接線性的原因是斜率優化沒辦法支援刪除資訊,因此需要用分治 線段樹等來去掉刪除。然後有乙個黑科技 考慮將序列劃分為若干段,使得不存在乙個轉移區間同時和至少三個段有交。劃分方法是,由於轉移區間端點是不降的...