第一種方法:可以二分最大天數訂單的答案然後通過差分求一下是否可行。
1const
int maxn = 1e6 + 5;2
intn, m, a[maxn], ans;
3struct
section b[maxn];
6int
c[maxn], sum[maxn];
78 inline bool ok(int
now)
15 rep(i, 1
, n)
19return
true;20
}2122int
main()
3031
int l = 1, r =m;
32while (l <=r) else
40}
4142
if (!ans) writeln(0
);43
else
47return0;
48 }
第二種方法:無腦插一棵殘缺的線段樹板子即可:
1const
int maxn = 1e6 + 5;2
intn, m;
3struct
node t[maxn << 2];6
#define ls(p) p << 1
7#define rs(p) p << 1 | 189
void build(int l, int r, int
p) 16
int mid = (l + r) >> 1;17
build(l, mid, ls(p));
18 build(mid + 1
, r, rs(p));
19 t[p].minn =min(t[ls(p)].minn, t[rs(p)].minn);20}
2122
void push_down(int
p) 30}31
32void modify(int l, int r, int p, int
k) 38
push_down(p);
39int mid = (t[p].l + t[p].r) >> 1;40
if (l <=mid) modify(l, r, ls(p), k);
41if (mid 42 t[p].minn =min(t[ls(p)].minn, t[rs(p)].minn);43}
4445
intmain() 57}
58 writeln(0
);59
return0;
60 }
洛谷P1083 二分答案 差分
題目傳送門 p1083 借教室 資料範圍 1 leq n,m leq10 6 題目意思 給定長度為 n 的陣列,和 m 次詢問,每次詢問把陣列 l,r 減去 d 問第幾次詢問能夠使得陣列能夠存在小於0的數。樸素做法 對當前 1.n 對每個詢問區間做修改 閉區間 l,r 同時減去 d 同時掃瞄當前區間...
洛谷 P1083 借教室 二分 差分
題意 思路 首先可以看出這是乙個比較典型的差分,首先是離線,然後在區間l,r增加幾,這些都是差分的特徵,那麼現在問題就是,怎樣差分?我們可以看出天數是具有單調性的,當在第x天不行的時候那麼x 1肯定也不行,由此可以看出天數是具有二分的特性的,所以我們可以二分天數。include using name...
洛谷P1083 借教室 二分 差分
n天,每天有r i 個教室出租,一共m個訂單,按照先後順序,每個訂單從s天開始到t天結束,每天要借d個,如果所有訂單都能完成,輸出0,哪天教室不夠,輸出到那個訂單的單號。二分可以完成到第幾個訂單,對於每個二分的值,進行差分到這個訂單為止所有的天數,求下字首和,就可以得出對於每一天有沒有超出借出的教室...