问题:
将比赛中的赛车视为一条线。所有车都从 初始速度为零的相同点。所有人都进来了 同一个方向。总共有N辆车,编号从1到 N.
您将收到两种疑问:
1.随时改变汽车的速度 i t
2.随时输出当前的比赛获胜者 t
对于查询类型 1 ,我将获得时间,车号和新速度 。
对于查询类型 2 ,我将获得时间,我们需要找到获胜的汽车。
约束:
N <= 50,000,查询&lt; = 10 ^ 5
每次查询的时间也是&gt; =上次查询中的时间
到目前为止我尝试了什么:
#include<bits/stdc++.h>
using namespace std;
pair<int,pair<int,int> > arr[50005];//this stores car's last position,speed,time(at which this speed was assigned)
int main()
{
int n,q;
cin>>n>>q;
for(int i=1;i<=n;++i){arr[i]={0,{0,0}};}
while(q--)
{
int type;
cin>>type;
if(type==1)
{
int time,car,speed;
cin>>time>>car>>speed;
arr[car].first= arr[car].first + 1LL*(time-arr[car].second.second)*arr[car].second.first;// new position
arr[car].second.first = speed;
arr[car].second.second = time;
}
else
{
int ans=-1,time;
cin>>time;
for(int i=1;i<=n;++i){
//position at the "time" is the last position plus distance travelled
int temp = (time - arr[i].second.second)*arr[i].second.first + arr[i].first;
// farthest car is the current winner
ans = max(ans,temp);
}
cout<<ans<<endl;
}
}
return 0;
}
由于此方法在 O(N)中回答 2 类型的查询,因此它实际上是无效的。
由于我只需要更新操作和最大范围查询,我想到使用分段树将其加速到 O(LogN)。
当我意识到用这个来回答查询类型2时,我实际上是在我的代码中途!我存储的内容与额外的变量wins_car基本相同!我想对于1型查询我只会像上面那样更新变量但是为了回答当前哪辆车赢了我无法想出一个能在O(LogN)中回答的查询功能。要么可以编写这样的功能(我无法做到),要么我的节点中存储的信息不足(我认为是这样)!
我应该在树节点中存储什么? (或者段树是不可能的?)。这里没有要求现成的代码,只是方法(如果它很复杂,一些伪代码会很好)但