wxy 3.21 牛客练习赛54 重现

v>

4969
A
&符号,一般取决于1个数稍等那一个,画出n^2图,找一下瑰丽就可以知道了
B
全部写出来即可找到规律,T了的话,可以剪枝,把小的那一些直接输出,不计算
C
排序,把一样的放在一起,也可认为是排序,和排序,位置有关的只要是复杂度允许都可以想到逆序对
问题。逆序对原本就是顺序逆过来的对数,和一些转一次数挂钩应该不难想,应该把这两者建立起联
系。
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=2e5+100;
int a[MAXN],b[MAXN];
char s[MAXN];
LL cnt=0,ans=1e18;
void merge(int l,int r)
{
if(l>=r) return ;
int mid=(l+r)>>1;
merge(l,mid);
merge(mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r){
if(a[i]<=a[j]) b[k++]=a[i++];
else b[k++]=a[j++],cnt+=mid-i+1;
}
while(i<=mid) b[k++]=a[i++];
while(j<=r) b[k++]=a[j++];
for(int ii=0;ii<k;ii++) a[ii+l]=b[ii];
return ;
}
int main()
{
scanf("%s",s+1);
int len=strlen(s+1);
map<char,int> mp;
mp['A']=0,mp['C']=1,mp['T']=2,mp['G']=3;
int ch[]={0,1,2,3};
sort(ch,ch+4);
do{
for(int i=1;i<=len;++i){
a[i]=ch[mp[s[i]]];
b[i]=0;
}D
待补
F
待补
cnt=0;
merge(1,len);
ans=min(ans,cnt);
}while(next_permutation(ch,ch+4));
printf("%lld\n",ans);
return 0;
}
posted @ 2022-02-27 13:37  fengzlj  阅读(28)  评论(0)    收藏  举报