第四题:http://acm.hdu.edu.cn/showproblem.php?pid=6312
无论数据多大先手必胜,直接输出“Yes”就行
第十题:http://acm.hdu.edu.cn/showproblem.php?pid=6318
求逆序对的个数cnt,cnt*min(x,y)即是结果
1 #include<bits/stdc++.h> 2 #include<cstdio> 3 using namespace std; 4 typedef long long ll; 5 ll a[100050],b[100050],cnt; 6 ll fun(ll l,ll mid,ll r) 7 { 8 if(l!=r) 9 { 10 cnt=fun(l,(l+mid)/2,mid)+fun(mid+1,(mid+r+1)/2,r); 11 } 12 else 13 { 14 return 0; 15 } 16 ll i=l,j=mid+1; 17 for(ll k=l; k<=r; k++) 18 { 19 if(j>r||(i<=mid&&a[i]<=a[j]))//特别注意这个地方是a[i]<=a[j] 20 { 21 b[k]=a[i++]; 22 } 23 else 24 { 25 b[k]=a[j++],cnt+=mid-i+1; 26 } 27 } 28 for(ll k=l; k<=r; k++) 29 { 30 a[k]=b[k]; 31 } 32 return cnt; 33 } 34 int main() 35 { 36 ll n,ans,x,y; 37 while(scanf("%lld%lld%lld",&n,&x,&y)!=EOF) 38 { 39 memset(b,0,sizeof(b)); 40 cnt=0; 41 for(ll i=1; i<=n; i++) scanf("%lld",&a[i]); 42 ans=fun(1,(1+n)/2,n); 43 // cout<<ans<<endl; 44 if(x>y) 45 { 46 printf("%lld ",(long long)ans*y); 47 } 48 else 49 { 50 printf("%lld ",(long long)ans*x); 51 } 52 } 53 return 0; 54 }