2025.1.20 IAEPC Preliminary Contest (Codeforces Round 999, Div. 1 + Div. 2)

比赛链接

Solved: 6/11

Rank: fst,寄!

B 先读错题再 fst,绷不住了。。。


A. Kevin and Arithmetic

题意:给一个序列,初始 \(s=0\)。对 \(i=1,\dots,n\) 依次进行如下操作:\(s\leftarrow s+a_i\),然后若 \(s\) 为偶数则分数 +1 并不断除 2 直到 \(s\) 为奇数。重排序列使得分数最高。

偶数除了第一个以外其他都不会产生贡献,答案就是奇数个数加 1。特判所有数都是奇数的情况。

void solve(){int n;cin>>n;vector<int> a(n);cin>>a;int cnt=0;for(int i=0;i<n;++i)if(a[i]&1)++cnt;cout<<(n==cnt?n-1:cnt+1)<<'\n';
}

B. Kevin and Geometry

题意:给 \(n\) 个数,选出其中 4 个数使得它们可以组成等腰梯形。

设四条边长度为 \(a,b,c,c\),且 \(a<b\),则充要条件是 \(b-a<2c\)

将所有数排序后枚举相等的数 \(c\),判断剩下的数里是否有差小于 \(2c\) 的两个数即可。这个可以用差分数组前后缀的 min 做。

fst 因:没考虑 \(a<c<b\) 的情况!

void solve(){int n;cin>>n;vector<int> a(n);cin>>a;sort(all(a));vector<int> b(n-1);for(int i=0;i<n-1;++i)b[i]=a[i+1]-a[i];vector<int> p(n-1),s(n-1);for(int i=0;i<n-1;++i){if(i==0)p[i]=b[i];else p[i]=min(p[i-1],b[i]);}for(int i=n-2;i>=0;--i){if(i==n-2)s[i]=b[i];else s[i]=min(s[i+1],b[i]);}for(int i=0;i<=n-2;++i)if(a[i]==a[i+1]){if(i>1&&p[i-2]<a[i]*2){for(int j=0;j<=i-2;++j)if(b[j]==p[i-2]){cout<<a[j]<<' '<<a[j+1]<<' '<<a[i]<<' '<<a[i+1]<<'\n';return;}}if(i<n-3&&s[i+2]<a[i]*2){for(int j=n-2;j>=i+2;--j)if(b[j]==s[i+2]){cout<<a[j]<<' '<<a[j+1]<<' '<<a[i]<<' '<<a[i+1]<<'\n';return;}}if(i>=1&&i<=n-3&&a[i+2]-a[i-1]<a[i]*2){cout<<a[i-1]<<' '<<a[i]<<' '<<a[i+1]<<' '<<a[i+2]<<'\n';return;}}cout<<"-1\n";
}

C. Kevin and Puzzle

题意:\(n\) 个人站成一排,其中有一部分人是说谎者。每个人会给出站在自己左侧的说谎者的数量 \(a_i\),说谎者提供的 \(a_i\) 不可信(不一定错误),相邻两个人不可能都是说谎者。问这 \(n\) 个人的身份的方案数。

dp,\(f(i,0/1)\) 表示 \(i\) 说真话/假话的方案数。如果 \(i\) 说真话,需要 \(a_i=a_{i-1}\)\(i-1\) 真)或 \(a_i=a_{i-2}+1\)\(i-1\) 假)。

void solve(){int n;cin>>n;vector<int> a(n+1);for(int i=1;i<=n;++i)cin>>a[i];vector<array<ll,2>> f(n+1);f[0][0]=1;for(int i=1;i<=n;++i){if(a[i]==a[i-1])f[i][0]=(f[i][0]+f[i-1][0])%mod;if(i==1||a[i]==a[i-2]+1)f[i][0]=(f[i][0]+f[i-1][1])%mod;f[i][1]=(f[i][1]+f[i-1][0])%mod;}cout<<(f[n][0]+f[n][1])%mod<<'\n';
}

D. Kevin and Numbers

题意:给两个集合 \(A\)\(B\)。每次可以在 \(A\) 中选择两个差不超过 \(1\) 的数合并为它们的和,问能否变成 \(B\)

逆向思考。如果 \(B\) 的最大值 \(x\)\(A\) 中不存在,那么它一定是通过 \(\lfloor \frac x2\rfloor\)\(\lceil \frac x2\rceil\) 合成得到的。如果存在,则一定是 \(A\) 中相同的数直接保留。

