Codeforces Round #751 (Div. 2) A B C
A.Two Subsequences
- 思路:找到一个字典序最小的单个字符当a,另外剩余部分当b。
- 参考代码:
#include<bits/stdc++.h>
using namespace std;
using ll=long long ;
#define snow ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
void solve(){
string s;
cin>>s;
string a,b;
char x='z';
int idx=-1;
for(int i=0;i<s.size();i++){
if(s[i]<=x){x=s[i];idx=i;}
}
cout<<x<<' ';
for(int i=0;i<s.size();i++){
if(i!=idx)b+=s[i];
}
cout<<b<<endl;
}
int main(){
snow;
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
B.Divine Array
- 思路:因为数据保证所有的n不大于2000,q不大于100000,那么我们只需要每个t的开始预处理一下n,然后使q进行O(1)复杂度即可。如果不提前处理,反而在q中处理,那么每个查询都处理一便时间复杂度会爆炸。这题思路还是满简单的,对于本弱鸡来说不是很好写。
- 参考代码:
#include<bits/stdc++.h>
using namespace std;
using ll=long long ;
#define snow ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int N=2010;
int a[N];
int b[N][2010];
int c[N];
void solve(){
int n;
cin>>n;
unordered_map<int,int>S;
for(int i=0;i<n;i++){cin>>a[i];b[0][i]=a[i];S[a[i]]++;}
int cs=0;
for(int i=1;i<=20;i++){
for(int j=0;j<n;j++){
c[j]=a[j];
}
for(int j=0;j<n;j++){
b[i][j]=S[a[j]];
}
S.clear();
for(int j=0;j<n;j++){
a[j]=b[i][j];
S[a[j]]++;
}
int res=0;
for(int j=0;j<n;j++){
if(c[j]==a[j])res++;
}
if(res==n)break;
cs++;
}
int q;
cin>>q;
while(q--){
int x,y;
cin>>x>>y;
if(y>=cs){
cout<<b[cs][x-1]<<endl;
}
else{
cout<<b[y][x-1]<<endl;
}
}
}
int main(){
snow;
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
C.Array Elimination
- 思路:感觉题目一开始还是蛮难理解的,发现本质其实这题就不难了,因为是任选k个数进行一次操作,每次操作减去选中的k个数的与值。那么很容易发现只有当选中的k个数的某一位是1的个数和是k,那么这个位才能与得到1,同时这k个数共同减去这一位的1,共同使这一位变成0(可能是好几位是1的个数和都是k,那么自然这几位都会变成0),所以本题会发现,其实真正能改变值的大小的是那些选中的k个数的某些位独立和为k(k个1),所以我们只要将所有数的二进制每一位的个数和统计一下。如果出现存进的个数%k!=0说明该组数无法通过分组k来变成0,反之可以。
- 参考代码:
#include<bits/stdc++.h>
using namespace std;
#define snow ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int N=2e5+10;
int a[N];
int cun[35];
int main(){
snow;
int t;
cin>>t;
while(t--){
memset(cun,0,sizeof cun);
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
int cnt=0;
while(a[i]){
if(a[i]&1)cun[cnt]++;
cnt++;
a[i]>>=1;
}
}
for(int i=1;i<=n;i++){
bool success=true;
for(int j=0;j<=30;j++){
if(cun[j]%i!=0)success=false;
}
if(success)cout<<i<<' ';
}
cout<<endl;
}
return 0;
}