首页 > 其他分享 >2023NOIP A层联测20 点餐

2023NOIP A层联测20 点餐

时间:2023-10-30 22:55:20浏览次数:47  
标签:20 log int tree mid leq ls 点餐 2023NOIP

2023NOIP A层联测20 点餐

题目很好,可惜考试没想到。

思路

可以按照 \(b\) 从小到大排序,固定选择个数 \(k\),枚举选择的盘子 \(x\) 的 \(b\) 最大,最优解肯定是贪心的在前 \(x-1\) 个盘子里选择 \(k-1\) 个最小的,使用权值主席树可以在 \(O(\log_2n)\) 的时间内求解。

我们令 \(f(k)\) 表示 \(k\) 的最优解决策点 \(x\)。设 \(w(k,x)\) 当 \(k\) 的决策点为 \(x\) 时的最优答案。对于两个不同的决策 \(x,y\ (x<y)\),若有 \(w(k,x)>w(k,y)\) ,那么 \(k\) 增大后 \(x\) 可以新选的 \(a\) 值一定严格包含在 \(y\) 可以新选的 \(a\) 值以内,即 \(w(k',x)\geq w(k',y)\) 对于 \(k\leq k'\leq n\) 恒成立,所以有 \(f(k)\leq f(k')\ (k\leq k')\)。由此可得 \(f(1)\leq f(2) \leq f(3) \leq \cdots \leq f(n)\)。决策点具有单调性,可以分治求解(每次选一个区间的中点暴力求,将终点分为两半继续求,具体实现见代码)。

由于分治每一层最多跑 \(O(n)\),有 \(O(\log_2 n)\) 层,所以要求 \(O(n\log_2 n)\) 次 \(w(k,i)\),求一次 \(w(k,i)\) 要 \(O(\log_2 n)\),时间复杂度为 \(O(n\log_2^2 n)\)。

CODE

#include<bits/stdc++.h>
using namespace std;

#define inf 2e9
#define int long long

const int maxn=2e5+5;

struct node
{
    int ls,rs,sz,sum;
}tree[maxn*50];
struct node1
{
    int a,b;
}food[maxn];

int n,tot;
int ans[maxn],rt[maxn];

bool cmp(node1 a,node1 b){return a.b<b.b;}

void insert(int &p,int x,int l,int r)
{
    tree[++tot]=tree[p];
    p=tot;
    if(l==r)
    {
        tree[p].sum+=x-1;
        tree[p].sz++;
        return ;
    }

    int mid=l+r>>1;
    if(x<=mid) insert(tree[p].ls,x,l,mid);
    else insert(tree[p].rs,x,mid+1,r);

    tree[p].sum=tree[ tree[p].ls ].sum+tree[ tree[p].rs ].sum;
    tree[p].sz=tree[ tree[p].ls ].sz+tree[ tree[p].rs ].sz;
}
int getsum(int p,int l,int r,int k)
{
    if(l==r)  return (l-1)*k;
    int mid=l+r>>1;
    if(tree[tree[p].ls].sz>=k) return getsum(tree[p].ls,l,mid,k);
    else return getsum(tree[p].rs,mid+1,r,k-tree[tree[p].ls].sz)+tree[tree[p].ls].sum;
}

void solve(int l,int r,int lp,int rp)//[l,r] 的个数区间,对于 [lp,rp] 决策区间的点
{
    if(r<l) return ;
    int mid=l+r>>1,pos=0;
    for(int i=max(lp,mid);i<=rp;i++)
    {
        int now=food[i].b+food[i].a+getsum(rt[i-1],1,inf,mid-1);//求 w(mid,i)
        if(ans[mid]>=now)
        {
            ans[mid]=now;
            pos=i;
        }
    }
    solve(l,mid-1,lp,pos);//分析 f 的分布可以得出
    solve(mid+1,r,pos,rp);
}

signed main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;i++) scanf("%lld%lld",&food[i].a,&food[i].b);

    sort(food+1,food+n+1,cmp);
    for(int i=1;i<=n;i++)
        insert(rt[i]=rt[i-1],food[i].a+1,1,inf);
    memset(ans,0x5f,sizeof(ans));
    solve(1,n,1,n);

    for(int i=1;i<=n;i++) printf("%lld\n",ans[i]);
}

