//因为只有一个奇数所以根据前缀和的性质 //奇数点之前都是偶数 //奇数点之后都是奇数 #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N = 200010; struct Seq{//输入首项末项公差 int s, e, d; }seqs[N]; int n; ll get_sum(int x) { ll res = 0; for(int i = 0; i < n; i ++) { if(seqs[i].s <= x) res += (min(x,seqs[i].e) - seqs[i].s) / seqs[i].d + 1;//因为有的点的end不一定到达x即二分形成的答案那么就要取mid } return res; } int main() { int T; int r, l; scanf("%d",&T); while(T --) { scanf("%d", &n); for(int i = 0; i < n; ++ i) { int s, e, d; scanf("%d%d%d",&s,&e,&d); seqs[i] = {s,e,d}; r = max(r,e);//上界就是防线的最远值 } l = 0;//下界为0 while(l < r) { int mid = l + r >> 1; if(get_sum(mid) & 1) r = mid; else l = mid + 1; } //求多少个数就是r用前缀和的思想 auto sum = get_sum(r) - get_sum(r - 1); if(sum % 2 == 1) cout << r <<" "<< sum << endl; else puts("There's no weakness."); } }