超时咧
查看原帖
超时咧
1083727
JameYoung楼主2024/9/8 16:59

算法蒟蒻新手一枚,这道题的最优时间复杂度是多少啊,直接按要求来就超时了

用数对作为索引,表示两两组合计算速度后存储在map里,每第m次只修改对应数对指向的速度。

很新手的思路,求大佬狠狠肘击

#include<iostream>
#include<map>
#include<vector>
using namespace std;

int n,m;
vector<int> x,t,u,v;

int caluate(int x0, int y0){
    int up = abs(x[x0]-x[y0]);
    int down=abs(t[x0]-t[y0]);
    return up/down;
}

class MyCompare{
public:
    bool operator()(pair<int, int> p1, pair<int, int> p2)const{
        if (p1.first != p2.first) return p1.first > p2.first;
        return p1.second > p2.second;
    }
};

map<pair<int,int>, int, MyCompare> st;

void init(){
    for (int i=1; i<n; i++) {
        for (int j = i + 1; j <= n; j++) {
            st.emplace(make_pair(i, j), caluate(i, j));
        }
    }
}

int main(){
    cin >> n >> m;
    x.resize(n+1);
    t.resize(n+1);
    u.resize(m+1);
    v.resize(m+1);
    for (int i=1; i<=n; i++){
        cin >> x[i] >> t[i];
    }
    init();

    for (int i=1; i<=m; i++){
        cin >> u[i] >> v[i];
        map<pair<int,int>, int, MyCompare> st0 = st;
        int td=t[u[i]];
        t[u[i]]=v[i];

        for (int j=1; j<=n; j++){
            if (j == u[i]) continue;
            if (j>u[i]){
                st0[make_pair(u[i],j)] = caluate(u[i],j);
            }
            else{
                st0[make_pair(j,u[i])] = caluate(j,u[i]);
            }
        }
        t[u[i]]=td;
        cout << st0.rbegin()->second << endl;
    }
    return 0;

}
2024/9/8 16:59
加载中...