$Luogu4403$ 秦腾与教学评估 二分
$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; }
光伴随的阴影