題意:
給定乙個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。題解 這題居然有線性做法是真的秀 就是這個題不能直接線性的原因是斜率優化沒辦法支援刪除資訊,因此需要用分治 線段樹等來去掉刪除。然後有乙個黑科技 考慮將序列劃分為若干段,使得不存在乙個轉移區間同時和至少三個段有交。劃分方法是,由於轉移區間端點是不降的...