Codeforces Round #772 (Div. 2)
A - Min Or Sum
- 签到题
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int a[N];
void solve()
{
int n;
cin>>n;
int s=0;
for(int i=1;i<=n;i++) cin>>a[i], s|=a[i];
cout<<s<<endl;
}
signed main()
{
int T=1;
cin>>T;
while(T--) solve();
}
B - Avoid Local Maximums
- 签到题
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int a[N];
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int cnt=0;
for(int i=2;i<n;i++)
{
if(a[i]>a[i-1] && a[i]>a[i+1])
{
cnt++;
a[i+1]=max(a[i],a[i+2]);
}
}
cout<<cnt<<"\n";
for(int i=1;i<=n;i++) cout<<a[i]<<' '; cout<<"\n";
}
signed main()
{
int T=1;
cin>>T;
while(T--) solve();
}
C - Differential Sorting
分析:
-
分类讨论
不成立的情况: a [ n ] > a [ n − 1 ] a[n]>a[n-1] a[n]>a[n−1] 或者 a [ n ] < 0 a[n]<0 a[n]<0( a [ x ] − a [ y ] > a [ x ] a[x]-a[y]>a[x] a[x]−a[y]>a[x] 不满足条件)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int a[N];
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int fg=0;
for(int i=2;i<=n;i++)
{
if(a[i]<a[i-1])
{
fg=1;
break;
}
}
if(!fg) cout<<0<<endl;
else
{
if(a[n-1]>a[n] || a[n]<0) cout<<-1<<endl;
else
{
cout<<n-2<<endl;
for(int i=1;i<=n-2;i++) cout<<i<<' '<<n-1<<' '<<n<<endl;
}
}
}
signed main()
{
int T=1;
cin>>T;
while(T--) solve();
}
D - Infinite Set
分析:
- 斐波那契数列,set,去重
- 单独考虑一个数x,对于由x产生的数,将x系数相等的划分为一类,可以发系数为8的个数,是系数为4的与系数为2的个数之和,即: f [ i ] = f [ i − 1 ] + f [ i − 2 ] f[i]=f[i-1]+f[i-2] f[i]=f[i−1]+f[i−2]
- 如何去重:
- 因为是大的和小的产生的数重了,将序列从小到大排
- 详见代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5, mo=1e9+7;
int a[N];
int count(int k)
{
int ans=0;
while(k)
{
ans++; k>>=1;
}
return ans;
}
set <int> st;
int f[N];
void solve()
{
int n,p;
cin>>n>>p;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
{
int x=a[i];
while(x)
{
// 由大数向小的数转换
if(st.count(x)) break;
if(x&1) x>>=1; // 即 x=2y+1
else if(x%4==0) x>>=2; // 即 x=4y
else break;
}
if(st.count(x)) continue;
st.insert(a[i]);
f[count(a[i])]++;
}
// 斐波那契
for(int i=2;i<=p;i++) f[i]=(f[i]+f[i-1]+f[i-2])%mo;
int ans=0;
for(int i=1;i<=p;i++) (ans+=f[i])%=mo;
cout<<ans<<endl;
}
signed main()
{
solve();
}