問題大意:有 n 種傳單,第 i 種從位置 a_i 開始,每隔 c_i 分發一份,直到 b_i 為止。收到奇數份傳單的同學視為「不幸運」。樣例保證至多一名不幸運同學。若無則輸出 "DC Qiang is unhappy!",否則輸出該同學位置與收到份數。
關鍵性質:若區間 [l, r] 內有且只有一人收到奇數份,則該區間總份數為奇數。利用此性質二分定位不幸運同學位置。
ll judge(ll k) { // 計算 [k, R] 區間總份數
ll c = 0;
for (int i = 0; i < n; i++) {
ll x = min(R, d[i].b) - d[i].a;
ll y = min(k, d[i].b) - d[i].a;
if (x >= 0) c += (x / d[i].c + 1);
if (y >= 0) c -= (y / d[i].c + 1);
}
return c;
}
ll solve() {
while (l < r) {
ll mid = (l + r) / 2;
if (judge(mid) & 1) l = mid + 1;
else r = mid;
}
return l;
}