用 multiset 模拟这个逆向过程即可。

bool solve(){int n,m;cin>>n>>m;multiset<int> a,b;ll s=0;for(int i=0,x;i<n;++i)cin>>x,a.insert(x),s+=x;for(int i=0,x;i<m;++i)cin>>x,b.insert(x),s-=x;if(s)return false;while(a.size()&&b.size()){int x=*a.rbegin(),y=*b.rbegin();if(x>y)return false;if(x==y){a.erase(a.find(x));b.erase(b.find(y));}else{b.erase(b.find(y));b.insert(y/2);b.insert((y+1)/2);}}return a.empty()&&b.empty();
}

E. Kevin and And

题意:有两个集合 \(A\)\(B\)。你可以做 \(k\) 次操作,每次选择 \(a_i\in A, b_j\in B\) 并令 \(a_i\leftarrow a_i\& b_j\)。问操作结束后 \(A\) 所有数之和的最小值。\(n\leq 10^5,m\leq 10\)

首先可以 \(O(n2^m)\) 求出 \(A\) 中每个数做 \(1\)\(10\) 次操作得到的最小值。对于单个 \(i\),操作的收益是单调减的,因此可以用堆维护这个操作过程。复杂度 \(O(n2^m+k\log n)\)

const int N=1e5+5,M=10;
int n,m,q,d[N];
ll a[N],b[M],c[1<<M],f[N][M+1];
void solve(){cin>>n>>m>>q;for(int i=1;i<=n;++i)cin>>a[i];for(int i=0;i<m;++i)cin>>b[i];for(int i=0;i<1<<m;++i){c[i]=(1<<30)-1;for(int j=0;j<m;++j)if(i>>j&1)c[i]&=b[j];}for(int i=1;i<=n;++i){for(int j=0;j<=m;++j)f[i][j]=0;for(int j=0;j<1<<m;++j){int k=__builtin_popcount(j);f[i][k]=max(f[i][k],a[i]-(a[i]&c[j]));}}priority_queue<pll> pq;ll ans=0;for(int i=1;i<=n;++i)pq.push({f[i][1],i}),ans+=a[i],d[i]=0;while(q--){int i=pq.top().second;ans-=pq.top().first;pq.pop();++d[i];if(d[i]<m)pq.push({f[i][d[i]+1]-f[i][d[i]],i});}cout<<ans<<'\n';
}

F1. Kevin and Binary String (Easy Version)

题意:给定 01 串 \(s,t\),每次可以交换 \(s\) 相邻的极长 0 连续段和极长 1 连续段,求最少交换次数使 \(s\) 变成 \(t\)。若无法做到则输出 -1

首先在 \(s\)\(t\) 的开头都插入一个 \(t_1\),结尾都插入一个 \(t_n\),答案不变。

插入之后,每次操作都恰好会减少两个极长连续段。因此答案就是极长连续段数之差除 2。我们只需判断能否做到。

\(s\) 的极长连续段长为 \(a_1,\dots,a_m\)。如果我们交换 \(s\) 的第 \(i\) 段和第 \(i+1\) 段,实际上就是令 \(a_i\leftarrow a_i+a_{i+2}, a_{i+1}\leftarrow a_{i+1}+a_{i+3}\)
因此直接在 \(s\)\(t\) 的极长连续段长序列上双指针枚举,如果相等就匹配,如果不相等就尝试交换操作。

如果你 WA4 了,请注意 \(a_i\)\(b_j\) 匹配上了并不代表 \(a_{i+1}\) 也要和 \(b_{j+1}\) 匹配。

const int N=4e5+5;
int n,m1,m2,a[N],b[N];
string s,t;
int solve(){cin>>s>>t;n=s.length();char u=t[0],v=t[n-1];s=u+s+v,t=u+t+v,n+=2;int len=0;m1=m2=0;for(int i=0;i<n;++i){if(i>0&&s[i]!=s[i-1])a[++m1]=len,len=1;else ++len;}a[++m1]=len;len=0;for(int i=0;i<n;++i){if(i>0&&t[i]!=t[i-1])b[++m2]=len,len=1;else ++len;}b[++m2]=len;int i=1,j=1;while(j<=m2){if(i>m1)return -1;if(b[j]<a[i])return -1;if(b[j]==a[i]){++i,++j;continue;}if(i==m1)return -1;int x=a[i],y=a[i+1];if(j+1<=m2){while(i+3<=m1){x+=a[i+2],y+=a[i+3],i+=2;if(x>b[j])return -1;if(x==b[j])break;}if(x==b[j])++i,++j,a[i]=y;else return -1;}else return -1;}if(i>m1)return (m1-m2)/2;else return -1;
}

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

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

