这份代码为什么 CE
  • 板块灌水区
  • 楼主__vector__
  • 当前回复12
  • 已保存回复12
  • 发布时间2024/2/25 15:16
  • 上次更新2024/2/25 17:27:32
查看原帖
这份代码为什么 CE
507348
__vector__楼主2024/2/25 15:16

本菜鸡又来浪费讨论区资源了。

实在不明白,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;
}
2024/2/25 15:16
加载中...