2024.11.17 Codeforces Round 988 (Div. 3)

Solved:7/7

Penalty:184

Rank(trusted):2

Rank(all):21

比赛链接

好水的 Div.3。。。甚至 G 是原题绷不住了()


A. Twice

题意:给一个序列,相同的两个数可以配对消除,求最多消除的次数。

直接开桶。

#include<bits/stdc++.h>
using namespace std;
void solve(){
int n;
cin>>n;
vector<int> c(n+1);
int ans=0;
for(int i=0,x;i<n;++i){
cin>>x,++c[x];
if(c[x]==2)c[x]=0,++ans;
}
cout<<ans<<'\n';
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int T;
cin>>T;
while(T--)solve();
}

B. Intercepted Inputs

题意:给一个 n×m 的矩阵,但其所有输入(包括 nm)都被打乱,要还原 n,m

枚举 k2 的约数看是否在输入中。

#include<bits/stdc++.h>
using namespace std;
void solve(){
int k;
cin>>k;
vector<int> c(k+1);
for(int i=0,x;i<k;++i)cin>>x,++c[x];
int m=k-2;
for(int i=1;i*i<=m;++i)if(!(m%i)){
if(i!=m/i){
if(c[i]&&c[m/i]){
cout<<i<<' '<<m/i<<'\n';
return;
}
}
else{
if(c[i]>=2){
cout<<i<<' '<<i<<'\n';
return;
}
}
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int T;
cin>>T;
while(T--)solve();
}

C. Superultra's Favorite Permutation

题意:构造一个长度为 n 的排列,使相邻两数之和为合数。

注意到偶数必为合数,而我们可以先排偶数再排奇数使只有一个位置相邻奇偶性不同(另一方面,至少有一个位置相邻奇偶性不同)。

而最小的合数为 9=4+5,故 n4 均无解。对 n5,前面放偶数后面放奇数再把 45 放到一起即可。

#include<bits/stdc++.h>
using namespace std;
void solve(){
int n;
cin>>n;
if(n<=4)cout<<"-1\n";
else{
for(int i=n/2*2;i>=6;i-=2)cout<<i<<' ';
cout<<"2 4 5 1 3 ";
for(int i=7;i<=n;i+=2)cout<<i<<' ';
cout<<'\n';
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int T;
cin>>T;
while(T--)solve();
}

D. Sharky Surfing

题意:在数轴上从 0 跳到 L,跳跃能力初始为 1。假设当前跳跃能力为 k,则你可以跳至多 k 的距离。某些区间不能落地,某些位置有加速器可以增加你的跳跃能力。问至少需要捡多少个加速器(可以经过加速器但不捡)。

按加速器的位置枚举,用大根堆维护可以捡的加速器。遇到一个区间就用加速器直到 krl+2

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define all(x) (x).begin(),(x).end()
void solve(){
int n,m,L;
cin>>n>>m>>L;
vector<int> l(n),r(n);
vector<pii> a(m);
for(int i=0;i<n;++i)cin>>l[i]>>r[i];
for(int i=0;i<m;++i)cin>>a[i].first>>a[i].second;
sort(all(a));
++m,a.push_back({L,0});
priority_queue<int> pq;
int res=0;
ll sum=1;
for(int i=0,j=0;i<m;++i){
while(j<n&&a[i].first>=l[j]){
while(i<m&&a[i].first<=r[j])++i;
while(!pq.empty()&&sum<r[j]-l[j]+2)sum+=pq.top(),pq.pop(),++res;
if(sum<r[j]-l[j]+2){cout<<"-1\n";return;}
++j;
}
pq.push(a[i].second);
}
cout<<res<<'\n';
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int T;
cin>>T;
while(T--)solve();
}

E. Kachina's Favorite Binary String

题意:交互题。你要猜一个长度为 n 字符串(n 给定),每次可以询问它的某个子串有多少个子序列为01。最多询问 n 次。

依次询问 (1,2),(1,3),,(1,n)。答案比上一次询问多则这一位是 1 否则是 0

设第一个非 0 的位(设为 p)答案是 k,则前面是 pk11k0

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define all(x) (x).begin(),(x).end()
int qry(int l,int r){
cout<<"? "<<l<<' '<<r<<endl;
int x;
cin>>x;
return x;
}
void solve(){
int n;
cin>>n;
int pos=0,now=0,z=0;
string ans;
ans.resize(n);
for(int i=2;i<=n;++i){
int nxt=qry(1,i);
if(nxt>now){
ans[i-1]='1';
if(!pos)pos=i,z=nxt;
}
else ans[i-1]='0';
now=nxt;
}
if(!pos){cout<<"! IMPOSSIBLE"<<endl;return;}
for(int i=1;i<=pos-z-1;++i)ans[i-1]='1';
for(int i=pos-z;i<=pos-1;++i)ans[i-1]='0';
cout<<"! "<<ans<<endl;
}
int main(){
int T;
cin>>T;
while(T--)solve();
}

F. Ardent Flames

题意:有 n 个敌人,第 i 个敌人位置为 xi 血量为 hi。你可以向同一个位置 p 扔若干个炸弹,每个炸弹会对位置为 x 的敌人造成 max{0,m|px|} 的伤害。求消灭 k 个敌人所需最少的炸弹数。

二分答案,设扔了 w 个炸弹,则第 i 个敌人需要被每个炸弹造成 ti=hiw 的伤害。那么消灭这个敌人需要炸弹落在 [xi(mti),xi+(mti)] 之间的位置(ti>m 则无法消灭)。

问题转化为给 n 个区间问是否存在一个位置被覆盖 k 次。离散化+差分即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define all(x) (x).begin(),(x).end()
void solve(){
int n,m,k;
cin>>n>>m>>k;
vector<int> h(n),x(n);
for(int i=0;i<n;++i)cin>>h[i];
for(int i=0;i<n;++i)cin>>x[i];
auto chk=[&](int w)->bool {
vector<int> t(n),buc;
for(int i=0;i<n;++i){
t[i]=(h[i]+w-1)/w;
if(t[i]<=m){
buc.push_back(x[i]-m+t[i]);
buc.push_back(x[i]+m-t[i]+1);
}
}
sort(all(buc));
buc.resize(unique(all(buc))-buc.begin());
vector<int> c(buc.size());
for(int i=0;i<n;++i){
if(t[i]<=m){
int l=lower_bound(all(buc),x[i]-m+t[i])-buc.begin();
int r=lower_bound(all(buc),x[i]+m-t[i]+1)-buc.begin();
++c[l],--c[r];
}
}
for(int i=1;i<buc.size();++i)c[i]+=c[i-1];
for(int i=0;i<buc.size();++i)if(c[i]>=k)return 1;
return 0;
};
int l=1,r=1e9,ans=-1;
while(l<=r){
int mid=(l+r)>>1;
if(chk(mid))ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans<<'\n';
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int T;
cin>>T;
while(T--)solve();
}

G. Natlan Exploring

原题:这场的 J

posted @   EssnSlaryt  阅读(903)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示