最接近神的人 reverse

xiaoxiao2021-02-28  76

最接近神的人 reverse 【题目描述】: 破解了符文之语,小FF开启了通往地下的道路。当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案。而石门上方用古代文写着“神的殿堂”。小FF猜想里面应该就有王室的遗产了。但现在的问题是如何打开这扇门…… 仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的。而最聪明的人往往通过一种仪式选拔出来。仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即交换序列中相邻的两个元素。而用最少的交换次数使原序列变成不下降序列的人即是下一任智者。 小FF发现门上同样有着n个数字。于是他认为打开这扇门的秘诀就是找到让这个序列变成不下降序列所需要的最小次数。但小FF不会……只好又找到了你,并答应事成之后与你三七分……

附AC代码:

#include<iostream> #include<stdio.h> #include<stdlib.h> #include<algorithm> #define MAXN 40000 using namespace std; struct A{ int fx,id; }c[MAXN+5]; int n; long long ans=0; int a[MAXN+5],b[MAXN+5]; int cmp(const void *x,const void *y){ return ((struct A *)x)->fx-((struct A *)y)->fx; } int lowbit(int x){return x&(-x);} void update(int x,int v){ int i; for(i=x;i<=n;i+=lowbit(i)) a[i]+=v; } int sum(int x){ int s=0,i; for(i=x;i>=1;i-=lowbit(i)) s+=a[i]; return s; } int main(){ int i,j; freopen("reverse.in","r",stdin); freopen("reverse.out","w",stdout); scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&c[i].fx); c[i].id=i; } qsort(c+1,n,sizeof(c[0]),cmp); for(i=1;i<=n;i++){ b[c[i].id]=i; a[i]=0; } for(i=n;i>=1;i--){ ans+=sum(b[i]-1); update(b[i],1); } printf("%lld",ans); return 0; }

转载请注明原文地址: https://www.6miu.com/read-85050.html

最新回复(0)