题目
解
设 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();
}