AC题解,有注释
2023-07-16 15:32:47
发布于:广东
6阅读
0回复
0点赞
#include <bits/stdc++.h>
#define LL long long
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
using namespace std;
const int N = 2e5 + 5;
const LL inf = 1e18 + 5;
LL ans;
LL k , m , n , cow[N] , tot = 1 , v[N];
// 定义节点结构体,用于存储牛的价格和运输时间
struct node {
LL p , t;
} re[N];
// 定义询问结构体,用于存储询问的区间范围和运输时间
struct Q {
LL l , r , t;
} q[N];
// 按照牛的价格从小到大排序
bool cmp(node x , node y) { return x.p < y.p; }
// 按照左端点从小到大、右端点从小到大排序
bool cmp2(Q x , Q y) {
if (x.l < y.l) return 1;
if (x.l == y.l && x.r < y.r) return 1;
else return 0;
}
int main () {
// 输入参数 k, m, n
scanf ("%lld%lld%lld" , &k , &m , &n);
// 输入每头牛的价格和运输时间
fu (i , 1 , k) {
scanf ("%lld%lld" , &re[i].p , &re[i].t);
}
// 输入牛的价格
fu(i , 1 , m) {
scanf ("%lld" , &cow[i]);
}
// 将牛的价格和节点排序
sort (re + 1 , re + k + 1 , cmp);
sort (cow + 1 , cow + m + 1);
// 遍历每个节点
fu (i , 1 , k) {
int r = upper_bound(cow + 1 , cow + m + 1 , re[i].p) - cow;
int l = r - 1;
// 根据左右边界情况计算区间范围
if (r == 1)
q[i].l = max (0ll , re[i].p - (cow[r] - re[i].p)) , r = cow[r];
else if (r == m + 1)
q[i].l = cow[l] , q[i].r = min (re[i].p + re[i].p - cow[l] , inf);
else if (re[i].p - cow[l] <= cow[r] - re[i].p)
q[i].l = cow[l] , q[i].r = min (re[i].p + (re[i].p - cow[l]) , inf);
else
q[i].l = max (0ll , re[i].p - (cow[r] - re[i].p)) , q[i].r = cow[r];
q[i].t = re[i].t; // 存储运输时间
}
// 按照区间范围从小到大排序
sort (q + 1 , q + k + 1 , cmp2);
// 将相交的区间合并,并计算总时间
v[tot] = q[1].t;
fu (i , 2 , k) {
if (q[i].l < q[i - 1].r)
v[tot] += q[i].t , q[i].r = q[i - 1].r;
else
v[++tot] += q[i].t;
}
// 按照运输时间从大到小排序
sort (v + 1 , v + tot + 1);
int o = 0;
for (int i = tot ; i >= 1 ; i --) {
ans += v[i];
o ++;
if (o == n) {
printf ("%lld" , ans);
exit (0);
}
}
}
这里空空如也
有帮助,赞一个