Codeforces Round 940 (Div. 2) and CodeCraft-23 题解
Codeforces Round 940 (Div. 2) and CodeCraft-23 题解
A. Stickogon 贪心
#include<bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;
typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 1;
void Showball(){
int n;
cin>>n;
vector<int> a(101);
for(int i=0;i<n;i++){
int x;
cin>>x;
a[x]++;
}
int ans=0;
for(int i=1;i<=100;i++) ans+=a[i]/3;
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T=1;
if(cases) cin>>T;
while(T--)
Showball();
return 0;
}
B. A BIT of a Construction 贪心
题意:给你
思路:为了让1的数量最多,我们直接取最接近
void Showball(){
int n,k;
cin>>n>>k;
if(n==1) return cout<<k<<endl,void();
int t=__lg(k);
int sum=(1<<t)-1;
cout<<sum<<" "<<k-sum<<" ";
if(n==2) return cout<<endl,void();
for(int i=3;i<=n;i++) cout<<0<<" \n"[i==n];
}
C.How Does the Rook Move? DP|递推
题意:在一个
思路:首先我们注意到,棋子一共只有两种走法,落在对称轴和非对称轴的方式。
并且棋子位置并不重要,我们可以平移。那么对于落在对称轴的情况,棋盘会变成
,只有一种情况。对于落在非对称轴的情况,期盼会变成
对于一开始的落子情况,我们只需要维护好棋盘规模即可。
int f[N];
void init(){
f[0]=1;
f[1]=1;
for(int i=2;i<N;i++){
f[i]=(f[i-1]+2LL*(i-1)*f[i-2])%mod;
}
}
void Showball(){
int n,k;
cin>>n>>k;
while(k--){
int x,y;
cin>>x>>y;
if(x==y) n--;
else n-=2;
}
int ans=f[n];
cout<<ans<<endl;
}
D. A BIT of an Inequality 拆位+算贡献+DP
题意:求出满足下列条件的三元组
其中
思路:
看到异或数数题,经典的拆位+算贡献,前天小白月赛F题刚做过,这题稍微难一些。
根据异或的性质,右边比左边多异或一个
根据2进制的性质,最高位1的影响会超过后面所有1的影响,因此我们只需要处理
设最高位
数量之和要为奇数。
问题转变成求出维护左右两每一位奇/偶个1的区间数量。
不妨定义
如果当前位为
反之,奇区间和偶区间数量不会互换,当前位自己构成一个偶区间。
同理维护出从
最后拆位,枚举
int s1[N][31][2];//从i个数往前选第j位 奇/偶个1的区间数
int s2[N][31][2];//从i个数往后选第j位 奇/偶个1的区间数
void Showball(){
int n;
cin>>n;
vector<int> a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=0;i<=n+1;i++){
for(int j=0;j<=30;j++){
s1[i][j][0]=s1[i][j][1]=0;
s2[i][j][0]=s2[i][j][1]=0;
}
}
for(int i=0;i<=30;i++){
for(int j=1;j<=n;j++){
if(a[j]>>i&1){
s1[j][i][1]=s1[j-1][i][0]+1;
s1[j][i][0]=s1[j-1][i][1];
}else{
s1[j][i][1]=s1[j-1][i][1];
s1[j][i][0]=s1[j-1][i][0]+1;
}
}
for(int j=n;j>=1;j--){
if(a[j]>>i&1){
s2[j][i][1]=s2[j+1][i][0]+1;
s2[j][i][0]=s2[j+1][i][1];
}else{
s2[j][i][1]=s2[j+1][i][1];
s2[j][i][0]=s2[j+1][i][0]+1;
}
}
}
LL ans=0;
for(int i=1;i<=n;i++){
int t=__lg(a[i]);
ans=(ans+1LL*s1[i-1][t][1]*(1+s2[i+1][t][0]));
ans=(ans+1LL*(s1[i-1][t][0]+1)*s2[i+1][t][1]);
}
cout<<ans<<endl;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】