CF786C Till I Collapse
题外话#
根分纸张第一次自己做出根分虽然很水,纪念一下。
#
题意#
给定一个长度为
Difficulty:*2400
题解#
条件是关于不同数字的个数,看起来很奇怪。
要对于
但它长得很像二分,也有点像
这么多神秘的奇怪点,那估计是根分罢(大雾。
考虑给定一个
考虑发掘一下答案的性质,或者说答案和
有了这个式子之后做法其实就比较显然了。
设置一个阈值
对于 check
部分可以直接套用前面的
这么看来这题是不是确实挺水的/kuk
时间复杂度为
#
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
#define re register
const int N=100100;
int n,a[N],T,lgn,sq,fnans[N],cnt[N],res;
il int read(){
re int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*f;
}
il void Add(int x){
if(!cnt[x])res++;
cnt[x]++;
}
il void Del(int x){
cnt[x]--;
}
il int solve(int k){
int tot=0,l=1,r=0;
for(re int i=1;i<=n;i++)cnt[i]=0;
res=0;
while(l<=n){
if(r<n){
Add(a[++r]);
if(res>k){
tot++;
int tmp=r;
while(l<=r)Del(a[l++]);
res=0,l=tmp,r=l-1;
}
}
else{
tot++;
break;
}
}
return tot;
}
il bool check(int m,int k){
return solve(k)<=m;
}
int main(){
n=read();
T=sqrt(max(n,n*__lg(n)));
for(re int i=1;i<=n;i++)a[i]=read();
for(re int k=1;k<=T;k++)fnans[k]=solve(k);
int T0=n/T;
if(n%T)T0++;
int lst=n+1;
for(re int m=1;m<=T0;m++){
int l=1,r=n,mid,ans;
while(l<=r){
if(check(m,mid=(l+r)>>1))ans=mid,r=mid-1;
else l=mid+1;
}
for(re int i=ans;i<lst;i++)
if(!fnans[i])fnans[i]=m;
lst=ans;
}
for(re int i=1;i<=n;i++)cout<<fnans[i]<<' ';
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)