$Luogu4403$ 秦腾与教学评估 二分
Posted forward777
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了$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 nodeint 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;
以上是关于$Luogu4403$ 秦腾与教学评估 二分的主要内容,如果未能解决你的问题,请参考以下文章