本菜鸡又来浪费讨论区资源了。
实在不明白,g++ 报了一堆错,但是看不懂。
vscode 没有显示错误。
#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define REP(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back()
#define mkpr make_pair
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
int T;
const int maxn=505;
int n,m;
struct Soldier{
int a,b;
bool operator<(const Soldier& B)const{
if(a!=B.a)return a<B.a;
return b<B.b;
}
bool operator==(const Soldier& B)const{
return (a==B.a&&b==B.b);
}
}sold[maxn];
ll gcd(ll a,ll b){
return !b?a:gcd(b,a%b);
}
ll lcm(ll a,ll b){
return a/gcd(a,b)*b;
}
struct FRAC{
ll fz,fm;
void fix(){
ll _gcd=gcd(fz,fm);
fz/=_gcd;
fm/=_gcd;
}
FRAC get(FRAC x,ll newfm){
ll bs=newfm/x.fm;
x.fm*=bs;
x.fz*=bs;
return x;
}
bool operator<(const FRAC& b)const{
ll _lcm=lcm(fm,b.fm);
ll fz1=fz*(_lcm/fm);
ll fz2=b.fz*(_lcm/b.fm);
return fz1<fz2;
}
bool operator==(const FRAC& b)const{
ll _lcm=lcm(fm,b.fm);
ll fz1=fz*(_lcm/fm);
ll fz2=b.fz*(_lcm/b.fm);
return fz1==fz2;
}
bool operator!=(const FRAC& b)const{
ll _lcm=lcm(fm,b.fm);
ll fz1=fz*(_lcm/fm);
ll fz2=b.fz*(_lcm/b.fm);
return fz1!=fz2;
}
FRAC operator *(const ll& b)const{
FRAC res;
res.fz=fz*b;
res.fm=fm;
return res;
}
FRAC operator+(const ll& b)const{
FRAC res;
res.fz=fz+fm*b;
res.fm=fm;
return res;
}
};
map<Soldier,int> cnt;
bool oked[maxn];
FRAC zero={0,1};
void solve(){
scanf("%d%d",&n,&m);
FOR(i,1,n){
scanf("%d",&sold[i].a);
}
FOR(i,1,n){
scanf("%d",&sold[i].b);
cnt[sold[i]]++;
}
Soldier temp=sold[m];
sort(sold+1,sold+n+1);
n=unique(sold+1,sold+n+1)-sold-1;
FOR(i,1,n){
if(sold[i]==temp){
m=i;
break;
}
}
oked[m]=1;
vector<FRAC> sametimes;// 记得去重
map<FRAC,vector<pair<FRAC,int> > > timetoperson; // 每个时间对应的(位置,人)
FOR(i,1,n){
FOR(j,1,n){
if(i==j){
continue;
}
if(sold[i].a==sold[j].a){
sametimes.emplace_back(0);
timetoperson[zero].emplace_back(sold[i].a,i);
timetoperson[zero].emplace_back(sold[i].a,j);
}else{
if(sold[i].a<sold[j].a){
// 注意,i 在 j 右边,因为左移更小
// ......j.....i.....o
int cha=sold[j].a-sold[i].a;
if(sold[i].b>sold[j].b){
// printf("i = %d j = %d cha = %d fasterspeed = %d\n",i,j,cha,sold[i].b-sold[j].b);
FRAC times={cha,(sold[i].b-sold[j].b)};
// printf("times = %d\n",times);
sametimes.emplace_back(times);
timetoperson[times].emplace_back(times*(ll)sold[i].b+(ll)sold[i].a,i);
timetoperson[times].emplace_back(times*(ll)sold[i].b+(ll)sold[i].a,j);
}
}else{
// .....i.....j....o
int cha=sold[i].a-sold[j].a;
if(sold[j].b>sold[i].b){
if((!cha%(sold[j].b-sold[i].b))){
FRAC times={cha,(sold[j].b-sold[i].b)};
// printf("i = %d j = %d cha = %d fasterspeed = %d\n",i,j,cha,sold[j].b-sold[i].b);
sametimes.emplace_back(times);
timetoperson[times].emplace_back(times*(ll)sold[j].b+(ll)sold[j].a,j);
timetoperson[times].emplace_back(times*(ll)sold[j].b+(ll)sold[j].a,i);
}
}
}
}
}
}
sort(sametimes.begin(),sametimes.end());
for(int i=0;i<sametimes.size();i++){
if(i+1==sametimes.size()||sametimes[i]!=sametimes[i+1]){
auto tm=sametimes[i];
sort(timetoperson[tm].begin(),timetoperson[tm].end());
map<FRAC,bool> ok;
for(auto& [pos,person]:timetoperson[tm]){
ok[pos]|=oked[person];
}
for(auto& [pos,person]:timetoperson[tm]){
oked[person]|=ok[pos];
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans+=oked[i]*cnt[sold[i]];
}
printf("%d\n",ans);
cnt.clear();
memset(oked,0,sizeof oked);
}
int main()
{
freopen("animal.in","r",stdin);
freopen("animal.out","w",stdout);
scanf("%d",&T);
while(T--){
solve();
}
return 0;
}