杭电多校训练第二场

第四题: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\n",(long long)ans*y);
47         }
48         else
49         {
50             printf("%lld\n",(long long)ans*x);
51         }
52     }
53     return 0;
54 }
View Code

 

posted @ 2018-07-27 09:23  Scott_Wong  阅读(137)  评论(0)    收藏  举报