算法蒟蒻新手一枚,这道题的最优时间复杂度是多少啊,直接按要求来就超时了
用数对作为索引,表示两两组合计算速度后存储在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;
}