2025.1.20 IAEPC Preliminary Contest (Codeforces Round 999, Div. 1 + Div. 2)
Solved: 6/11
Rank: fst,寄!
B 先读错题再 fst,绷不住了。。。
A. Kevin and Arithmetic
题意:给一个序列,初始
偶数除了第一个以外其他都不会产生贡献,答案就是奇数个数加 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
题意:给
设四条边长度为
将所有数排序后枚举相等的数
fst 因:没考虑
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"; }
upd: 其实只要令
C. Kevin and Puzzle
题意:
dp,
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
题意:给两个集合
逆向思考。如果
用 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
题意:有两个集合
首先可以
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 串
首先在
插入之后,每次操作都恰好会减少两个极长连续段。因此答案就是极长连续段数之差除 2。我们只需判断能否做到。
设
因此直接在
如果你 WA4 了,请注意
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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!