BZOJ - 1271 秦腾与教学评估【二分】

【题目描述】
在秦腾进入北京大学学习的第一个学期,就不幸遇到了前所未有的教学评估。在教学评估期间,同学们被要求八点起床,十一点回宿舍睡觉,不准旷课,上课不准迟到,上课不准睡觉……甚至连著名的北大三角地也在教学评估期间被以影响校容的理由被拆除。这些“变态”规定令习惯了自由自在随性生活学习的北大同学叫苦不迭。这一天又到了星期五,一大早就是秦腾最不喜欢的高等代数课。可是因为是教学评估时期,不能迟到,于是他在八点五分的时候挣扎着爬出了宿舍,希望能赶快混进在八点钟已经上课了的教室。可是,刚一出宿舍楼门他就傻眼了:从宿舍到教学楼的路上已经站满了教学评估团的成员。他们的目的就是抓住像他这样迟到的学生,扣除学校的分数。秦腾当然不能让评估团得逞。他经过观察发现,整个评估团分成了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<=200000
0<=Si,Ei,Di<=2^31-1
输入文件不大于2048K

【输出】
对于每组数据如果所求位置不存在,则输出Poor Qin Teng:(
否则输出两个整数Posi,Count,代表在唯一位置Posi,有Count个教学评估图的成员
Count为奇数,注意输出的所有符号为英文半号

【样例输入】
3
2
1 10 1
2 10 1
2
1 10 1
1 10 1
4
1 10 1
4 4 1
1 5 1
6 10 1

【样例输出】
1 1
Poor QIN Teng:(
4 3

题目链接:https://vjudge.net/problem/HYSBZ-1271

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
static const int MAXN=200000;
struct Seq{
    int s,e,d;
}a[MAXN+10];
int n;
ll sum(int x)
{
    ll ans=0;
    for(int i=1;i<=n;i++)
        if(a[i].s<=x)
            ans+=(min(a[i].e,x)-a[i].s)/a[i].d+1;
    return ans;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        ll l=0,r=0;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i].s>>a[i].e>>a[i].d;
            if(a[i].e>r) r=a[i].e;
        }
        while(l<r)
        {
            int mid=(l+r)>>1;
            if(sum(mid)&1) r=mid;
            else l=mid+1;
        }
        ll res=sum(r)-sum(r-1);
        if(res&1)
            cout<<r<<" "<<res<<endl;
        else
            cout<<"Poor QIN Teng:("<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值