Codeforces Round 1022 (Div. 2) A-C
总体来说前三题比正常难度简单,后三题比正常难度难,且D是个交互。
所以就基本是手速场了,就看ABC过的速度。
A. Permutation Warm-Up
猜结论
观察样例guess一下,比如1234
就是反转序列,4321,再给每一位相减的和的绝对值/2+1.
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int n;
cin>>n;
int ans=0;
for(int i=1;i<=n;i++){
ans+=abs(n-i+1-i);
}
cout<<ans/2+1<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
return 0;
}
B. SUMdamental Decomposition
位运算+乱搞
主要就是让凑出来的每一个数的二进制位中,只有一个1.
赛时写了依托,缝缝补补到最后都不知道前面的思路是什么,反正就是过了hh
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int n,x;
cin>>n>>x;
if(n==1 && x==0){
cout<<-1<<endl;
return;
}
int cnt1=0;
int ans=0;
int tmp=x;
int cnt=0;
int mul=1;
while(tmp){
if(tmp&1){
cnt++;
ans+=mul;
if(mul!=1) cnt1++;
}
mul*=2;
tmp/=2;
}
int diff=n-cnt;
tmp=n;
// cout<<"ans: "<<ans<<endl;
if(cnt>=n){
cout<<ans<<endl;
return;
}
// cout<<"diff: "<<diff<<endl;
if((diff%2)==0){
ans+=diff;
cout<<ans<<endl;
return;
}else{
ans+=diff-1;
if(cnt1){
cout<<ans+2<<endl;
return;
}
int i=0;
bool f=0;
if(diff>1) f=1;
while(1){
if(((x>>i)&1) || f){
f=0;
i++;
}
else{
ans+=2*(1<<i);
// cout<<"2*(1<<i) "<<i<<endl;
cout<<ans<<endl;
return;
}
}
}
cout<<"false"<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
return 0;
}
C. Neo's Escape
思路更是显然,只要统计数组中先递增再递减的连续数的个数。比如 1 2 3 2 1就是一个
实现有很多中方法,赛时写了码量最大的双向量表,绷不住了明明有更简单的写法的,有写了依托。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int n;
cin>>n;
vector<int> a(n+10),ne(n+10),pr(n+10);
vector<pii> pos;
for(int i=1;i<=n;i++){
cin>>a[i];
ne[i]=i+1;
pr[i]=i-1;
pos.push_back({a[i],i});
}
ne[n]=0;
pr[1]=0;
sort(pos.begin(),pos.end(),greater<pii>());
int sum=n;
int ans=0;
for(auto [val,idx]:pos){
// cout<<"entry: "<<idx<<endl;
if(a[idx]==-1) continue;
sum--;
ans++;
// cout<<"ans++"<<endl;
while(1){
int tar=0;
int taridx=0;
if(ne[idx]){
if(a[ne[idx]]>tar && val>=a[ne[idx]]){
tar=a[ne[idx]];
taridx=ne[idx];
}
}
if(pr[idx]){
if(a[pr[idx]]>tar && val>=a[pr[idx]]){
tar=a[pr[idx]];
taridx=pr[idx];
}
}
if(tar<=0) break;
if(taridx==ne[idx]){
pr[taridx]=pr[idx];
ne[pr[idx]]=taridx;
}else if(taridx==pr[idx]){
ne[taridx]=ne[idx];
pr[ne[idx]]=pr[idx];
}
a[idx]=-1;
sum--;
idx=taridx;
val=tar;
a[taridx]=-1;
// cout<<taridx<<" ";
}
if(sum==0){
a[idx]=-1;
break;
}
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
return 0;
}

浙公网安备 33010602011771号