防具布置
题目描述
输入格式
第一行是一个整数T,表示有T组互相独立的测试数据。
每组数据的第一行是一个整数N。
之后N行,每行三个整数 S i , E i , D i S_i,E_i,D_i Si,Ei,Di,代表第i组防具的三个参数,数据用空格隔开。
输出格式
对于每组测试数据,如果防线没有破绽,输出一行 There’s no weakness.。
否则在一行内输出两个空格分隔的整数P和C,表示在位置P有C个防具。当然C应该是奇数。
输入样例
3
2
1 10 1
2 10 1
2
1 10 1
1 10 1
4
1 10 1
4 4 1
1 5 1
6 10 1
输出样例
1 1
There's no weakness.
4 3
解题思路
记S(i)表示0~i的位置上一共有多少个防具,显然对每组防具分类讨论即可求出S(i),时间复杂度为O(n)
Code
#include<cstdio>
#include<algorithm>
using namespace std;
int T,n,s[200005],e[200005],d[200005];
int S(int x) {
int answer=0;
for(int i=1; i<=n; i++)
if(s[i]<=x)answer+=(min(x,e[i])-s[i])/d[i]+1;
return answer;
}
int main() {
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d%d%d",&s[i],&e[i],&d[i]);
if(S(2147483647)%2==0) {
printf("There's no weakness.\n");
continue;
}
int l=0,r=2147483647;
while(l<r) {//二分答案
int mid=(1ll*l+1ll*r)/2;
if(S(mid)%2==0)l=mid+1;
else r=mid;
}
printf("%d %d\n",l,S(l)-S(l-1));
}
return 0;
}