标签:20,log,int,tree,mid,leq,ls,点餐,2023NOIP
From: https://www.cnblogs.com/binbinbjl/p/17799095.html

相关文章

  • P3746 [六省联考 2017] 组合数问题
    看了题解才悟了,我还是太菜了。solution要求\[\left(\sum_{i=0}^\inftyC_{nk}^{ik+r}\right)\bmodp\]这个形式很像生成函数吧。我们套用生成函数:\[G(x)=\sum_{i=0}^{\infty}\begin{pmatrix}nk\\i\end{pmatrix}x^i\]所求即为\[\sum_{i\bmodk=r}[x^i](1+x)......
  • Annual Report on Fall Semester in 2023
    TodoListDecidethemilestonesinthisterm.Makeamajorpiplineofthistermaccompaniedwithtimeline.PlotagraphonpiplineofmilestonesbasedonthesubjectofDataVisualization.InformalPointsOctober12,2023:ChangedthesurnametoTar......
  • [20231026]bbed查看索引kd_off结构的问题.txt
    [20231026]bbed查看索引kd_off结构的问题.txt--//使用bbed查看索引kd_off结构时存在问题,前面两项指向的偏移不对,从kd_off[2]算起,而且记录的是相对偏移=绝对偏移-kdxle偏移.--//遗漏的两项可以通过最大的kd_off项记录的地址+2,+4获得.--//dumpoffsetkd_off[max]+2count2--//d......
  • [20231027]Index ITL Limit 2.txt
    [20231027]IndexITLLimit2.txt--//链接https://jonathanlewis.wordpress.com/2022/02/18/index-itl-limit/,重复测试--//如果例子插入语句insertintoitl_limitvalues(200-i_tx_count);--//修改为insertintoitl_limitvalues(i_tx_count);--//采用顺序插入,看看结果如何......
  • [CSP-S2020] 儒略日 题解
    [CSP-S2020]儒略日今儿终于做掉困扰多年的题目了,其实想好细节也不难。容易发现儒略历和格里高利历的润年判断方式不一样,并且中间有消失的十天,计算起来相当不方便。所以我们可以首先计算出\(-4713.1.1\)~\(1582.10.4\)会经过多少天,可以通过一天一天暴力跳的方法计算出需要\(......
  • 2023 SHCTF-校外赛道 PWN WP
    WEEK1nc连接靶机直接梭hardnc同样是nc直接连,但是出题人利用linux命令的特性,将部分flag放在了特殊文件中利用ls-a查看所有文件,查看.gift,可以得到前半段然后再lsgift2以及cat相关的内容得不到任何数据。。。因此考虑到会不会是进入目录下找,再更换到gift2目录中,查看flag2,......
  • World Tour Finals 2019 D Distinct Boxes
    洛谷传送门AtCoder传送门神题。设第\(i\)个箱子有\(x_i\)个红球,\(y_i\)个蓝球,那么要求找到最大的\(K\)使得\(\sum\limits_{i=1}^Kx_i\leR,\sum\limits_{i=1}^Ky_i\leB\),且\((x_i,y_i)\)两两不等。显然我们都希望\(x_i,y_i\)尽量小。但是当\(R,B\)......
  • 2023/10/30
    今日我发誓每天学习Javaweb的视频,并且做好每一天的笔记,每一次的代码都要自己上手敲,不给自己留下遗憾,我不想大四毕业以后连工作都找不到。我的目标是考研,这就需要严格要求自己,怕什么,别人能完成,为什么就你完不成,别人能学会,为什么就你学不会,就一个字——懒。不去上手,天天刷视频,打游戏......
  • [CISCN2023] unzip
    [CISCN2023]unzip前言什么是软链接软链接是Linux里面常用的一个命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。它类似与c语言中的指针,传递的是文件的地址。软链接类似于windows中的快捷方式。可以用这种方式来突破只能在tmp文件夹上传文件的限制。解题unzip......
  • [20231023]备库与alter system flush buffer_cache.txt
    [20231023]备库与altersystemflushbuffer_cache.txt--//测试遇到的问题,在备库执行altersystemflushbuffer_cache;刷新数据缓存命令无效.--//通过例子验证:1.环境:[email protected]:1521/orcl>@[email protected]:1521/orcl>@pr==============================P......