描述

lsp 学习数学竞赛的时候受尽了同仁们的鄙视,终于有一天……受尽屈辱的 lsp 黑化成为了黑暗英雄Lord lsp。就如同中二漫画的情节一样,Lord lsp 打算毁掉这个世界。数学竞赛界的精英 lqr 打算阻止Lord lsp 的阴谋,于是
她集合了一支由数学 竞赛选手组成的超级行动队。由于队员们个个都智商超群,很快,行动队便来到了 Lord lsp 的黑暗城堡的下方。

但是,同样强大的 Lord lsp 在城堡周围布置了一条“不可越过”的坚固防线。防线由很 多防具组成,这些防具分成了N 组。我们可以认为防线是一维的,那么每一组防具都分布 在防线的某一段上,并且同一组防具是等距离排列的。也就是说,我们可以用三个整数 S, E 和 D 来描述一组防具,即这一组防具布置在防线的 S,S + D,S + 2D,…,S + KD(K∈ Z,S + KD≤E,S + (K + 1)D>E)位置上。

黑化的 Lord lsp 设计的防线极其精良。如果防线的某个位置有偶数个防具,那么这个位 置就是毫无破绽的(包括这个位置一个防具也没有的情况,因为 0 也是偶数)。只有有奇数 个防具的位置有破绽,但是整条防线上也最多只有一个位置有奇数个防具。作为行动队的队 长,lqr 要找到防线的破绽以策划下一步的行动。但是,由于防具的数量太多,她实在是不 能看出哪里有破绽。作为 lqr 可以信任的学弟学妹们,你们要帮助她解决这个问题。

输入格式

输入文件的第一行是一个整数 T,表示有 T 组互相独立的测试数据。 每组数据的第一行是一个整数 N。
之后 N 行,每行三个整数 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

数据范围与约定

  • 对于 30% 的数据,满足防具总数不多于 107。

    对于 100% 的数据,满足防具总数不多于 108,Si≤Ei,1≤T≤5,N≤200000,0≤Si, Ei,Di≤231-1。

题解:二分左右区间寻找奇数区间(因为最多只有一个位置是奇数),最后再对找到的位置进行验证。

#include<algorithm>
#include <iostream>
#include  <cstdlib>
#include  <cstring>
#include  <cassert>
#include   <cstdio>
#include   <vector>
#include   <string>
#include    <cmath>
#include    <queue>
#include    <stack>
#include      <set>
#include      <map>
using namespace std;
#define P(a,b,c) make_pair(a,make_pair(b,c))
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define CLR(vis) memset(vis,0,sizeof(vis))
#define MST(vis,pos) memset(vis,pos,sizeof(vis))
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef pair<int,pair<int,int> >pii;
typedef long long ll;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }

const int maxn = 2e5+5;
int st[maxn],ed[maxn],d[maxn];
int t,n;

template <class T>
inline bool scan_d(T &ret){ 
	char c; int sgn; 
	if(c=getchar(),c==EOF) return 0; //EOF 
	while(c!='?'&&(c<'0'||c>'9')) c=getchar();
	sgn=(c=='?')?-1:1; 
	ret=(c=='?')?0:(c-'0'); 
	while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); 
	ret*=sgn; 
	return 1;
}
int check(int mid){
	int sum=0;
	rep(i,1,n){
		if(mid<=ed[i]&&mid>=st[i]){
			sum+=(mid-st[i])/d[i]+1;
		}
		if(mid>ed[i])sum+=(ed[i]-st[i])/d[i]+1;
	}
	return sum;
}
int main(){
	
	scan_d(t);
	while(t--){
		scan_d(n);
		int l=mod,r=-mod;
		rep(i,1,n){
			scan_d(st[i]),scan_d(ed[i]),scan_d(d[i]);
			l=min(st[i],l),r=max(ed[i],r);
		}
		while(l<r){
			int mid=(l+r)>>1;
			if(check(mid)&1)r=mid;else l=mid+1;
		}
		int cnt=0;
		rep(i,1,n){
			if(l<=ed[i]&&l>=st[i]&&(l-st[i])%d[i]==0)cnt++;//这里能否被整除这个条件很重要
		}
		if(cnt&1)printf("%d %d\n", l,cnt);
		else cout<<"There's no weakness."<<endl;
	}
	return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注