cf351B Jeff and Furik (树状数组)

逆序对数=0的时候,这个数列是有序的

然后交换相邻的,看哪个比较大,逆序对数会加1或减1

Jeff用的是最优策略所以他肯定让逆序对数-1

设f[i]表示Jeff操作前,逆序对数为i,最终的期望次数

那就有$f[i]=0.5f[i-2]+0.5f[i]+2$

以及$f[1]=1,f[0]=0$

可以得出$f[i]=4*floor(i/2)+(i\&1)$

 1 #pragma GCC optimize(3)
 2 #include<bits/stdc++.h>
 3 #define pa pair<ll,ll>
 4 #define CLR(a,x) memset(a,x,sizeof(a))
 5 using namespace std;
 6 typedef long long ll;
 7 const int maxn=3050;
 8 
 9 inline char gc(){
10     return getchar();
11     static const int maxs=1<<16;static char buf[maxs],*p1=buf,*p2=buf;
12     return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxs,stdin),p1==p2)?EOF:*p1++;
13 }
14 inline ll rd(){
15     ll x=0;char c=gc();bool neg=0;
16     while(c<'0'||c>'9'){if(c=='-') neg=1;c=gc();}
17     while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=gc();
18     return neg?(~x+1):x;
19 }
20 
21 int N,a[maxn];
22 int tr[maxn];
23 
24 inline int lowbit(int x){return x&(-x);}
25 inline void add(int x,int y){
26     for(;x<=N;x+=lowbit(x)) tr[x]+=y;
27 }
28 inline int query(int x){
29     int re=0;for(;x;x-=lowbit(x)) re+=tr[x];return re;
30 }
31 
32 int main(){
33     //freopen("","r",stdin);
34     int i,j,k;
35     N=rd();
36     for(i=1;i<=N;i++) a[i]=rd();
37     int num=0;
38     for(i=1;i<=N;i++){
39         num+=i-1-query(a[i]);
40         add(a[i],1);
41     }
42     printf("%d\n",4*(num/2)+(num&1));
43     return 0;
44 }

 

posted @ 2018-11-19 21:28  Ressed  阅读(194)  评论(0编辑  收藏  举报