[BJWC2008]秦腾与教学评估

#include <bits/stdc++.h>

using namespace std;


int t, n;
long long s[200020];//区间起点 
long long e[200020];//终点 
long long d[200020];//每次加的数 

bool ok(long long mx) 
{//前缀 
    long long re=0;
    for (int i=0;i<n;i++) //n次区间 
        if (mx>=s[i]) //枚举的在此区间内 
            re+=(min(e[i],mx) -s[i]) /d[i] +1;//有几个数 

    return re%2;//是奇数 
}

int main() 
{
    ios::sync_with_stdio(false);
    cin>>t;
    for (int tt=1;tt<=t;tt++) 
    {
        cin>>n;
        for (int i =1; i<=n;i++)
            cin>>s[i]>>e[i]>>d[i];
    
        long long l = -1; // <=l的位置没有奇数个人 
        long long r = 1e10; // <= r的位置一定有奇数个人 
        
        if (!ok(r)) // 全为偶数 
        {
            cout<<"Poor QIN Teng:("<<endl;
            continue;
        }
        
        while (l<r) //二分 
        {
            long long mid=(l+r)/2;
            if (ok(mid)) 
                r=mid;//在左边 
            else 
                l=mid+1;//在右边 
        
        }
        //此时找到了位置,r 
        
        int cnt=0;
        for (int i=1;i<=n;i++) //n个区间 
        {
            if (s[i]<=r&&r<= e[i]) //r在这个区间内 
            {
                if ((r-s[i])%d[i]==0) //如果在区间内,并且是倍数,++,计数 
                    cnt++;
            }
        }
        //输出位置和数 
        cout<<r<<" "<<cnt<<endl;
    }
    
    return 0;
}

 

posted @ 2021-04-17 10:58  Hehe_0  阅读(49)  评论(0)    收藏  举报