您的位置:首页 > 其它

hdu 4768 Flyer 二分

2013-10-01 16:21 381 查看
思路:由于最多只有一个是奇数,所以二分枚举这个点,每次判断这个点的左边区间段所有点的和作为

二分的依据。

代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<set>
#include<vector>
#define ll long long
#define M 200005
#define inf 1e20
#define mod 1000000007
using namespace std;
struct inter
{
ll a,b,c;
}p[M];
bool cal(int n)
{
ll ans=0;
for(int i=0;i<n;i++)
ans+=(p[i].b-p[i].a)/p[i].c+1;
return ans&1;
}
int main()
{
int i,j,k,m,n,x;
ll l,r,mid;
while(scanf("%d",&n)!=EOF){
l=inf;r=0;
for(i=0;i<n;i++){
scanf("%I64d%I64d%I64d",&p[i].a,&p[i].b,&p[i].c);
l=min(l,p[i].a);
r=max(r,p[i].b);
}
if(!cal(n)){
printf("DC Qiang is unhappy.\n");
continue;
}
while(l<=r){
mid=(l+r)>>1;
ll ret=0;
for(i=0;i<n;i++){
if(mid<p[i].a) continue;
ll rr=min(mid,p[i].b);
ret+=(rr-p[i].a)/p[i].c+1;
}
if(ret&1) m=mid,r=mid-1;
else l=mid+1;
}
int ans=0;
for(i=0;i<n;i++)
if(m>=p[i].a&&m<=p[i].b&&(m-p[i].a)%p[i].c==0)
ans++;
printf("%d %d\n",m,ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: