$ 1≤n,m≤10^6 $,第一反應 \(o(nlogn)\)
直接輸出 '0' 即可。
不要問我怎麼知道輸出 '0' 可以拿 5 pts。
保持微笑.jpeg *1
考慮暴力。
按照題意列舉即可。
核心偽**如下:
定義 n, m 為 int 型變數
定義 r 為 int 型陣列,大小為 max_n
讀入 n, m
讀入 r 陣列
定義 d, s, t 為 int 型變數
使用變數 i 從 1 到 m 遍歷
讀入 d, s, t
使用變數 j 在 r 陣列裡從 s 到 t 遍歷
r[j] 減去 d;
如果 r[j] < 0 那麼
輸出 "-1" 和回車
輸出 i
結束程式
否則 j 指標後移
輸出 "0"
結束程式
然後,考察你程式的常數的時候到了。
保持微笑.jpeg *2
一看就是線段樹。
然而,眾所周知,線段樹的常數是比較大的,所以只有 70 pts。
當然,我也看見了用線段樹a題的大佬,在此表示由衷的敬意.
回憶我們**的時間複雜度:\(o(nlogn)\)
開始猜演算法
——阮行止保持微笑.jpeg *3
然後想到二分答案
設:二分答案的內容為最多可以滿足第 mid 個人的需求
然後開始想 judge 函式。
這時候拼盡腦子想 \(o(n)\) 演算法
然後想到差分
偽**:
函式引數:x(int 型整數) // 表示可否滿足第 x 個人的需求
clear dif // dif 是大小為 max_n 的 int 型陣列
for i (i between [1, x])
dif[s[i]] = dif[s[i]] + d[i]
dif[t[i] + 1] = dif[t[i] + 1] - d[i]
now = 0
for i (i between [1, n])
now += dif[i];
if now > r[i] return false;
return true;
}
int l = 0, r = m, mid;
while (l < r)
if (l == m) putchar('0');
else puts("-1"), write(l + 1);
幾點說明:
如果 judge(m) 為真,說明所有訂單均可滿足
因為 l 表示最多可以滿足第 l 個人的需求,所以第乙個需要修改訂單的人的編號為 l + 1
// luogu-judger-enable-o2
/** * problem: p1083 借教室.
* author: 航空信奧.
* date: 2018/08/23.
* upload: luogu.
*/#include #include namespace hangkongxinao
int now = 0;
for (int i = 1; i <= n; i++)
return true;
} void binary_search()
if (l == m) putchar('0');
else puts("-1"), write(l + 1);
}int main()
for (int i = 1; i <= m; i++)
binary_search();
return 0;
}char bufferread[1 << 17];
int rlen = 0, rpos = 0;
inline char getchar()
template inline _tpint read()
template inline void write(_tpint x)
else
}}int main()
題解 洛谷P1083 借教室
更好的閱讀體驗 portal1 luogu portal2 libreoj portal3 vijos 在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。面對海量租借教室的資訊,我們自然希望程式...
洛谷P1083 借教室 題解
noip2012 提高組 借教室 這道題是幾周之前做到的一道題,本來不想講的,因為這道題也是用到了二分答案的方法,這類題目之前已經發布過兩篇題解了。但這道題還運用了差分陣列這個思想,所以我覺得還是值得講一講的。首先,什麼是差分陣列呢?就是對於某乙個陣列,每兩個相鄰元素的差值組成的新的陣列。比如對於陣...
洛谷 P1083 借教室
在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。面對海量租借教室的資訊,我們自然希望程式設計解決這個問題。我們需要處理接下來n天的借教室資訊,其中第i天學校有ri個教室可供租借。共有m份訂單,...