题解:P10224 [COCI 2023/2024 #3] Vrsar
题外话
建议评蓝,因为比 P9209 难
解题思路
首先看到
代码实现
首先看到
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m;
struct node {
int x, t, s;
bool friend operator<(node a, node b) { return a.x < b.x; }
} dt[N];
int main() {
freopen("vrsar.in", "r", stdin);
freopen("vrsar.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int x, t, s;
cin >> x >> t >> s;
dt[i] = { x, t, s };
}
sort(dt + 1, dt + n + 1);
while (m--) {
int k;
cin >> k;
int ans = 0;
for (int i = 1; i <= n; i++) ans = max(ans, dt[i].t - abs(dt[i].x - k));
cout << ans << " ";
}
return 0;
}
这个代码可以通过
离线做法
可以发现滑雪时间
#include<bits/stdc++.h>
#define PII pair<int,int>
#define wz first
#define id second
using namespace std;
const int N=2e5+10;
int n,m;
struct node{
int x,t,s;
bool friend operator<(node a,node b){
return a.x<b.x;
}
}dt[N];
set<int> st,st1;
PII qu[N];
int ans[N];
int main(){
// freopen("vrsar.in","r",stdin);
// freopen("vrsar.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
int x,t,s;
cin>>x>>t>>s;
dt[i]={x,t,s};
}
st.insert(1e9+10);
st1.insert(1e9+10);
sort(dt+1,dt+n+1);
for(int i=1;i<=n;i++)
st.insert(-(dt[i].t-dt[i].x));
for(int i=1;i<=m;i++){
cin>>qu[i].wz;
qu[i].id=i;
}
sort(qu+1,qu+m+1);
for(int i=1,j=1;i<=m;i++){
while(dt[j].x<=qu[i].wz&&j<=n){
st.erase(-(dt[j].t-dt[j].x));
st1.insert(-(dt[j].t+dt[j].x));
j++;
}
ans[qu[i].id]=max(-*st.begin()+qu[i].wz,-*st1.begin()-qu[i].wz);
}
for(int i=1;i<=m;i++)cout<<ans[i]<<" ";
return 0;
}
//瓶颈:找相减最大时间
//63pts
//如何优化?
//t=dt[i].t-abs(dt[i].x-k)
//t=dt[i].t-dt[i].x+k(dt[i]>k)
//t=dt[i].t+dt[i].x-k(dt[i]<k)
//set优化nlogn
//100pts
在线做法
同样的思路,关键在于快速查询,看到区间,看到最大值,看到