洛谷 1966 [NOIP2013] 火柴排队 逆序对
2017-10-25 16:57
369 查看
题目:
https://www.luogu.org/problem/show?pid=1966
思路:
先映射,再求逆序对;
https://www.luogu.org/problem/show?pid=1966
思路:
先映射,再求逆序对;
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> using namespace std; const int mod=99999997,MAXN=200001; int a[MAXN],r[MAXN]; int n,ans; int s2[MAXN],ma[MAXN]; map<int,int>mp; struct hh {int num,pos;}s1[MAXN]; bool cmp(hh a,hh b) { return a.num<b.num; } void merge_sort(int f,int t) { if(f==t) return; int mid=(f+t)>>1; merge_sort(f,mid),merge_sort(mid+1,t); int i=f,j=mid+1,k=f; while(i<=mid && j<=t) { if(a[i]>a[j]) ans=(ans+mid-i+1)%mod,r[k++]=a[j++]; else r[k++]=a[i++]; } while(i<=mid) r[k++]=a[i++]; while(j<=t) r[k++]=a[j++]; for(int i=f;i<=t;i++) a[i]=r[i]; return; } void solve() { cin>>n; for(int i=1;i<=n;i++) scanf("%d",&s1[i].num),s1[i].pos=i; for(int i=1;i<=n;i++) scanf("%d",&s2[i]),a[i]=s2[i]; sort(s1+1,s1+n+1,cmp); sort(s2+1,s2+n+1); for(int i=1;i<=n;i++) mp[s2[i]]=s1[i].pos; for(int i=1;i<=n;i++) a[i]=mp[a[i]]; merge_sort(1,n); cout<<ans%mod; return; } int main() { solve(); return 0; }
相关文章推荐
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
- wikioi3286 noip2013 火柴排队 归并求逆序对
- NOIP 2013 火柴排队 (证明+乱搞之后的逆序对)
- NOIP 2013 火柴排队 排序不等式 逆序对
- NOIP 2013 T2 火柴排队 ---->求逆序对
- 归并排序求逆序对 CODEVS 1688 && NOIP 2013 火柴排队
- [NOIP 2013]火柴排队 逆序对
- NOIP 2013 T2 火柴排队 ---->求逆序对
- NOIP2013提高组 火柴排队 (分治逆序对)
- NOIP2013 火柴排队 解题报告(贪心+逆序对)
- NOIP 2013 提高组 Day1 T2 火柴排队【逆序对】
- NOIP2013提高组 火柴排队 (逆序对+特殊映射)
- 【noip2013提高组】火柴排队 树状数组+逆序对
- Noip提高2013 Day1 T2 火柴排队 归并求逆序对
- NOIP2013火柴排队[逆序对]
- NOIP2013提高组 B.火柴排队 (逆序对)
- Noip2013 Day1 T2 火柴排队(归并排序/树状数组 求逆序对)
- NOIp2013 火柴排队【逆序对/思维】 By cellur925
- 【NOIP2013】火柴排队(逆序对)
- [NOIP2013] 火柴排队 离散化 树状数组 逆序对