[USACO22JAN] Minimizing Haybales P 题解

news/2024/11/6 18:07:04/文章来源:https://www.cnblogs.com/laoshan-plus/p/18530720

[USACO22JAN] Minimizing Haybales P

随机化?五分。

显然对于任意 \(a_i,a_j\),若 \(|a_i-a_j|>K\),则这两堆草的先后顺序永远不会改变。所以易得暴力:对于所有这样的 \(i,j\),不妨设 \(i<j\),则连一条 \(i\to j\) 的边,答案就是这个图字典序最小的拓扑排序,优先队列即可。

void toposort(){priority_queue<pair<int,int>>q;for(int i=1;i<=n;++i) if(!in[i]) q.emplace(-h[i],i);while(!q.empty()){int u=q.top().second;q.pop();write(h[u]);for(int i=head[u];i;i=e[i].to)if(--in[e[i].v]==0)q.emplace(-h[e[i].v],e[i].v);}
}int main(){n=read(),k=read();for(int i=1;i<=n;++i) h[i]=read();for(int i=1;i<=n;++i)for(int j=i+1;j<=n;++j)if(abs(h[i]-h[j])>k)addedge(i,j),++in[j];toposort();return fw,0;
}

考虑优化,发现复杂度瓶颈在于连边。正常拓扑排序的操作为:将所有入度为零的点入队,每次删掉当前点。那么神奇地,对于暴力的每一步我们都想办法优化:

  • 如何求初始的入度?将原数组离散化,二分找到所有和当前点相差超过 \(K\) 的点,点数就是入度。然后把这些点加入线段树,就完成了入队的操作。
  • 如何维护全局最小值?线段树啊。
  • 如何删点?还是二分找到所有和当前点相差超过 \(K\) 的节点,将这些点的入度 \(-1\),然后给当前点的入度 \(+\infty\),就完成了删点的操作。
