NOIP2013 火柴排队
2015-06-13 21:57
323 查看
题目:http://www.luogu.org/problem/show?pid=1966#
分析:a中第几大一定对应b中第几大。ab同时移动相当于a移动,相对位置不变。所以,用c[i]表示a[i]需要移动到的 位置,求其中的逆序对。因为一个每移动相邻两个元素相当于消除一个逆序对。
代码:
分析:a中第几大一定对应b中第几大。ab同时移动相当于a移动,相对位置不变。所以,用c[i]表示a[i]需要移动到的 位置,求其中的逆序对。因为一个每移动相邻两个元素相当于消除一个逆序对。
代码:
#include <cstdio> #include <algorithm> using namespace std; const int Tmax=100005,MOD=99999997; struct node{ int data,p; bool operator <(const node &rhs)const { return data<rhs.data; } }; node a[Tmax],b[Tmax]; int n,c[Tmax],tmp[Tmax]; long long int ans; void gbsort(int l,int r) { if(l>=r) return; int mid=l+(r-l)/2,xl=l,xr=mid+1,len=0; gbsort(l,mid); gbsort(mid+1,r); while(xl<=mid&&xr<=r) { if(c[xl]<c[xr]) tmp[++len]=c[xl++]; else if(c[xl]>c[xr]){ ans=(ans-xl+mid+1)%MOD; tmp[++len]=c[xr++]; } } while(xl<=mid) tmp[++len]=c[xl++]; while(xr<=r) tmp[++len]=c[xr++]; for(mid=1;mid<=len;mid++) c[l+mid-1]=tmp[mid]; return; } int main() { int i; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i].data); a[i].p=i; } sort(a+1,a+1+n); for(i=1;i<=n;i++) { scanf("%d",&b[i].data); b[i].p=i; } sort(b+1,b+1+n); for(i=1;i<=n;i++) c[a[i].p]=b[i].p; gbsort(1,n); printf("%lld",ans); return 0; }
相关文章推荐
- 线段树模板题
- Cpp Primer<<学习IO标准库--文件模式、字符串流_7
- 冯诺依曼体系结构与哈弗体系结构的区别
- echo1(Pwnable.kr)
- LeetCode之“动态规划”:Unique Binary Search Trees && Unique Binary Search Trees II
- ol3简介
- zsh的简单使用
- 第51章、绘制简单图形(从零开始学Android)
- PCA ICA
- 在使用ActionBarActivity和AppCompatActivity时,对应的android v7包的版本
- [bzoj 3626] LNOI2014 LCA
- nodejs中express安装失败解决方法
- 模拟 hdu5268 ZYB loves Score
- NoClassDefDoundErr与ClassNotFoundException区别
- 总结过去10年的程序员生涯
- 一、Linux 学习注意事项
- NOIP2013 转圈游戏
- 学习七十一雾央MFC游戏心得,初体验(三)
- ThinkPHP添加模板时,犯的三个错
- 吉哥系列故事――临时工计划