-zhouzhendong
有兩個序列a[1..n], b[1..n],其編號為1..n,設為s序列。現在我們要求出最長的滿足條件的s的子串行s',設va=min(a[s[i]]), vb=min(b[s[i]]), 滿足對於所有的j=s'[i], a*(a[j]-va)+b*(b[j]-vb)<=c。
設v[i]=a*a[i]+b*b[i];
那麼,要求滿足v[s'[i]]-a*va-b*vb<=c,
移項得:v[s[i]]<=a*va+b*vb+c
於是我們可以按照兩種順序排序,乙個是v,乙個是b。
那麼如果確定鼓勵va,則:
a*a[i]+b*b[i]<=a*va+b*vb+c
而a*a[i]>=a*va
所以b*b[i]<=b*vb+c
移項b*(b[i]-vb)<=c,
b[i]<=vb+c/b,
都是整數,所以可以直接取整。
所以,對於所有的b[i],有vb<=b[i]<=vb+c/b。
然後雙指標,乙個掃按照b排序的,乙個掃按照s排序的。
#include #include #include #include #include using namespace std;typedef long long ll;
const int n=5000+5;
struct playerv[n],a[n];
int n;
ll a,b,c;
bool cmp_v(player a,player b)
bool cmp_a(player a,player b)
int main()
sort(v+1,v+n+1,cmp_v);
sort(a+1,a+n+1,cmp_a);
int ans=0;
for (int i=1;i<=n;i++)
while (lans=max(ans,cnt);
} }printf("%d",ans);
return 0;
}
bzoj1071 雙指標 組隊
description nba每年都有球員選秀環節。通常用速度和身高兩項資料來衡量乙個籃球運動員的基本素質。假如一支球隊裡 速度最慢的球員速度為minv,身高最矮的球員高度為minh,那麼這支球隊的所有隊員都應該滿足 a height minh b speed minv c 其中a和b,c為給定的經...
BZOJ 1071 毒瘤題,單調指標搞搞
題目還是看原題吧。這道題簡直魔性 先膜一下大佬wjj orz 我們令s a h b v。原式就是s a minh b minv c 我們預處理出所有s。我們把資料複製兩份,x陣列按s從小到大排序,y陣列按h從小到大排序。我們隨便列舉minv,我們在算出乙個maxv minv c b 有什麼用一會解釋...
BZOJ 1079 SCOI2008 著色方案
題目 分析 一看就覺得是dp或者直接排列組合公式或者容斥?我就只想到dp的,我們用dp i j 表示前i種顏色,排列出有j對相鄰一樣顏色的方案數。當出現乙個新的顏色時,我們把這個顏色插板法插進去,我們要列舉插入的方式,可能插到相鄰顏色一樣的中間,或者不是,然後進行狀態轉移.具體看 include i...