CF 414C Mashmokh and Reverse Operation(分治)
2014-04-07 12:18
316 查看
题意:给出2^n个数,有m组查询,每个查询把这些数没2^q分为一组,然后把每组进行翻转,求操作后的数组中的逆序对的个数。
思路:可以把所有数分成n层,利用归并排序,可以求出每层有多少个逆序对,还有有多少相等的数的对数。此时第n层的结果为答案。每次操作时,就是把小于等于n的所有层的值都改为总对数-原来逆序对数-相等的数的对数。对于大于n的层数,改变的只有小于n层的,因此依次更新上面的数。比赛时没写完,好忧伤。。。
代码:
思路:可以把所有数分成n层,利用归并排序,可以求出每层有多少个逆序对,还有有多少相等的数的对数。此时第n层的结果为答案。每次操作时,就是把小于等于n的所有层的值都改为总对数-原来逆序对数-相等的数的对数。对于大于n的层数,改变的只有小于n层的,因此依次更新上面的数。比赛时没写完,好忧伤。。。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<stack> #include<set> #include<cmath> #include<vector> #define inf 0x3f3f3f3f #define Inf 0x3FFFFFFFFFFFFFFFLL #define eps 1e-9 #define pi acos(-1.0) using namespace std; typedef long long ll; const int maxn=1<<21; ll num[maxn],tmp[maxn]; ll dp[22],dp2[22],eq[22]; ll MergeSort(int s,int t,int deep,ll &ev) { if(s==t) return ev=dp[deep]=0; ll sum=0,tot=0,tp; int m=(s+t)>>1; sum+=MergeSort(s,m,deep-1,tp); tot+=tp; sum+=MergeSort(m+1,t,deep-1,tp); tot+=tp; int i,k=m+1; for(i=s;i<=m;++i) { while(k<t&&num[i]>num[k]) k++; sum+=(k-(m+1))+(num[i]>num[k]?1:0); } k=m+1; int pre=k; for(i=s;i<=m;++i) { while(k<t&&num[i]>num[k]) pre=++k; while(k<t&&num[k+1]==num[pre]) k++; if(num[i]==num[k]) tot+=(k-pre+1); } i=0; int l=s,r=m+1; while(l<=m&&r<=t) { if(num[l]<num[r]) tmp[i++]=num[l++]; else tmp[i++]=num[r++]; } while(l<=m) tmp[i++]=num[l++]; while(r<=m) tmp[i++]=num[r++]; for(int j=0;j<i;++j) num[s+j]=tmp[j]; dp[deep]+=sum; eq[deep]+=tot; ev=tot; return sum; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); memset(dp,0,sizeof(dp)); memset(eq,0,sizeof(eq)); ll n,N; scanf("%I64d",&n); N=1<<n; for(int i=1;i<=N;++i) scanf("%I64d",&num[i]); MergeSort(1,N,n,eq ); ll m,d; ll tp; scanf("%I64d",&m); while(m--) { scanf("%I64d",&d); if(d!=0) { for(int i=1;i<=n;++i) dp2[i]=dp[i]; for(int i=1;i<=d;++i) { tp=(1<<i); dp[i]=tp*(tp-1)/2*(N/tp)-dp2[i]-eq[i]; } for(int i=d+1;i<=n;++i) { tp=dp2[i]-dp2[i-1]; dp[i]=dp[i-1]+tp; } } printf("%I64d\n",dp ); } return 0; }
相关文章推荐
- CF 321C Ciel the Commander(树的点分治)
- CF 321C(Ciel the Commander-点分治)
- CF 448C Painting Fence(分治)
- [DP决策单调性][分治] CF 868F. Yet Another Minimization Problem
- CF 716E. Digit Tree [点分治]
- Poj 1741&&CF 161D 点分治入门
- 【CF840D】Destiny 分治(线段树)
- CF:Problem 383D - Antimatter 分治DP
- CF 741D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [dsu on tree 类似点分治]
- CF 293 E Close Vertices (树的分治+树状数组)
- 树分治(点分治)CF 321C - Ciel the Commander
- CF 293 E Close Vertices (树的分治+树状数组)
- CF 293 E Close Vertices (树的分治+树状数组)
- CF 322E - Ciel the Commander 树的点分治
- CF 459C(Pashmak and Buses-分治)
- CF:Problem 383D - Antimatter 分治DP
- CF:Problem 426B - Sereja and Mirroring 二分或者分治
- 【CF】D. Arthur and Walls(BFS + 贪心)
- POJ-1741 Tree(树分治)
- [CF 249E]Endless Matrix解题报告