打卡信奥刷题(3489)用C++实现信奥题 P10729 [NOISG 2023 Qualification] Dolls

P10729 [NOISG 2023 Qualification] Dolls

题目描述

Marc 正在教幼儿园的小朋友,他选择套娃来教小朋友们认识物体的大小。

一个套娃有一个自己的尺寸,记为 aaa。如果两个套娃 xxxyyy 的尺寸 axa_xaxaya_yay 可以满足 ax−ay≥2a_x-a_y\ge2axay2,那么套娃 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分值特殊性质
000000样例
111232323n≤200n\le200n200
222141414aia_iai 为奇数
333272727aia_iai 不为 444 的倍数
444363636

对于 100%100\%100% 的数据,1≤n≤100000,1≤ai≤5000001 \le n \le 100000,1 \le a_i \le 5000001n100000,1ai500000

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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值