2022杭电多校#3
1009 Package Delivery
思路:贪心,我们尽可能在一个快递的ri去取,然后用一个优先级队列维护当前时刻可以被取的,右端点最靠左的k个。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#include<unordered_map>
#define IOS ios::sync_with_stdio(0);cin.tie(0);
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5+10, M = 2*N;
PII a[N];
void solve(){
int n, k; cin >> n >> k;
for (int i = 0; i < n; i++) cin >> a[i].first >> a[i].second;
priority_queue<int, vector<int>, greater<int>> st;
sort(a, a + n);
st.push(a[0].second);
int res = 0;
for (int i = 1; i < n; i++) {
while(st.size() && st.top() < a[i].first) {
for (int j = 0; j < k; j++){
if (st.empty()) break;
st.pop();
}
res++;
}
st.push(a[i].second);
}
res += ceil(st.size()/double(k));
cout << res << endl;
}
int main(){
IOS
int t = 1;
cin >> t;
while (t--) solve();
return 0;
}
1011 Taxi
思路:将曼哈顿距离转换为切比雪夫距离,发现答案可以二分
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e5+10;
struct node{
int x,y,w;
}p[N];
bool cmp(node a,node b)
{
return a.w<b.w;
}
int mx1[N],mx2[N],mn1[N],mn2[N];
int n,m,qx,qy;
bool check(int x)
{
int l=1,r=n;
while(l<r)
{
int mid=l+r>>1;
if(p[mid].w>=x) r=mid;
else l=mid+1;
}
if(p[l].w<x) return false;
int d=qx+qy-mn1[l];
d=max(d,qx-qy-mn2[l]);
d=max(d,-qx+qy+mx2[l]);
d=max(d,-qx-qy+mx1[l]);
return d>=x;
}
int main()
{
int T;
cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].w);
sort(p+1,p+n+1,cmp);
mx1[n]=mn1[n]=p[n].x+p[n].y;
mx2[n]=mn2[n]=p[n].x-p[n].y;
for(int i=n-1;i>=1;i--)
{
mx1[i]=max(mx1[i+1],p[i].x+p[i].y);
mx2[i]=max(mx2[i+1],p[i].x-p[i].y);
mn1[i]=min(mn1[i+1],p[i].x+p[i].y);
mn2[i]=min(mn2[i+1],p[i].x-p[i].y);
}
while(m--)
{
scanf("%d%d",&qx,&qy);
int l=1,r=1e9;
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
printf("%d\n",l);
}
}
return 0;
}