隊爺即將出版新書,以記錄他輝煌的虐題生涯。。。
有 n 家出版社對這本書表示了興趣,並願意給隊爺支付 p∈[min_pay,max_pay]的報酬來得到這本書的出版權,每家出版社的min_pay 和 max_pay 是不一樣的。
現在隊爺希望你幫他找出乙個報酬值 p,使得他獲得的總報酬最多。(每乙個 min_pay<=p<=max_pay 的出版社都會付給隊爺 p的報酬)
第一行為乙個整數 n。
接下來 n 行每行 2 個整數 min_payi 和 max_payi,為第 i 家出版社願支付的報酬範圍。
只有乙個整數 ans,為最大總報酬。34
1 32 4
3 54 7
當 p=4 時,有 3 家出版社會給出報酬,此時最大。
對於 20%的資料,1<= min_pay,max_pay<=10000;
對於 40%的資料,1<=n<=1000,1<= min_pay,max_pay<=10^6;
對於 100%的資料,1<=n<=100000,1<= min_pay,max_pay<=10^9。
因為這是閉區間,最後的答案一定在區間端點上,其實這個和劉汝佳書上的掃瞄線法很像,把左右端點看成乙個事件,只有遇到端點時,答案才會變化,由於這個是閉區間所以遇到端點答案是會增加的,所以兩個端點(不一定非得是左右端點)之間的點一定沒有端點優。其實可以換乙個思路想,其實每個區間都會給區間的每乙個點的權值增加1,由於是單點查詢,所以就可以用差分維護。但max_pay太大了,就可以對區間左右的端點離散化之後差分。
#include#include#include
#include
using
namespace
std;
const
int n=200010
;inline
intread()
while(ch>='
0'&&ch<='9')
return x*f;
}int n,t[n],tot,s[n]; long
long
ans;
struct
nodea[n],b[n];
intmain()
sort(t+1,t+2*n+1
);
int m=unique(t+1,t+2*n+1)-(t+1
);
for(int i=1;i<=n;++i)
for(int i=1;i<=n;++i)
++s[b[i].x],--s[b[i].y+1
];
for(int i=1;i<=m;++i) s[i]+=s[i-1
];
for(int i=1;i<=m;++i)
if(s[i]*1ll*t[i]>ans) ans=s[i]*1ll*t[i];
printf(
"%lld\n
",ans);
return0;
}
2015 10 31的NOIP模擬賽
這是noip前的最後一周了。第一題是個組合數學的問題,規模不算太大。但第一反應就直接dp了,o n 2 的複雜度,始終想不到優化。本來看著1 3 4 6 10 15一串串數覺得多熟悉的,就是想不起來那是組合數。最後只有80分 第二題算是基本想到了吧,但是忽略了乙個問題 我的想法是每行0的個數要麼是當...
noip模擬賽 密碼
表示沒看懂演算法3 問題描述 有壓迫,就有反抗。mored的寵物在法庭的幫助下終於反抗了。作為乙隻聰明的寵物,他打算把魔法使mored的魔法書盜去,奪取mored的魔法能力。但mored怎麼會讓自己的魔法書輕易地被盜取?mored在魔法書上設定了乙個密碼鎖,密碼鎖上有乙個問題。施以斯臥鋪魔法吧,你有...
NOIP模擬賽 老師
題目描述 一座有n層的教學樓裡有一些學生,第i 0 i n 層有studentsi個學生。你被給定了乙個數k,如果第i層有x個學生,那麼這一層需要 x k 個老師。你可以調整每個學生的樓層,但是每個學生至多只能調整一層,就是說第i層的學生只能去第i 1層 如果有的話 第i層 第i 1層 如果i 1 ...