hysbz 開學了!今年hysbz 有n 個男生來上學,學號為1…n,每個學生都必須參加軍訓。在這種比較墮落的學校裡,每個男生都會有gi 個女朋友,而且每個人都會有乙個欠扁值hi。學校為了保證軍訓時教官不會因為學生們都是人生贏家或者是太欠扁而發生打架事故,所以要把學生們分班,並做出了如下要求:
1.分班必須按照學號順序來,即不能在乙個班上出現學號不連續的情況。
2.每個學生必須要被分到某個班上。
3.每個班的欠扁值定義為該班中欠扁值最高的那名同學的欠扁值。所有班的欠扁值之和不得超過limit。
4.每個班的女友指數定義為該班中所有同學的女友數量之和。在滿足條件1、2、3 的情況下,分班應使得女友指數最高的那個班的女友指數最小。
請你幫hysbz 的教務處完成分班工作,並輸出女友指數最高的班級的女友指數。
輸入資料保證題目有解。
要求最小的最大值,
很容易讓我們想到想到二分。
那麼二分ans, 定義f
i 表示,前
i 個人都分好班了,最小的欠扁值h為多少。
顯然,如果fn
<=li
mit,那麼二分出來的ans是滿足分班條件的。
那麼怎麼轉移呢?,fi
=min
(fj+
max(
hj+1
,hj+
1,hj
+3..
....
hi))
但這樣是o(
n2) 的,會超時,
那麼我們就要像如何優化dp。
用個線段樹來記錄這個區間的
最大的h值mxh
最小的h值mnh
最小的f值mnf
還有答案mn,顯然mn=mnf+mxh(方便而已)
接著隨便搞搞就可以了。
#include
#include
#include
#include
#include
#include
#include
const int maxlongint=2147483647;
using namespace std;
int f[25000],sum[27000],g[27000],h[27000],limit,n,m,ans;
int mxh[100000],mnh[100000],mnf[100000],mn[100000],lazy[100000];
int spread(int
x,int
y)int deeply(int v,int l,int r,int z)
if(l==r)
return
0; spread(v,v*2);
spread(v,v*2+1);
lazy[v]=0;
int mid=(l+r)/2;
if(mnh[v*2]*2,l,mid,z);
if(mnh[v*2+1]*2+1,mid+1,r,z);
mn[v]=min(mn[v*2],mn[v*2+1]);
mnf[v]=min(mnf[v*2],mnf[v*2+1]);
mnh[v]=min(mnh[v*2],mnh[v*2+1]);
mxh[v]=max(mxh[v*2],mxh[v*2+1]);
}int change(int v,int l,int r,int
x,int
y,int z)
spread(v,v*2);
spread(v,v*2+1);
lazy[v]=0;
int mid=(l+r)/2;
if(y
<=mid)
change(v*2,l,mid,x,y,z);
else
if(x>mid)
change(v*2+1,mid+1,r,x,y,z);
else
change(v*2,l,mid,x,mid,z),change(v*2+1,mid+1,r,mid+1,y,z);
mn[v]=min(mn[v*2],mn[v*2+1]);
mnf[v]=min(mnf[v*2],mnf[v*2+1]);
mnh[v]=min(mnh[v*2],mnh[v*2+1]);
mxh[v]=max(mxh[v*2],mxh[v*2+1]);
}int put(int v,int l,int r,int
x,int z)
spread(v,v*2);
spread(v,v*2+1);
lazy[v]=0;
int mid=(l+r)/2;
if(x
<=mid)
put(v*2,l,mid,x,z);
else
put(v*2+1,mid+1,r,x,z);
mn[v]=min(mn[v*2],mn[v*2+1]);
mnf[v]=min(mnf[v*2],mnf[v*2+1]);
mnh[v]=min(mnh[v*2],mnh[v*2+1]);
mxh[v]=max(mxh[v*2],mxh[v*2+1]);
}int find(int v,int l,int r,int
x,int
y,int p)
spread(v,v*2);
spread(v,v*2+1);
lazy[v]=0;
int mid=(l+r)/2;
if(y
<=mid)
find(v*2,l,mid,x,y,p);
else
if(x>mid)
find(v*2+1,mid+1,r,x,y,p);
else
find(v*2,l,mid,x,mid,p),find(v*2+1,mid+1,r,mid+1,y,p);
}bool ok(int gg)
if(f[n]<=limit)
return true;
return false;
}int rf()
printf("%d",l);
}int main()
rf();
}
NOIP2013模擬聯考5 休息 rest
description 休息的時候,可以放鬆放鬆渾身的肌肉,打掃打掃衛生,感覺很舒服。在某一天,某lmz 開始整理他那書架。已知他的書有n 本,從左到右按順序排列。他想把書從矮到高排好序,而每一本書都有乙個獨一無二的高度hi。他排序的方法是 每一次將所有的書劃分為盡量少的連續部分,使得每一部分的書的...
NOIP2013模擬聯考6 選課 select
description 你真的認為選課是那麼容易的事嗎?hysbz的zy同志告訴你,原來選課也會讓人產生一種想要回到火星的感覺。假設你的一周有n天,那麼zy編寫的選課系統就會給你n堂課。但是該系統不允許在星期i和星期i 1的時候選第i堂課,也不允許你在星期n和星期一的時候選第n堂課。然後連你自己也搞...
NOIP2013模擬聯考14 隱藏指令
要想回到原點,走乙個方向後必定會再走乙個相反的方向。先算算 d 1 的情況,有 2 n 個位置,選 n 個放正方向,其餘為負方向,方案數為 tbinom 同理可得 d 2 時,方案數為 tbinom tbinom tbinom d 3 時,方案數為 tbinom tbinom tbinom tbin...