$Luogu4403$ 秦腾与教学评估 二分

$Luogu$

 

$Description$

有$N$个数列,求一个$x$,$x$在各个数列中的出现次数之和为奇数.这样的$x$最多存在$1$个.若不存在则输出Poor QIN Teng:(

 

$Sol$

这样的$x$最多存在一个说明什么呢?

我们知道奇数+偶数=偶数,偶数+偶数=偶数,所以从$x$开始往后的数,它们的前缀和都为奇数,$x$以前的数它们的前缀和都是偶数,发现了$x$的单调性!然后二分.

$over$

 

$Code$

#include<bits/stdc++.h>
#define il inline
#define Rg register
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
#define yes(i,a,b) for(Rg int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define int long long
#define db double
using namespace std;
il int read()
{
    Rg int x=0,y=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    return x*y;
}
int T,n,r;
struct node{int s,e,d;}a[200010];
il int calc(int x)
{
    Rg int ret=0;
    go(i,1,n)if(a[i].s<=x)ret+=(min(x,a[i].e)-a[i].s)/a[i].d+1;
    return ret;
}
il int sol()
{
    Rg int l=1,as=0;
    while(l<=r)
    {
        Rg int mid=(l+r)>>1;
        if(calc(mid)%2==1)as=mid,r=mid-1;
        else l=mid+1;
    }
    return as;
}
main()
{
    T=read();
    while(T--)
    {
        n=read();r=0;go(i,1,n)a[i]=(node){read(),read(),read()},r=max(r,a[i].e);
        if(calc(r)%2==0){printf("Poor QIN Teng:( \n");continue;}
        Rg int qwq=sol(),as=0;
        go(i,1,n)
        {
            if(a[i].s>qwq || a[i].e<qwq)continue;
            if((qwq-a[i].s)%a[i].d==0)as++;
        }
        //printf("%d %d\n",qwq,as);
        printf("%d %d\n",qwq,calc(qwq)-calc(qwq-1));
    }
    return 0;
}
View Code

 

 

 

posted @ 2019-08-16 11:32  DTTTTTTT  阅读(111)  评论(0编辑  收藏  举报