【BZOJ 1271】 [BeiJingWc2008]秦腾与教学评估

1271: [BeiJingWc2008]秦腾与教学评估

Time Limit: 10 Sec   Memory Limit: 162 MB
Submit: 1184   Solved: 411
[ Submit][ Status]

Description

Input

Output

Sample Input

Sample Output

HINT


二分。


一道非常神奇的题。。


一定要注意到题目中说最多有一个地方是奇数个人!!


那么我们二分pos,如果0-pos的人数为偶数,那么ans一定在pos+1-r之间,否则在0-pos之间。


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#define M 200005
#define LL long long
using namespace std;
LL s[M],e[M],d[M];
int n;
LL minn(LL a,LL b)
{
	return a<b?a:b;
}
LL maxx(LL a,LL b)
{
	return a>b?a:b;
}
LL calc(LL r)
{
	int ans=0;
	for (int i=1;i<=n;i++)
	{
		if (s[i]>r) continue;
                ans=ans+(minn(r,e[i])-s[i])/d[i]+1LL;
	}
	return ans;
}
int main()
{
	int T;
        scanf("%d",&T);
	while (T--)
	{
		scanf("%d",&n);
		LL l=0,r=0;
		for (int i=1;i<=n;i++)
			scanf("%lld%lld%lld",&s[i],&e[i],&d[i]),r=maxx(r,e[i]);
		if (!(calc(r)&1LL))
		{
			printf("Poor QIN Teng:(\n");
			continue;
		}
		while (l<r)
		{
			LL m=(l+r)>>1;
			if (calc(m)&1LL) r=m;
			else l=m+1LL;
		}
		LL ans=0;
		for (int i=1;i<=n;i++)
		{
			if (e[i]<l||s[i]>l) continue;
			LL k=(l-e[i])/d[i];
			if (k*d[i]==l-e[i]) ans++;
		}
		printf("%lld %lld\n",l,ans);
	}
	return 0;
}



感悟:

1.wa那么多次是因为long long的问题,虽然输入都在int范围内,但中间有相加的情况,一加就超了。。


2.充分利用题目中给的信息~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值