BZOJ 1271 [BeiJingWc2008]秦腾与教学评估 百年老坑填坑计划QAQ-2分
BZOJ 1271 [BeiJingWc2008]秦腾与教学评估 百年老坑填坑计划QAQ--二分
题意:
太长啦叙述不起QAQ
解析:
因为题中说了,最多只有一个位置有奇数个人。
所以我们可以先check一下,如果总人数是偶数那么显然就是
Poor Qin Teng
接下来的话我们只需要二分出那个奇数的位置,检验l到这个位置有多少个人即可。
得到位置之后直接O(n)求一下该位置的人数即可。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 200100
using namespace std;
typedef long long ll;
int n;
ll s[N],e[N],d[N];
ll calc(ll to)
{
ll ret=0;
for(int i=1;i<=n;i++)
{
if(s[i]>to)continue;
ll tmpr=min(e[i],to);
ret+=(tmpr-s[i])/d[i]+1;
}
return ret;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ll maxe=0;
for(int i=1;i<=n;i++)
scanf("%lld%lld%lld",&s[i],&e[i],&d[i]),maxe=max(maxe,e[i]);
ll tmp=calc(maxe);
if(!(tmp&1))
{
puts("Poor QIN Teng:(");
continue;
}
ll l=0,r=maxe,ans;
while(l<=r)
{
ll mid=(l+r)>>1;
if(calc(mid)&1)ans=mid,r=mid-1;
else l=mid+1;
}
ll cnt=0;
for(int i=1;i<=n;i++)
{
if(s[i]>ans)continue;
if(e[i]<ans)continue;
if((ans-s[i])%d[i]==0)
cnt++;
}
printf("%lld %lld\n",ans,cnt);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。