1. 程式人生 > >BZOJ 1271 [BeiJingWc2008]秦騰與教學評估 百年老坑填坑計劃QAQ--二分

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); } }