NOIP2023模拟6联测27 C. 点餐
NOIP2023模拟6联测27 C. 点餐
题目大意
有
假设有某位顾客点了
询问所有的
思路
先把输入按
设
就是前
显然,决策满足单调性,所以可以用一个分治来搞
维护最小的前
code
#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define LL long long
using namespace std;
const int N = 2e5 + 5;
const LL inf = 1e18 + 5;
int n , pos , rt[N] , m , ans1[N];
LL ans[N] , a[N];
struct Re {
LL a , b;
} re[N << 1];
struct Tr {
int lp , rp , cnt;
LL val;
} tr[10000005];
bool cmp1 (Re x , Re y) { return x.a < y.a; }
bool cmp2 (Re x , Re y) { return x.b < y.b; }
void glp (int p) {
if (!tr[p].lp)
tr[p].lp = ++pos;
}
void grp (int p) {
if (!tr[p].rp)
tr[p].rp = ++pos;
}
void change (int lst , int p , int l , int r , int x) {
if (l == r) {
tr[p].cnt ++;
tr[p].val += a[l];
}
else {
int mid = l + r >> 1;
if (x <= mid) {
glp (p);
tr[p].rp = tr[lst].rp;
change (tr[lst].lp , tr[p].lp , l , mid , x);
}
else {
grp (p);
tr[p].lp = tr[lst].lp;
change (tr[lst].rp , tr[p].rp , mid + 1 , r , x);
}
tr[p].val = tr[tr[p].lp].val + tr[tr[p].rp].val;
tr[p].cnt = tr[tr[p].lp].cnt + tr[tr[p].rp].cnt;
}
}
LL getsum (int p , int l , int r , int k) {
if (l == r)
return a[l];
else {
int mid = l + r >> 1;
if (tr[tr[p].lp].cnt >= k) {
return getsum (tr[p].lp , l , mid , k);
}
else {
return getsum (tr[p].rp , mid + 1 , r , k - tr[tr[p].lp].cnt) + tr[tr[p].lp].val;
}
}
}
void solve (int l , int r , int L , int R) {
if (l > r)
return;
int mid = l + r >> 1 , now1= 0;
LL now;
fu (i , max (L , mid) , R) {
// now = re[i].b + re[i].a + getsum (rt[i - 1] , 1 , n , mid - 1);
now = re[i].b + getsum (rt[i] , 1 , n , mid);
if (ans[mid] > now) {
ans[mid] = now;
now1 = i;
ans1[mid] = i;
}
}
solve (l , mid - 1 , L , now1);
solve (mid + 1 , r , now1 , R);
}
int main () {
freopen ("order.in" , "r" , stdin);
freopen ("order.out" ,"w" , stdout);
scanf ("%d" , &n);
fu (i , 1 , n)
scanf ("%lld%lld" , &re[i].a , &re[i].b);
sort (re + 1 , re + n + 1 , cmp1);
fu (i , 1 , n) a[i] = re[i].a , re[i].a = i;
sort (re + 1 , re + n + 1 , cmp2);
fu (i , 1 , n) ans[i] = inf;
fu (i , 0 , n) rt[i] = ++pos;
fu (i , 1 , n) {
change (rt[i - 1] , rt[i] , 1 , n , re[i].a);
}
solve (1 , n , 1 , n);
fu (i , 1 , n) {
printf ("%lld\n" , ans[i]);
}
return 0;
}
如果人生会有很长,愿有你的荣耀永不散场
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端