#include<bits/stdc++.h>
#define fw fwrite(obuf,p3-obuf,1,stdout)
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
#define putchar(x) (p3-obuf<1<<20?(*p3++=(x)):(fw,p3=obuf,*p3++=(x)))
using namespace std;char buf[1<<20],obuf[1<<20],*p1=buf,*p2=buf,*p3=obuf,str[20<<2];
int read(){int x=0;char ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x;
}
template<typename T>
void write(T x,char sf='\n'){if(x<0)putchar('-'),x=~x+1;int top=0;do str[top++]=x%10,x/=10;while(x);while(top)putchar(str[--top]+48);if(sf^'#')putchar(sf);
}
constexpr int MAXN=1e5+5;
int n,k,h[MAXN],b[MAXN],tot;
int deg[MAXN];
unordered_map<int,bool>vis;
struct{#define lp p<<1#define rp p<<1|1#define mid ((s+t)>>1)pair<int,int>st[MAXN<<2];int lazy[MAXN<<2];void build(int s,int t,int p){if(s==t){st[p]={deg[s],s};return;}build(s,mid,lp),build(mid+1,t,rp);st[p]=min(st[lp],st[rp]);}void pushdown(int p){if(!lazy[p]) return;st[lp].first+=lazy[p];st[rp].first+=lazy[p];lazy[lp]+=lazy[p];lazy[rp]+=lazy[p];lazy[p]=0;}void mdf(int l,int r,int k,int s=1,int t=n,int p=1){if(l>r) return;if(l<=s&&t<=r) return st[p].first+=k,lazy[p]+=k,void();pushdown(p);if(l<=mid) mdf(l,r,k,s,mid,lp);if(mid<r) mdf(l,r,k,mid+1,t,rp);st[p]=min(st[lp],st[rp]);}#undef mid
}T;
struct{#define lowbit(x) (x&-x)int c[MAXN];void add(int x,int k){while(x<=n) c[x]+=k,x+=lowbit(x);}int sum(int x){int res=0;while(x) res+=c[x],x-=lowbit(x);return res;}
}B;int main(){n=read(),k=read();for(int i=1;i<=n;++i) h[i]=b[i]=read();sort(b+1,b+n+1);tot=n;for(int i=1;i<=n;++i)h[i]=lower_bound(b+1,b+tot+1,h[i])-b+vis[h[i]]++;for(int i=1;i<=n;++i){int x=lower_bound(b+1,b+tot+1,b[h[i]]-k)-b-1;int y=lower_bound(b+1,b+tot+1,b[h[i]]+k+1)-b-1;deg[h[i]]=i-1+B.sum(x)-B.sum(y);B.add(h[i],1);}T.build(1,n,1);for(int i=1;i<=n;++i){int sh=T.st[1].second;write(b[sh]);int x=lower_bound(b+1,b+tot+1,b[sh]-k)-b-1;int y=lower_bound(b+1,b+tot+1,b[sh]+k+1)-b-1;T.mdf(1,x,-1);T.mdf(y+1,n,-1);T.mdf(sh,sh,1e9);}return fw,0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827765.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chapter15

relocation.py参数第一题问题用种子 1、2 和 3 运行,并计算进程生成的每个虚拟地址是处于界限内还是界限外?如果在界限内,请计算地址转换。 种子为1时:种子为2时:种子为3时:第二题问题使用以下标志运行:-s 0 -n 10。为了确保所有生成的虚拟地址都处于边界内,要将-l(界…

23设计模式详解

参考博客 https://baijiahao.baidu.com/s?id=1758410771062793648&wfr=spider&for=pc 设计模式(Design pattern) """ 对软件开发中【普遍存在(反复出现)的问题】,而提出的【解决方案】。每一个设计模式系统地命名、解释和评价了面向对象系统中一…

DearPyGui环境配置

DearPyGui 是一个基于Python的图形用户界面(GUI)工具包,它以简单易用而著称。这个库利用GPU加速渲染和高效的C/C++底层代码,确保了出色的性能和稳定性。DearPyGui支持异步函数,能够绘制大量数据点而不影响帧率,还内置了一个节点编辑器和实时开发调试工具。它适用于Window…

oasys系统代码审计

oasys是一个OA办公自动化系统,使用Maven进行项目管理,基于springboot框架开发的项目,mysql底层数据库,前端采用freemarker模板引擎,Bootstrap作为前端UI框架,集成了jpa、mybatis等框架。简述: oasys是一个OA办公自动化系统,使用Maven进行项目管理,基于springboot框架开…

科大讯飞离线lunix tts demo使用

项目中需要用到后台服务端用文本生成语音,网上大部分都是通过ai大模型推理出来的,还有写其他方式的,效果和生成时间都比较不理想,但是讯飞生成的只需要零点几秒,不愧是行业NO1,下面说下怎么使用。 1、下载官方demo。 2、在官方demo目录下,执行source 32bit_make.sh 或64…

高效数据集成:从旺店通到金蝶云

旺店通旗舰奇门数据集成到金蝶云星空:柏为销售出库单07.25 在现代企业的运营中,数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将分享一个实际案例——如何通过轻易云数据集成平台,将旺店通旗舰奇门的数据无缝集成到金蝶云星空系统中。具体方案名称为“柏为销售出…

对比山海鲸报表和Tableau,哪款报表软件更好用?

在数据分析和报表制作的领域,企业往往面临着选择合适工具的难题。尤其是当市场上有很多功能强大的工具时,如何从中挑选出最适合自己需求的报表软件成为了一个关键问题。今天,我们将对比两款报表工具——山海鲸报表和Tableau,看看它们各自的特点和优势,帮助你做出明智的选择…

团子东子开奖了,这泼天的富贵!

秋招已经接近尾声了,最近各家公司的薪资也陆续公布了,今天在逛某客时,被一个 25 届 C9 硕的薪资羡慕到了,一起来感受下这泼天的富贵吧。 这个同学今年秋招总共拿到了 3 个 Offer,分别是:小米:28K*15,总包 45W,sp,北京。 美团:30K*15.5,总包 47W,sp,上海。 京东:…

odoo中对多条数据按条件进行分类汇总 read_group的用法总结并抽取出公式

今天在工作中遇到一个这样的问题。要求:做一个打印模板实现下面图中的分类汇总 py3o://for="o in object.delivery_containers_line.read_group(domain=[(delivery_order_id,=,object.id)], fields=[customer_id, delivery_order_id, sales_order_id, supplier_id,purcha…

百万年薪!2024 Salesforce高薪职位排行

随着Salesforce在全球的普及,这一平台不仅带来了新的职场机会,更为从业者提供了优渥的薪资待遇。 最近的Salesforce薪资调查显示,Salesforce生态系统中不同职位的薪资水平相当可观,尤其在美国市场,一些顶级岗位的年薪可达到令人惊叹的百万级别。今天我们就来细数2024年Sal…

初识AI大模型,ollama使用,llama factory大模型微调,lama.cpp模型转换guff

最近了解了下生成式AI对话,下面是自己的一些尝试记录。ollama 安装及使用1、安装我是在windows环境下安装的,很简单,访问:https://ollama.com/ ,下载windows安装包,打开安装就行了。cmd输入ollama -v检验是否安装成功。2、配置在环境变量的用户变量中加入如下几个:   …

zlibrary中文版入口及电子书客户端/app(2024更新)

Z-library是一个全球范围内庞大的数字图书馆之一,其藏书量非常丰富。截至最新数据,Z-library共收录了超过9,826,996册电子书以及84,837,646篇学术期刊文章。这个数字图书馆覆盖了从经典文学巨著到前沿理工学科,从人文艺术瑰宝到专业学术论文的广泛领域,几乎能够满足每一位求…