洛谷 P7971 [KSN2021] Colouring Balls 题解

news/2025/12/7 13:17:43/文章来源:https://www.cnblogs.com/xiaoniu142857/p/19318010

人生第一道蓝交互。

观察数据范围,可以考虑数据点分治,分别解决各个 Subtask。

Subtask 1 & 2

由于颜色块连续,当 query(l,r)==1 时必有 \([l,r]\) 的小球颜色全部相同。

于是双指针扫一遍即可,\(l\) 为当前颜色段起点,\(r\) 一直向右扫到 query(l,r)>1

namespace Subtask12{void solve(){int l=1,r=2,cnt=1;while(l<=n){while(r<=n&&query(l,r)==1) ++r;rep(i,l,r) ans[i]=cnt;++cnt,l=r;}cout<<"! ";rept(i,1,n) cout<<ans[i]<<' ';cout<<endl;}
}

Subtask 3 & 4

发现颜色数量不会超过 \(4\) 种。这里只需要考虑 \(4\) 种颜色的情况。

可以维护每种颜色最后出现的位置,按照最后出现的顺序排序,然后分讨即可,细节比较多。

namespace Subtask34{void solve(){int lst[5]={},ord[5];// lst[i]:颜色i上一次出现的位置rept(i,1,4) ord[i]=i;rept(i,1,n){sort(ord+1,ord+5,[lst](int x,int y)->bool{return lst[x]>lst[y];});int a=ord[1],b=ord[2],c=ord[3],d=ord[4];if(!lst[a]) ans[i]=1;else if(!lst[b]){if(query(lst[a],i)==1) ans[i]=a;else ans[i]=b;}else if(!lst[c]){if(query(lst[b],i)==3) ans[i]=c;else if(query(lst[a],i)==1) ans[i]=a;else ans[i]=b;}else{// 可以通过二分减少询问次数if(query(lst[b],i)==2){if(query(lst[a],i)==1) ans[i]=a;else ans[i]=b;}else{if(query(lst[c],i)==3) ans[i]=c;else ans[i]=d;}}lst[ans[i]]=i;}cout<<"! ";rept(i,1,n) cout<<ans[i]<<' ';cout<<endl;}
}

Subtask 5

先判断总颜色数量。

若为 \(N\),做法显然。

若为 \(N-1\),则有且仅有一对同色的球。

我们注意到如果 query(l,r)==r-l,则这对球一定在 \([l,r]\) 中。

因此从 \([1,N]\) 开始逐渐收紧区间就能找出同色球的位置。

namespace Subtask5{void solve(){int k=query(1,n);if(k==n){cout<<'!';rept(i,1,n) cout<<' '<<i;cout<<endl;return;}int l=1,r=n,cnt=1;while(l<=r&&query(l,r)==r-l) ++l;--l;while(l<=r&&query(l,r)==r-l) --r;++r;cout<<"! ";rept(i,1,n){if(i==l||i==r) cout<<n<<' ';else cout<<cnt++<<' ';}cout<<endl;}
}

Subtask 6 & 7

注意到,如果 query(l,r)==query(l+1,r),则 \([l+1,r]\) 中一定有与 \(l\) 同色的球。

有了这个,我们就能二分出每个球右边第一个与它同色的球的位置 \(nxt_i\),进而求出每个球的颜色。

namespace Subtask67{int nxt[N];// nxt[i]:i右边第一个与i同色的球位置void solve(){int cnt=1,p;rept(i,1,n){int l=i+1,r=n+1,mid;while(l<r){mid=l+r>>1;if(query(i,mid)==query(i+1,mid)) r=mid;else l=mid+1;}nxt[i]=l;}rept(i,1,n){if(!ans[i]){for(int j=i;j<=n;j=nxt[j]) ans[j]=cnt;++cnt;}}cout<<"! ";rept(i,1,n) cout<<ans[i]<<' ';cout<<endl;}
}

然而这样的询问次数大约是 \(2N\log_2 N\approx 20000\),过不了 Subtask 7。需要想办法去掉一次 query

发现 query(i,mid) 不好省掉,考虑省掉 query(i+1,mid)

仔细观察 query(i+1,mid),发现这个东西等于 \(mid-i-\sum_{k=i+1}^{mid}[nxt_k\le mid]\)

于是从 \(N\)\(1\) 倒着计算 \(nxt_i\),用树状数组维护和式里面的部分即可。

询问次数 \(N\log_2 N\),时间复杂度 \(O(N \log^2 N)\),目前最优解。

namespace Subtask67{int nxt[N],s[N];void add(int p,int x){while(p<=n){s[p]+=x;p+=p&-p;}}int ask(int p){int res=0;while(p){res+=s[p];p&=p-1;}return res;}void solve(){pert(i,n,1){int l=i+1,r=n+1,mid;while(l<r){mid=l+r>>1;if(query(i,mid)==mid-i-(ask(mid)-ask(i))) r=mid;else l=mid+1;}nxt[i]=l;if(nxt[i]<=n) add(nxt[i],1);}int cnt=1;rept(i,1,n){if(!ans[i]){for(int j=i;j<=n;j=nxt[j]) ans[j]=cnt;++cnt;}}cout<<"! ";rept(i,1,n) cout<<ans[i]<<' ';cout<<endl;}
}

完整代码

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

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

相关文章

P10190 [USACO24FEB] Target Practice II S

洛谷 首先进行分类讨论。 对于每个右上角的点,为了不让箭穿过箭靶,必须分配一只向下射的奶牛,即斜率为负数的奶牛。 右下角的点同理,只能选择斜率为正数的点。 对于左上角左下角,不管斜率为正还是负都可以射到。 …

仿生手的混合结构设计与神经形态触觉传感

研究人员开发了一种混合结构的仿生手,它结合了刚性和软体机器人的优点,并集成了三层触觉传感器和机器学习算法,能够像人类一样感知并自适应地抓握多种物体,准确率高达99.69%。感觉即相信:仿生手能“感知”所触之物…

P8272 [USACO22OPEN] Apple Catching G

洛谷 先考虑推导式子。 设我们选择的奶牛为 \(i\),选择的苹果是 \(j\)。 那么可以得到式子: \[|x_i-x_j|\le t_j-t_i \]直接拆掉绝对值,因为绝对值会取较大的值,所以不需要考虑二者大小关系的影响,然后即可推得两式…

材料科学每日总结--Day13--数据挖掘

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

原理图文档处理工具

原理图文档处理工具 原理图文档处理工具 原理图库文档处理工具 PCB文档处理工具 PCB库文档处理工具

P8187 [USACO22FEB] Robot Instructions S

洛谷 看到 \(1\le N\le 40\) 甚至部分分 \(N\le 20\) 而且只有选和不选两种情况,这不是折半是什么? 那么直接考虑最板子的折半,前面一半从起点直接暴力搜索是否选择,得到最后的位置,另一半从终点往回走,最后统计…

2025年3D扫描仪十大品牌权威排名:国产化替代首选TOP10

body { font-family: "Microsoft YaHei", Arial, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-width: 1200px; margin: 0 auto; padding: 20px; background-color: rgba(249, 249, 249,…

P8270 [USACO22OPEN] Subset Equality S

洛谷 发现字母的范围比较小,但是也没有小多少,那么多半是需要对字母组合求解。 第一想法就是给计入的字母状压,确认是否相同。 但是字符串长度又太长了,并且不好优化,只能放弃。 那么该怎么组合? 我们发现影响两…

P8271 [USACO22OPEN] COW Operations S

洛谷 蒟蒻给一个时间复杂度较劣的线段树做法。 我们可以发现两个字符处理的结果和处理的顺序没有关系,那么我们可以先考虑将每一部分都尝试合成一个或没有字符,再进行合并。 那么我们其实可以考虑使用线段树直接维护…

P10779 BZOJ4316 小 C 的独立集

洛谷 首先需要知道独立集是什么。 简单来讲独立集就是一个没有相邻的点的集合。 我们已经处理过比较多的独立集问题了。 比如常见的线性独立集。 代码: for(int i=1;i<=n;i++){dp[i][0]=max(dp[i-1][1],dp[i-1][0]…

街头徒手健身6倒立训练与肩部健康

6 倒立训练与肩部健康 这个世界纷繁复杂、充满变数,但有一条真理始终不变:宇宙总会竭力维持平衡,以此维系自身的稳定运转。我们的身体亦是如此 —— 必须让拮抗肌群之间保持力量平衡,才能维持正常的生理功能。而练…

AI语料优化新势力:助力企业抢占智能时代先机的优质服务商推荐

在人工智能技术飞速迭代的今天,AI搜索排名优化已成为企业数字化转型的核心竞争力之一,而高质量的语料优化则是撬动这一竞争力的关键支点。从geo优化带来的地域化精准触达,到针对DeepSeek、豆包、文心一言等主流AI模…

基于MATLAB的位同步提取方法

一、位同步技术概述 1. 基本概念 位同步(Bit Synchronization)是数字通信系统的核心技术,指从接收信号中提取与发送端码元定时一致的本地时钟信号,实现对接收码元的准确判决。其本质是解决定时相位模糊问题,确保抽…

Manim介绍

Manim是一个用于创建数学动画的Python库,其类架构设计围绕着场景(Scene)、对象(Mobject)和动画(Animation)这几个核心概念构建,以实现复杂数学可视化的需求。以下是对其主要类架构的详细解释: 1. Mobject 类基…

P2475 [SCOI2008] 斜堆

洛谷 提供一种在模拟赛上自己观察出来的方法。 由于树是递归定义的,并且每次加入一个值在这个子树中,左右儿子会调换,再将这个点加入左子树。因此我们每次加入一个节点,必须保证这个点未加入的左右子树的节点数量相…

P6803 [CEOI 2020] 星际迷航

洛谷 由于两个人都是绝对聪明的,所以每个人都只会做出最好的选择。 由于这个游戏在加完星门以后的情况已经确定了,所以开始时的树的形态以及开的星门就会直接导致游戏的胜负。 那么我们可以先处理出在根的胜负。 我们…

P4037 [JSOI2008] 魔兽地图

https://www.luogu.com.cn/problem/P4037 由题目可知整个合成路径可以看作一个森林。 对于答案的统计,我们在处理完每棵树的消耗费用对应的最大力量以后,使用一个背包即可。 这样我们就可以统计出答案了。 现在问题在…

CF1970E3 Trails (Hard)

Codeforces 对于 Easy 部分的做法: 很容易想到统计下来每个点的位置,枚举到达的点,然后进行转移统计即可。 时间复杂度 \(O(m^2n)\)。 由于个人习惯,代码中的 \(n\) 和 \(m\) 与原题目不同。 代码: #include<b…

双线性四边形等参单元程序(MATLAB实现)

双线性四边形等参单元是有限元分析中最常用的二维单元之一,通过自然坐标(ξ, η)与物理坐标(x, y)的映射,实现复杂形状的单元分析。MATLAB实现,包括形函数计算、坐标变换、雅可比矩阵构建、单元刚度矩阵求解等核…

102302141_易敏亮第四次数据采集作业

课程 数据采集仓库 https://gitee.com/lisu6/data_collect/tree/master/4作业1东方财富 selenium https://gitee.com/lisu6/data_collect/tree/master/4/作业2慕课selenium https://gitee.com/lisu6/data_collect/tree…