【贪心】Ybt_防具布置

题目


K i K_i Ki 为从 0   i 0~i 0 i 的防具的多少。
由于题目中说到,整个防线上只可能有一个破绽。

所以输入的防线如果有破绽,
K 0 K_0 K0 ~ K i K_i Ki 全是偶数, K i K_i Ki 后全是奇数。二分破绽点即可。

如果没有破绽,则 K K K 全是偶数。


代码

#include<cstdio>
#include<iostream>
using namespace std;
long long T, n, l, r, ll, tj, pzw, sum, mid, s[200001], e[200001], d[200001];
void work(){
    
    
	scanf("%lld",&n);
	l = r = pzw = 0;
	for(long long i = 1; i <= n; ++i){
    
    
		scanf("%lld%lld%lld", &s[i], &d[i], &e[i]);
		if(d[i] > r) r = d[i];
	}
	++r;
	ll = r;
	while(l < r){
    
    
		mid = (l+r) / 2;
		sum = 0; tj = 0;
		for(long long i = 1; i <= n; ++i)
		  if(mid >= s[i]){
    
    
		  	  if(mid > d[i]) sum += (d[i] - s[i]) / e[i] + 1;
		  	  else sum += (mid - s[i]) / e[i] + 1;
		  	  if((mid-s[i]) % e[i] == 0 && mid <= d[i]) ++tj;
		  }	
		if(sum % 2 == 0) l = mid+1;
		else {
    
    
			r = mid;
			pzw = tj;
		}
	}
	if(l == ll) printf("There's no weakness.\n");
	else printf("%lld %lld\n",r,pzw);
}
int main(){
    
    
	scanf("%lld",&T);
	while(T--) work();
}

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/112136437