P10729 [NOISG 2023 Qualification] Dolls
题目描述
Marc 正在教幼儿园的小朋友,他选择套娃来教小朋友们认识物体的大小。
一个套娃有一个自己的尺寸,记为 aaa。如果两个套娃 xxx 和 yyy 的尺寸 axa_xax 和 aya_yay 可以满足 ax−ay≥2a_x-a_y\ge2ax−ay≥2,那么套娃 yyy 可以放在套娃 xxx 中。
很显然,套娃之间是可以互相嵌套多层的。于是 Marc 想请你回答一些问题:
这些问题持续 nnn 天。在第 iii 天,Marc 购买了一个大小为 aia_iai 的套娃。他想请你求出,在买完第 iii 个套娃后,他用前 iii 个套娃最多可以套多少层。
输入格式
第一行,一个正整数 nnn。
第二行 nnn 个整数,表示 aaa。
输出格式
一行 nnn 个正整数,第 iii 个表示用前 iii 个套娃最多能套多少层。
输入输出样例 #1
输入 #1
5
1 2 3 4 5
输出 #1
1 1 2 2 3
输入输出样例 #2
输入 #2
5
2 4 6 8 10
输出 #2
1 2 3 4 5
输入输出样例 #3
输入 #3
5
3 3 1 3 2
输出 #3
1 1 2 2 2
说明/提示
【数据范围】
| Subtask\text{Subtask}Subtask | 分值 | 特殊性质 |
|---|---|---|
| 000 | 000 | 样例 |
| 111 | 232323 | n≤200n\le200n≤200 |
| 222 | 141414 | aia_iai 为奇数 |
| 333 | 272727 | aia_iai 不为 444 的倍数 |
| 444 | 363636 | 无 |
对于 100%100\%100% 的数据,1≤n≤100000,1≤ai≤5000001 \le n \le 100000,1 \le a_i \le 5000001≤n≤100000,1≤ai≤500000。
C++实现
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
inline int read(){
register int x=0,f=1;
char c=getchar();
while(c<'0' || '9'<c) f=(c=='-')?-1:1,c=getchar();
while('0'<=c && c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar();
return x*f;
}
const int N=500010;
int n,f[N],ans,sz[N];
bool vis[N];
inline int find(int x){ return f[x]=f[x]==x?x:find(f[x]);}
inline void un(int x,int y){
int fx=find(x),fy=find(y);
if(fx==fy) return;
f[fx]=fy;
sz[fy]+=sz[fx];
}
int main()
{
for(int i=1;i<=500000;i++) f[i]=i,sz[i]=1;
n=read();
for(int i=1,x;i<=n;i++){
x=read();
if(vis[x]) {printf("%d ",ans);continue;}
vis[x]=true;
if(!vis[x+1] && !vis[x-1]) ans++;
else if(!vis[x+1]) un(x-1,x),ans+=sz[find(x)]%2;
else if(!vis[x-1]) un(x,x+1),ans+=sz[find(x)]%2;
else{
int f1=find(x-1),f2=find(x+1);
ans-=(sz[f1]+1)/2+(sz[f2]+1)/2;//消除影响
un(x-1,x),un(x,x+1);
ans+=(sz[find(x)]+1)/2;//再次计算贡献
}
printf("%d ",ans);
}
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
2047

被折叠的 条评论
为什么被折叠?



