为什么这个代码会T两个点啊QAQ
查看原帖
为什么这个代码会T两个点啊QAQ
310709
Evitagen楼主2021/2/6 20:08
#include<bits/stdc++.h>
using namespace std;
#define re register
const int N=100005;
int T,n;
int s[N],e[N],d[N];
inline int read(){
	int ans=0,opt=1;char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') opt=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		ans=(ans<<3)+(ans<<1)+ch-'0';
		ch=getchar();
	}
	return ans*opt;
}
inline long long check(int x){
	long long ans=0;
	for(re int i=1;i<=n;i++){
		if(x<s[i]) continue;
		ans=ans+(min(x,e[i])-s[i])/d[i]+1;//如果此时出现了奇数个成员,那么答案一定小于mid
									   	  //如果此时出现了偶数个成员,那么答案一定大于mid 
	}
	return ans;
}
int main()
{
	cin>>T;
	while(T--){
		n=read();
		long long sum=0;
		int minn=0x3f3f3f3f,maxn=0;
		for(re int i=1;i<=n;i++){
			s[i]=read();e[i]=read();d[i]=read();
			sum+=(e[i]-s[i])/d[i]+1;
			minn=min(s[i],minn);maxn=max(e[i],maxn);
		}
		if(sum%2==0) cout<<"Poor QIN Teng:("<<endl;
		else{
			int l=minn,r=maxn;
			while(l<r){
				int mid=l+r>>1;
				if(check(mid)&1) 
					r=mid;
				else l=mid+1; 
			}
			int res=0;
			for(re int i=1;i<=n;i++){
				if(s[i]>l||l>e[i]) continue;
				if((l-s[i])%d[i]==0)  res++;
			}
			printf("%d %d\n",l,res);
		}
	}
	return 0;
}
2021/2/6 20:08
加载中...