相关文章

dotnet 6 InterpolatedStringHandler 构造函数的 out 参数有什么意义

根据微软的官方文档可以了解到,编写一个自定义的 InterpolatedStringHandler 时,可以在构造方法的参数里面带上一个 out 的布尔参数。本文将来和大家介绍这个布尔参数的作用根据 探索 C# 字符串内插处理程序 - C# - Microsoft Learn 文档可以知道,在文档的最后一步介绍了在构…

读量子霸权10量子健康

量子计算机或颠覆医疗领域,加速新抗生素、疫苗研发,预警病毒,助力免疫系统研究,对抗癌症等难治之症。1. 量子健康 1.1. 在人类历史的大部分时间里,人类的平均预期寿命徘徊在20岁到30岁之间 1.2. 纵观人类历史,医生好像一直在扮演庸医和江湖骗子的角色,浮夸地提供所谓的“…

怎么让div中的图片和文字同时上下居中?

在前端开发中,有多种方法可以让一个 div 中的图片和文字同时上下居中。以下是一些常见的方法: 1. 使用 Flexbox Flexbox 是一个非常强大的布局模型,可以很容易地实现元素的居中。 <div class="container"><img src="image.jpg" alt="Imag…

3D NAND中基于图的近似最近邻搜索的Proxima近存储加速(下)

D.动态名单和提前终止 我们提出了一种动态列表和提前终止策略,以在图遍历过程中利用这些信息,如算法1所示。我们观察到,大多数查询在较小的T(候选列表大小)处收敛(找到它们的真实k-NN)。进一步增加T不会提高这些查询的召回率,只会增加计算成本。图6-(a)显示了DiskANN…

3D NAND中基于图的近似最近邻搜索的Proxima近存储加速(上)

3D NAND中基于图的近似最近邻搜索的Proxima近存储加速 摘要——近似最近邻搜索(ANNS)在各种应用中起着不可或缺的作用,包括推荐系统、信息检索和语义搜索。在尖端的ANNS算法中,基于图的方法在海量数据集上提供了卓越的准确性和可扩展性。然而,性能最好的基于图的ANN搜索解…

软件工程中的经验方法笔记

第一讲中上:收集数据(比如挖掘数据,etc)。 右中:分析数据:收集了数据自然要分析。定量:计算 定性:理解人们在说什么。 中下:解释数据:从数据科学的分析结果到软件工程方面的信息,我们需要知道某个特定的变量对整个软件工程的影响。 左中:干预、推荐:通过软件工程方…

推荐4书《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》,谢谢

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

【CodeForces训练记录】Codeforces Round 999, Div. 1 + Div. 2

训练情况 赛后反思 幽默A题WA了两发,B题在努力回忆set里面怎么upper_bound,开完两道就在罚坐了 A题 简单的性质:偶数+偶数=偶数,奇数+奇数=偶数,奇数+偶数=奇数,每次除完保证是奇数,所以我们只需要把偶数扔到第一个,接下来全部是奇数,答案是奇数个数加一,如果没有奇数…

Hyper-V中如何调整Ubuntu22虚拟机的分辨率

转载:Hyper-V中如何调整Ubuntu22虚拟机的分辨率 - 知乎 使用win10中的hyper-v安装ubuntu22,发现分辨率过低并且在ubuntu内无法调整display settings。以下为此问题的解决方法: 步骤:修改ubuntu系统中的grub文件; 在win10中,设置Hyper-v修改ubuntu系统中的grub文件 在ubun…

【算法部署】工具下篇

一、算法部署简介算法部署任务是将已开发的算法模型应用到实际场景中去的过程。这个过程通常需要在计算机、服务器或其它硬件设备上面运行算法模型,并编写一些代码来调用模型。任何模型其实都会涉及到模型部署任务,其实你在调用现成的API接口做推理的过程也可以叫做模型部署。…

【算法部署】工具上篇

算法部署简介算法部署任务是将已开发的算法模型应用到实际场景中去的过程。这个过程通常需要在计算机、服务器或其它硬件设备上面运行算法模型,并编写一些代码来调用模型。任何模型其实都会涉及到模型部署任务,其实你在调用现成的API接口做推理的过程也可以叫做模型部署。模型…