經典二分:秦騰與教學評估

秦騰與教學評估

題面描述
在秦騰進入北京大學學習的第一個學期,就不幸遇到了前所未有的教學評估。在教學評估期間,同學們被要求八點起牀,十一點回宿舍睡覺,不準曠課,上課不準遲到,上課不準睡覺……甚至連著名的北大三角地也在教學評估期間被以影響校容的理由被拆除。這些“變態”規定令習慣了自由自在隨性生活學習的北大同學叫苦不迭。這一天又到了星期五,一大早就是秦騰最不喜歡的高等代數課。可是因爲是教學評估時期,不能遲到,於是他在八點五分的時候掙扎着爬出了宿舍,希望能趕快混進在八點鐘已經上課了的教室。可是,剛一出宿舍樓門他就傻眼了:從宿舍到教學樓的路上已經站滿了教學評估團的成員。他們的目的就是抓住像他這樣遲到的學生,扣除學校的分數。秦騰當然不能讓評估團得逞。他經過觀察發現,整個評估團分成了N個小組,每個小組的成員都分佈在從宿舍樓到教學樓的路上的某一段,並且同一小組的成員間的距離是相等的。於是,我們可以用三個整數S,E,D來描述評估團的小組:既該小組的成員在從宿舍到教學樓的路上的:S,S+D,S+2D,…,S+KD(K∈Z,S+KD≤E,S+(K+1)D>E)位置。觀察到了教學評估團的這一特點,又經過了認真的思考,秦騰想出了對策:如果在路上的某一位置有奇數個教學評估團成員,他就可以運用調虎離山,聲東擊西,隔山打牛,暗度陳倉……等方法,以這一地點爲突破口到達教學樓。但是由於教學評估團的成員的十分狡猾,成員位置安排的設計極其精妙,導致在整條路上幾乎沒有這樣的位置出現。即使由於安排不慎重出現了這樣的位置,最多也僅有一個。現在秦騰觀察出了所有小組的安排,但是由於整個教學評估團的人數太多,他實在看不出這樣的位置是否存在。現在,你的任務是寫一個程序,幫助他做出判斷。

輸入格式
第一行爲T代表測試數據組數每組第一行爲N。接下來N行,每行三個整數Si,Ei,Di。N≤2∗105,0≤Si,Ei,Di≤231−1 輸入文件不大於2048K

輸出格式
對於每組數據如果所求位置不存在,則輸出Poor Qin Teng
否則輸出兩個整數Posi,Count,代表在唯一位置Posi,有Count個教學評估圖的成員Count爲奇數。

大致思路就是用前綴和加二分去尋找答案。
題目要求只能出現一個奇數,假設存在的情況下,那麼就有一邊的前綴和是奇數,以此來二分,最後找到答案是否存在。

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
struct each {
    int s, e, d;
}a[N];
int n;
ll _sum(int x) {
    ll sum = 0;
    for(int i = 0; i < n; i++)
        if(a[i].s <= x)
            sum += (min(x, a[i].e) - a[i].s)/ a[i].d + 1;
    return sum;
}
int main() {
    int t;
    scanf("%d", &t);
    while(t--) {
        scanf("%d", &n);
        int l = 0, r = 0;
        for(int i = 0; i < n; i++) {
            scanf("%d %d %d", &a[i].s, &a[i].e, &a[i].d);
            r = max(r, a[i].e);
        }
            
        while(l < r) {
            int mid = l + r >> 1;
            if(_sum(mid) & 1) r = mid;
            else l = mid + 1;
        }
        ll sum = _sum(r) - _sum(r - 1);
        if(sum % 2)
            printf("%d %lld\n", r, sum);
        else    puts("There's no weakness.");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章