BZOJ 1271 [BeiJingWc2008]秦騰與教學評估 百年老坑填坑計劃QAQ--二分
阿新 • • 發佈:2018-12-24
題意:
太長啦敘述不起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);
}
}